Как правильно выбрать данные в 1С по списку интервалов дат с помощью таблицы значений?

Программист 1С v8.3 (Управляемые формы) 1С:Розница Управленческий учет Торговля и дистрибуция
← На главную

При разработке механизмов обмена или отчетов часто возникает задача: выбрать документы, которые попадают в несколько различных временных диапазонов. Начинающие разработчики нередко совершают ошибку, запуская Запрос.Выполнить() внутри цикла, перебирая каждую строку таблицы значений. Давайте разберем, почему это решение является нерациональным и как реализовать профессиональный подход с использованием механизмов временных таблиц платформы 1С.

Почему не стоит использовать запросы в цикле?

Выполнение запроса в цикле — это одна из наиболее частых причин медленной работы конфигураций 1С. При каждом проходе цикла платформа вынуждена обращаться к СУБД, создавать новую транзакцию, инициализировать контекст запроса и передавать его на исполнение. Если у вас 100 смен, вы совершите 100 обращений к базе данных вместо одного. Это не только перегружает сервер, но и исключает возможность оптимизации плана запроса со стороны СУБД.

Решение через временные таблицы и соединение

Профессиональный подход заключается в передаче всей таблицы значений в запрос как параметра и последующем выполнении соединения (JOIN). Это превращает задачу в один запрос к серверу базы данных.

Пошаговое руководство по реализации

  1. Подготовка таблицы значений: Убедитесь, что ваша таблица значений в коде 1С имеет колонки с правильными типами данных. Для дат обязательно укажите тип Дата, иначе при передаче в запрос система может некорректно сравнить их с полями базы данных.
  2. Передача в запрос: Используйте метод Запрос.УстановитьПараметр() для передачи всей таблицы значений целиком.
  3. Формирование текста запроса: Используйте конструкцию ПОМЕСТИТЬ для создания временной таблицы, а затем выполните ВНУТРЕННЕЕ СОЕДИНЕНИЕ с нужным вам объектом (в данном случае — Документ.ЧекККМ).

Рассмотрим пример того, как это выглядит на языке запросов 1С:


ВЫБРАТЬ
    Интервалы.НачДата КАК НачДата,
    Интервалы.КонДата КАК КонДата
ПОМЕСТИТЬ втИнтервалы
ИЗ
    &ТаблицаИнтервалов КАК Интервалы
;

ВЫБРАТЬ
    ЧекККМ.Ссылка,
    ЧекККМ.Дата,
    ЧекККМ.НомерЧекаККМ
ИЗ
    Документ.ЧекККМ КАК ЧекККМ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ втИнтервалы КАК Интервалы
    ПО ЧекККМ.Дата >= Интервалы.НачДата
    И ЧекККМ.Дата <= Интервалы.КонДата

Почему этот способ лучше?

Использование ВНУТРЕННЕЕ СОЕДИНЕНИЕ по полям дат позволяет оптимизатору запросов SQL максимально эффективно использовать индексы, построенные по полю Дата в таблице документов. В отличие от использования функции НачалоПериода() в секции ГДЕ, которая «заставляет» систему сканировать всю таблицу (Full Table Scan), соединение напрямую обращается к нужным диапазонам.

Важные рекомендации при работе с запросами

При проектировании подобных механизмов всегда обращайте внимание на следующие аспекты:

Рассмотренный метод позволяет вам писать код, который будет работать быстро и стабильно даже при значительном росте объема данных в вашей информационной базе. Используйте временные таблицы как основной инструмент для работы со списками данных, полученных в процессе выполнения бизнес-логики.

← На главную