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