Как получить остатки по счетам из регистра бухгалтерии на несколько произвольных дат без запросов в цикле?

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

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

Использование возможностей СКД (Система компоновки данных)

Самый эффективный «некодовый» способ решения задачи — это использование СКД. Вместо того чтобы писать цикл, мы создаем отчет с двумя наборами данных:

  1. Первый набор данных содержит список ваших документов и дат.
  2. Второй набор данных — это виртуальная таблица Остатки регистра бухгалтерии.

Связывание наборов данных в СКД происходит через механизм Связи наборов данных. Мы передаем поле даты из первого набора в качестве параметра Период для виртуальной таблицы Остатки. Система автоматически оптимизирует этот процесс, выполняя работу значительно быстрее, чем любая ручная итерация.

Применение пакетных запросов и временных таблиц

Если задача требует программного формирования данных, лучшим решением станет использование пакетных запросов с применением Менеджера временных таблиц. Это позволяет избежать выполнения запроса в цикле и переложить всю нагрузку на сервер баз данных.

Разберем логику такого подхода:

  1. Помещаем массив дат в Временную таблицу с помощью запроса.
  2. Соединяем эту таблицу с физической таблицей движений регистра бухгалтерии.
  3. Используем агрегатные функции, такие как СУММА(ВЫБОР...), чтобы вычислить остатки на каждую дату, суммируя все движения, произошедшие «до» или «на» конкретную дату.

Такой подход работает по принципу «один запрос — один результат», что критически важно для производительности в высоконагруженных системах.


ВЫБРАТЬ
    ТаблицаДат.Период КАК ДатаДок,
    Рег.Счет,
    СУММА(Рег.СуммаОборот) КАК Остаток
ПОМЕСТИТЬ ВремДаты
ИЗ ТаблицаДат КАК ТаблицаДат;

ВЫБРАТЬ
    ВремДаты.ДатаДок,
    ВремДаты.Счет,
    СУММА(Рег.СуммаНачальныйОстаток + Рег.СуммаОборот) КАК Остаток
ИЗ ВремДаты КАК ВремДаты
ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Основной.ОстаткиИОбороты(,,День,,) КАК Рег
ПО ВремДаты.ДатаДок >= Рег.Период
ГРУППИРОВАТЬ ПО ВремДаты.ДатаДок, ВремДаты.Счет;

Почему отчет может работать медленно и как это исправить?

Если после внедрения данных решений отчет все еще выводится долго, проанализируем возможные узкие места:

Таким образом, мы видим, что отказ от циклов в пользу встроенных механизмов платформы 1С:Предприятие (СКД или пакетные запросы) — это не просто «лучшая практика», а необходимый стандарт разработки для обеспечения высокой скорости работы ваших отчетов.

← На главную