Гайд 1С: Оптимизация построения отчетов на СКД (Система компоновки данных)
- Формирование отчета на СКД блокирует таблицы СУБД или длится более нескольких минут.
- СКД генерирует монструозные SQL-запросы с десятками левых соединений (LEFT JOIN) и подзапросов.
- Потребление десятков гигабайт памяти процессом
rphostво время компоновки результата. - Падение производительности сервера при одновременном запуске отчетов несколькими пользователями.
1. Отключение автозаполнения и явный контроль полей
Флаг Автозаполнение в схеме СКД заставляет платформу включать в текст итогового SQL-запроса все возможные таблицы и поля, даже если они не выбраны пользователем в настройках отчета.
- Отключите автозаполнение на вкладке «Наборы данных» и явно укажите разрешенные поля выборки, отборов и сортировок.
2. Оптимизация соединений наборов данных
Соединение наборов данных на уровне схемы СКД выполняется в оперативной памяти сервера 1С (в процессе rphost), а не на стороне СУБД.
// НЕПРАВИЛЬНО: Соединять набор данных 'Запрос1' и 'Запрос2' через вкладку 'Связи наборов данных'
// ПРАВИЛЬНО: Объединять таблицы внутри одного текста SQL-запроса через JOIN или временные таблицы3. Использование параметров виртуальных таблиц
Все условия отборов по периодам и измерениям должны передаваться напрямую в параметры виртуальных таблиц, а не в блок ГДЕ:
// ПРАВИЛЬНО в тексте запроса СКД:
ВЫБРАТЬ
ПродажиОбороты.Номенклатура КАК Номенклатура,
ПродажиОбороты.КоличествоОборот КАК Количество
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Авто, {(Номенклатура).* КАК Номенклатура}) КАК ПродажиОбороты Частые вопросы (FAQ)
Почему соединение наборов данных в СКД вызывает утечку памяти?
При связи двух наборов данных СКД считывает первый набор целиком, затем для каждой его строки выполняет итерационный поиск или дополнительный запрос во второй набор, создавая квадратичную сложность O(N*M) в оперативной памяти rphost.
Что такое синтаксис фигурных скобок {} в запросах СКД?
Это синтаксис расширения языка запросов для СКД. Конструкции внутри фигурных скобок (например, {(Контрагент).*}) включаются в результирующий SQL-запрос только тогда, когда пользователь реально задействовал это поле в отборе или группировке.
Как включить фоновое формирование отчетов без блокировки интерфейса?
В свойствах формы отчета или процедурах инициализации установите свойство 'РежимИсполнения' в значение 'Фоновый', что позволит строить отчет в отдельном фоновом задании.
Как увидеть реальный SQL-запрос, который СКД отправляет в СУБД?
Используйте встроенную обработку 'Консоль компоновки данных' или настройте сбор технологического журнала 1С с событиями SDBL и DBV8DBEng с фильтром по контексту отчета.