#std436

Многократное выполнение однотипных запросов

1.

Старайтесь получать однотипные данные одним запросом, а не серией запросов в цикле.

Это ускоряет работу с базой данных. Для объединения используйте, например, условие В, ОБЪЕДИНИТЬ ВСЕ или пакет запросов.

Неправильно

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

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

Правильно

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

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

Если используется БСП, вызывайте интерфейсы для работы со списками объектов: ОбщегоНазначения.ЗначениеРеквизитаОбъектов() вместо ЗначениеРеквизитаОбъекта() в цикле, УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов() вместо КонтактнаяИнформацияОбъекта() в цикле.

2.

Допускается разделение запроса на серию запросов в следующих случаях:

  • заметно усложняется разработка запроса, который выбирает сразу все однотипные данные;
  • ухудшается производительность запроса. Например, когда есть обращения к виртуальным таблицам, формируемым на определенную дату (остатки регистра накопления, срез последних периодического регистра сведений и т.п.);
  • нужна порционная обработка большого объема данных: в обработчиках обновления, при групповом проведении или изменении данных, удалении помеченных объектов, контроле ведения учета, загрузке данных из файла или внешних источников, получении почты.

В этих случаях запросы в цикле:

  • необходимы для порционности;
  • либо незначительно замедляют обработку по сравнению с записью данных;
  • либо неустранимы на текущих средствах платформы (например, чтение и запись наборов регистра в цикле по значениям измерения).
3.

Запросы к разным таблицам тоже рекомендуется объединять в один с помощью ОБЪЕДИНИТЬ ВСЕ или пакета запросов.

При этом выигрыш по времени выполнения может быть незначительным.

Источник

https://its.1c.ru/db/v8std#content:436