При разработке отчетов или обработок, работающих с данными регистра бухгалтерии, часто возникает задача получения информации о счетах дебета и конкретных значениях субконто. В больших базах данных стандартные запросы могут работать медленно, особенно если используется классическое соединение нескольких таблиц. В этом материале мы разберем, как максимально эффективно извлекать данные из регистра Хозрасчетный с учетом последних изменений в платформе.
Долгое время основным «бутылочным горлышком» при работе с регистром бухгалтерии было использование виртуальной таблицы ДвиженияССубконто. В старых версиях платформы она собиралась «на лету» путем выполнения сложных соединений в СУБД, что требовало значительных ресурсов. Однако, начиная с релиза платформы 8.3.15, разработчики 1С радикально изменили архитектуру хранения данных для этой таблицы.
Теперь, при использовании режима совместимости 8.3.15 и выше, ДвиженияССубконто является реальной физической таблицей в базе данных. Данные субконто денормализованы и хранятся непосредственно в основной таблице движений регистра. Это означает, что обращения к ней стали выполняться на порядки быстрее, так как платформа обращается к уже готовым проиндексированным полям, минуя тяжелые операции соединения.
Чтобы добиться максимальной производительности, разберем по шагам правильное построение запроса. Если ваша база работает на актуальной версии платформы (совместимость 8.3.15+), используйте структуру с ДвиженияССубконто, накладывая жесткие отборы.
Рассмотрим пример оптимизированного кода запроса:
ВЫБРАТЬ
РБ.СчетДт,
РБ.СубконтоДт1
ИЗ
РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(
,
,
Регистратор = &Регистратор
И СчетДт В (ВЫБРАТЬ ВТ_Счета.Счет ИЗ ВТ_Счета КАК ВТ_Счета)
И ВидСубконтоДт1 = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура)
И (Субконто1 ССЫЛКА Документ.ПоступлениеТоваровУслуг ИЛИ Субконто1 ССЫЛКА Документ.ОприходованиеТоваров)
) КАК РБ
ВТ_Счета позволяет серверу базы данных построить гораздо более эффективный план запроса. В отличие от передачи длинного списка через параметр, временная таблица индексируется, что позволяет СУБД выполнять Inner Join или Exist максимально быстро.WHERE, где задействованы индексы, построенные по Регистратору и счетам.Субконто вручную, но мы настоятельно рекомендуем переходить на новые механизмы платформы для достижения высокой скорости.Чтобы ваш запрос работал стабильно быстро при любом объеме данных, следуйте этим советам:
Регистратору или Периоду. Чем меньше записей попадет под первичное сканирование, тем быстрее отработает запрос.ГДЕ, входили в состав индексов регистра. Если вы делаете отбор только по значению субконто без учета счета, СУБД может выбрать Full Table Scan, что крайне негативно скажется на производительности.Table Scan вместо Index Seek, значит, в условиях запроса не хватает ключевых полей для использования индекса.Применяя данные подходы, вы сможете добиться существенного прироста скорости обработки бухгалтерских данных. Главное — это перенос логики фильтрации непосредственно в параметры виртуальной таблицы и использование временных таблиц для передачи больших списков значений.