При разработке механизмов обмена или отчетов часто возникает задача: выбрать документы, которые попадают в несколько различных временных диапазонов. Начинающие разработчики нередко совершают ошибку, запуская Запрос.Выполнить() внутри цикла, перебирая каждую строку таблицы значений. Давайте разберем, почему это решение является нерациональным и как реализовать профессиональный подход с использованием механизмов временных таблиц платформы 1С.
Выполнение запроса в цикле — это одна из наиболее частых причин медленной работы конфигураций 1С. При каждом проходе цикла платформа вынуждена обращаться к СУБД, создавать новую транзакцию, инициализировать контекст запроса и передавать его на исполнение. Если у вас 100 смен, вы совершите 100 обращений к базе данных вместо одного. Это не только перегружает сервер, но и исключает возможность оптимизации плана запроса со стороны СУБД.
Профессиональный подход заключается в передаче всей таблицы значений в запрос как параметра и последующем выполнении соединения (JOIN). Это превращает задачу в один запрос к серверу базы данных.
Дата, иначе при передаче в запрос система может некорректно сравнить их с полями базы данных.Запрос.УстановитьПараметр() для передачи всей таблицы значений целиком.ПОМЕСТИТЬ для создания временной таблицы, а затем выполните ВНУТРЕННЕЕ СОЕДИНЕНИЕ с нужным вам объектом (в данном случае — Документ.ЧекККМ).Рассмотрим пример того, как это выглядит на языке запросов 1С:
ВЫБРАТЬ
Интервалы.НачДата КАК НачДата,
Интервалы.КонДата КАК КонДата
ПОМЕСТИТЬ втИнтервалы
ИЗ
&ТаблицаИнтервалов КАК Интервалы
;
ВЫБРАТЬ
ЧекККМ.Ссылка,
ЧекККМ.Дата,
ЧекККМ.НомерЧекаККМ
ИЗ
Документ.ЧекККМ КАК ЧекККМ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ втИнтервалы КАК Интервалы
ПО ЧекККМ.Дата >= Интервалы.НачДата
И ЧекККМ.Дата <= Интервалы.КонДата
Использование ВНУТРЕННЕЕ СОЕДИНЕНИЕ по полям дат позволяет оптимизатору запросов SQL максимально эффективно использовать индексы, построенные по полю Дата в таблице документов. В отличие от использования функции НачалоПериода() в секции ГДЕ, которая «заставляет» систему сканировать всю таблицу (Full Table Scan), соединение напрямую обращается к нужным диапазонам.
При проектировании подобных механизмов всегда обращайте внимание на следующие аспекты:
КассаККМ в условие соединения. Это предотвратит попадание «лишних» чеков в выборку, если они были пробиты в тот же интервал времени, но на другом устройстве.Рассмотренный метод позволяет вам писать код, который будет работать быстро и стабильно даже при значительном росте объема данных в вашей информационной базе. Используйте временные таблицы как основной инструмент для работы со списками данных, полученных в процессе выполнения бизнес-логики.