Как найти и посмотреть текст запроса в типовом отчете СКД

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

При доработке или исследовании типовых отчетов в конфигурациях 1С часто возникает ситуация, когда разработчику требуется изучить исходный или итоговый текст запроса. Однако, открыв основную схему компоновки данных (СКД), можно обнаружить, что привычный набор данных типа Запрос пуст либо отсутствует вовсе, а в коде модуля отладчик показывает инициализацию процессора компоновки без явных текстов запросов. Разберем по шагам, почему так происходит, где скрыты запросы и как извлечь результирующий SQL/1С-запрос.

Причина отсутствия запроса в корневой схеме: вложенные схемы СКД

В типовых конфигурациях (например, «Управление торговлей», ERP, «Комплексная автоматизация») сложные отчеты строятся по модульному принципу. Вместо одного большого монолитного набора данных разработчики платформенных механизмов применяют наборы данных типа Набор данных - схема-источник (вложенные схемы).

В этом случае структура отчета выглядит следующим образом:

  1. В основной схеме компоновки данных создается набор данных, ссылающийся на отдельную вложенную схему.
  2. Связь параметров основной схемы с параметрами вложенной схемы настраивается на специальной вкладке связей.
  3. Текст самого запроса хранится внутри макета этой вложенной схемы.

Чтобы открыть и посмотреть текст запроса в конфигураторе:

  1. Откроем основную схему компоновки данных отчета.
  2. Перейдем на вкладку Наборы данных.
  3. Найдем элемент с типом Схема-источник или развернем дерево вложенных наборов.
  4. Двойным кликом перейдем во вложенную схему компоновки данных — внутри нее будет располагаться искомый Набор данных - запрос со всем текстом выборки и временными таблицами.

Программное извлечение итогового текста запроса через отладчик

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

Рассмотрим пример кода в модуле отчета или внешней обработке:


КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);

Для Каждого НаборДанных Из МакетКомпоновки.НаборыДанных Цикл
    Если ТипЗнч(НаборДанных) = Тип("НаборДанныхЗапросМакетаКомпоновкиДанных") Тогда
        ТекстИтоговогоЗапроса = НаборДанных.Запрос;
        Сообщить(ТекстИтоговогоЗапроса);
    КонецЕсли;
КонецЦикла;

При генерации макета компоновщик обрабатывает в том числе и вложенные схемы, поэтому в коллекции МакетКомпоновки.НаборыДанных появятся объекты с типом НаборДанныхЗапросМакетаКомпоновкиДанных для каждого источника. Значение свойства Запрос покажет финальный код выборки данных.

Переопределение логики отчета при компоновке результата

Если требуется перехватить или изменить поведение типового отчета, не ломая общую структуру БСП, используем обработчик ПриКомпоновкеРезультата в модуле объекта отчета.

Разберем типовой алгоритм переопределения:


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

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

← На главную