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

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

При разработке отчетов или обработок, работающих с данными регистра бухгалтерии, часто возникает задача получения информации о счетах дебета и конкретных значениях субконто. В больших базах данных стандартные запросы могут работать медленно, особенно если используется классическое соединение нескольких таблиц. В этом материале мы разберем, как максимально эффективно извлекать данные из регистра Хозрасчетный с учетом последних изменений в платформе.

Понимание работы виртуальной таблицы ДвиженияССубконто

Долгое время основным «бутылочным горлышком» при работе с регистром бухгалтерии было использование виртуальной таблицы ДвиженияССубконто. В старых версиях платформы она собиралась «на лету» путем выполнения сложных соединений в СУБД, что требовало значительных ресурсов. Однако, начиная с релиза платформы 8.3.15, разработчики 1С радикально изменили архитектуру хранения данных для этой таблицы.

Теперь, при использовании режима совместимости 8.3.15 и выше, ДвиженияССубконто является реальной физической таблицей в базе данных. Данные субконто денормализованы и хранятся непосредственно в основной таблице движений регистра. Это означает, что обращения к ней стали выполняться на порядки быстрее, так как платформа обращается к уже готовым проиндексированным полям, минуя тяжелые операции соединения.

Рекомендуемый подход к написанию запроса

Чтобы добиться максимальной производительности, разберем по шагам правильное построение запроса. Если ваша база работает на актуальной версии платформы (совместимость 8.3.15+), используйте структуру с ДвиженияССубконто, накладывая жесткие отборы.

Рассмотрим пример оптимизированного кода запроса:


ВЫБРАТЬ
    РБ.СчетДт,
    РБ.СубконтоДт1
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(
        ,
        ,
        Регистратор = &Регистратор
            И СчетДт В (ВЫБРАТЬ ВТ_Счета.Счет ИЗ ВТ_Счета КАК ВТ_Счета)
            И ВидСубконтоДт1 = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура)
            И (Субконто1 ССЫЛКА Документ.ПоступлениеТоваровУслуг ИЛИ Субконто1 ССЫЛКА Документ.ОприходованиеТоваров)
    ) КАК РБ

Почему это работает быстрее?

  1. Использование временных таблиц (ВТ): Как показано в примере, передача списка счетов через ВТ_Счета позволяет серверу базы данных построить гораздо более эффективный план запроса. В отличие от передачи длинного списка через параметр, временная таблица индексируется, что позволяет СУБД выполнять Inner Join или Exist максимально быстро.
  2. Минимизация сканирования: Благодаря тому, что поля субконто теперь физические, запрос превращается в простую выборку по условию WHERE, где задействованы индексы, построенные по Регистратору и счетам.
  3. Режим совместимости: Если вы работаете в старой конфигурации (ниже режима 8.3.15), описанный выше метод будет работать медленнее. В таком случае альтернативным (и иногда более быстрым) вариантом является соединение основной таблицы регистра и таблицы Субконто вручную, но мы настоятельно рекомендуем переходить на новые механизмы платформы для достижения высокой скорости.

Рекомендации по оптимизации

Чтобы ваш запрос работал стабильно быстро при любом объеме данных, следуйте этим советам:

Применяя данные подходы, вы сможете добиться существенного прироста скорости обработки бухгалтерских данных. Главное — это перенос логики фильтрации непосредственно в параметры виртуальной таблицы и использование временных таблиц для передачи больших списков значений.

← На главную