Перейти к содержанию

Использование запросов внутри циклов

Рекомендуется получать все необходимые однотипные данные одним запросом вместо выполнения серии запросов.

Правильно:

// БанкиДляОбработки - содержит массив банков, счета в которых необходимо обработать

ОбщийЗапрос = Новый Запрос("
  |ВЫБРАТЬ
  | БанковскиеСчета.Ссылка КАК Счет
  |ИЗ
  | Справочник.БанковскиеСчета КАК БанковскиеСчета
  |ГДЕ
  | БанковскиеСчета.Банк В(&БанкиДляОбработки)");

ОбщийЗапрос.УстановитьПараметр("БанкиДляОбработки", БанкиДляОбработки);
ВыборкаСчетов = ОбщийЗапрос.Выполнить().Выбрать();
Пока ВыборкаСчетов.Следующий() Цикл
  ОбработатьСчетаВБанке(ВыборкаСчетов.Счет);
КонецЦикла;

Неправильно:

// БанкиДляОбработки - содержит массив банков, счета в которых необходимо обработать

ЧастныйЗапрос = Новый Запрос("
  |ВЫБРАТЬ
  | БанковскиеСчета.Ссылка КАК Счет
  |ИЗ
  | Справочник.БанковскиеСчета КАК БанковскиеСчета
  |ГДЕ
  | БанковскиеСчета.Банк = &Банк");

Для каждого Банк Из БанкиДляОбработки Цикл
  ЧастныйЗапрос.УстановитьПараметр("Банк", Банк);
  ВыборкаСчетов = ЧастныйЗапрос.Выполнить().Выбрать();
  Пока ВыборкаСчетов.Следующий() Цикл
    ОбработатьСчетаВБанке(ВыборкаСчетов.Счет);
  КонецЦикла;
КонецЦикла;

См также: + Многократное выполнение однотипных запросов - стандарт 1С + п. "Не использовать запросы в цикле" главы "Язык запросов 1С" из книги Язык запросов «1С:Предприятия 8»

Экранирование кода

// sonar:UseQueryInALoop:off
// sonar:UseQueryInALoop:on