В СКД существует несколько распространенных типов ошибок: часть из них легко найти и диагностировать, часть – это особенности работы СКД, которые не очевидны.
В статье описываю базовый алгоритм, с которого удобно начинать системную диагностику.
Ниже – базовый алгоритм, с которого удобно начинать системную диагностику: сначала измеряем этапы выполнения СКД, затем методом исключения находим проблемные места и оптимизируем их.
Немного теории: из каких этапов состоит выполнение СКД
Выполнение СКД делится на 3 основных этапа, в которых и можно найти ошибки.
1. Получение макета
На этом этапе формируется итоговый текст запроса или запросов, если используется набор данных «Запрос».
Итоговый запрос часто сильно отличается от запроса в самой схеме СКД. Это зависит от:
- настроек СКД: параметров, структуры вывода;
- ролей полей в СКД;
- программной модификации схемы СКД и/или запроса в типовых конфигурациях.
2. Работа процессора компоновки
На этом этапе можно передать набор данных «Объект». Он может стать источником проблем из-за двух типичных ошибок:
- передается слишком большой объем данных;
- в набор данных «Объект» передаются ссылки без представлений.
3. Работа вывода
На этапе вывода чаще всего возникают следующие проблемы:
- вычисление выражений СКД и/или вызов функций общих модулей;
- большое количество строк для вывода;
- в наборе данных «Объект» используются ссылки, но не используются представления ссылок.
Правильный подход – измерить все этапы выполнения СКД, найти проблемные места методом исключения и уже после этого оптимизировать их.
Этот алгоритм – основа системной работы с СКД. Но на практике бывают разные ситуации и контексты, а многие аспекты требуют отдельного внимания. На курсе «Углубленное изучение СКД в 1С» я по шагам разбираю не только поиск ошибок, но и доработку типовых отчетов под ERP и УХ, программное управление схемами, вложенные схемы и работу СКД за пределами отчетов.
Как замерить этапы выполнения СКД
Замерить этапы выполнения СКД можно в событии ПриКомпоновкеРезультата с директивой &После в расширении:
&После("ПриКомпоновкеРезультата")
Процедура ЭД8_ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ДатаСтарта = ТекущаяУниверсальнаяДатаВМиллисекундах();
КМКД = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КМКД.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
ДатаКомпоновкиМакета = ТекущаяУниверсальнаяДатаВМиллисекундах();
//НО Объект
ПКД = Новый ПроцессорКомпоновкиДанных;
ПКД.Инициализировать(Макет,,ДанныеРасшифровки);
ДатаПроцессораКомпоновки = ТекущаяУниверсальнаяДатаВМиллисекундах();
//Выбираются данные, рассчитываются данные, связи наборов данных, выводятся данные
ПВКД = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПВКД.УстановитьДокумент(ДокументРезультат);
ПВКД.Вывести(ПКД);
ДатаВывода = ТекущаяУниверсальнаяДатаВМиллисекундах();
Сообщить("Дата передачи объекта: " + ((ДатаПроцессораКомпоновки - ДатаКомпоновкиМакета)/1000));
Сообщить("Дата рассчета данных: " + ((ДатаВывода - ДатаПроцессораКомпоновки)/1000));
КонецПроцедуры
После замеров можно двигаться по схеме диагностики:

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

Если нужно копнуть глубже, можно получить запрос к СУБД и проанализировать уже его.

Подключаем нейросети для анализа.


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


В такой ситуации связь нужно ограничивать параметром.

Отладка набора данных «Объект»
На этом этапе смотрим на размер передаваемых данных и стараемся его ограничить.

Если используется набор данных «Объект» и много времени уходит на этап вывода, проверяем, что все ссылочные типы имеют ПредставлениеСсылки.

Отладка вычислений выражений
Чтобы проверить влияние вычисляемых полей, можно временно исключить их из отчета. Если после этого отчет выполняется быстрее, значит, часть проблемы связана с вычислениями.

Также можно посчитать, сколько раз выполняются вычисления. Для этого вызов можно обернуть в общий модуль.

Есть важная особенность: поле может рассчитываться дважды – один раз для вывода значения и второй раз для расшифровки. Если убрать ДанныеРасшифровки из программного формирования, можно сократить время выполнения СКД.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
ДатаСтарта = ТекущаяУниверсальнаяДатаВМиллисекундах();
КМКД = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КМКД.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(),);
ДатаКомпоновкиМакета = ТекущаяУниверсальнаяДатаВМиллисекундах();
ПКД = Новый ПроцессорКомпоновкиДанных;
ПКД.Инициализировать(Макет,,,Истина);
ДатаПроцессораКомпоновки = ТекущаяУниверсальнаяДатаВМиллисекундах();
ПВКД = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПВКД.УстановитьДокумент(ДокументРезультат);
ПВКД.Вывести(ПКД);
КонецПроцедуры


Отладка вывода
На этапе вывода возможна проблема при использовании набора данных «Объект»: для каждого ссылочного поля будет выполняться подзапрос на получение представления ссылки. Это нужно исправлять на уровне набора данных «Объект».

Еще одна частая причина замедления – слишком большое количество строк для вывода. В этом случае нужно проанализировать, зачем в отчете столько строк и можно ли сократить их количество.

Как закрепить навык
Прочитать алгоритм и применить его на реальных проектах, разные вещи. Навык закрепляется только через практику с обратной связью, поэтому я построил курс «Углубленное изучение СКД в 1С: профессиональная разработка и доработка отчетов для ERP и УХ» именно так. 80% времени в курсе я отвожу на практику на реальных кейсах и домашние задания с развернутой обратной связью, а вопросы разбираю в чате с группой.
Я приглашаю на курс тех, кто хочет увереннее работать со сложными отчетами в типовых конфигурациях, стандартизировать отчетность и закладывать архитектуру, которую легко поддерживать.
Вступайте в нашу телеграмм-группу Инфостарт