К статье
Практический материал

Отчеты и Аналитика · 12 мин

Как получить итоговый запрос СКД в 1С

Способы получить итоговый текст запроса СКД в 1С: макет компоновки, консоль СКД, программные методы. Примеры кода, типичные ошибки и FAQ.

Итоговый запрос СКД — это текст запроса, который система компоновки данных формирует после применения всех настроек: отборов, выбранных полей, группировок, параметров и вычисляемых выражений. Он отличается от исходного запроса набора данных, который разработчик видит в конструкторе: СКД «оборачивает» базовый запрос дополнительными конструкциями, отсекает неиспользуемые поля и подставляет реальные значения параметров.

Задача получить этот запрос возникает в трёх типовых ситуациях: отладка отчёта, когда результат не совпадает с ожиданиями; оптимизация, когда нужно понять, какой SQL в итоге уходит на сервер СУБД; перенос логики, когда запрос из СКД требуется использовать в другом механизме — например, в динамическом списке или фоновом задании.

Прямой встроенной кнопки «показать итоговый запрос» в типовом конфигураторе нет, поэтому применяют несколько обходных, но надёжных способов: анализ макета компоновки данных, специализированные консоли СКД, программные методы платформы и технологический журнал. Ниже разобраны все рабочие варианты с примерами кода.

Чем итоговый запрос отличается от запроса набора данных

Запрос набора данных — это тот текст, который вы пишете в конструкторе СКД на закладке «Набор данных». Он статичен и не учитывает пользовательские настройки. Итоговый запрос формируется динамически в момент выполнения отчёта и зависит от того, какие поля выведены в отчёт, какие отборы включены и какие значения параметров заданы.

Например, если в базовом запросе выбрано десять полей, а в настройках отчёта используется три, СКД построит запрос только с нужными полями. Если включён отбор по организации, в итоговый запрос добавится секция ГДЕ с условием. Если отчёт выводится с группировкой, итоговый запрос будет обёрнут агрегированием.

Это принципиально для отладки: запуск базового запроса в консоли запросов почти никогда не воспроизводит реальную проблему отчёта, потому что выполняется другой текст с другими параметрами.

Способ 1. Получить запрос из макета компоновки программно

Самый точный способ — сформировать макет компоновки данных и прочитать текст запроса из него. Для этого используется объект КомпоновщикМакетаКомпоновкиДанных. Подход работает в любом месте кода: в модуле отчёта, во внешней обработке, в фоновом задании.

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

Процедура ПоказатьИтоговыйЗапрос(СхемаКД, Настройки) Экспорт

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

МакетКомпоновки = КомпоновщикМакета.Выполнить(

СхемаКД,

Настройки,

, // ДанныеРасшифровки

, // МакетОформления

Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")

);

Для Каждого Набор Из МакетКомпоновки.НаборыДанных Цикл

Сообщить("=== Набор: " + Набор.Имя + " ===");

Сообщить(Набор.Запрос);

КонецЦикла;

Для Каждого Параметр Из МакетКомпоновки.ЗначенияПараметров Цикл

Сообщить(Параметр.Имя + " = " + Параметр.Значение);

КонецЦикла;

КонецПроцедуры

Обратите внимание: если в схеме несколько наборов данных, связанных между собой, в макете будет несколько запросов — по одному на каждый набор. Связи выполняются уже на уровне СКД, а не внутри одного запроса.

Порядок действий
  1. 1
    Получите схему компоновки данных (из макета отчёта или внешней обработки)
  2. 2
    Загрузите или сформируйте настройки, с которыми реально выполняется отчёт
  3. 3
    Создайте КомпоновщикМакетаКомпоновкиДанных и вызовите метод Выполнить
  4. 4
    Переберите МакетКомпоновки.НаборыДанных и прочитайте свойство Запрос
  5. 5
    Выгрузите ЗначенияПараметров, чтобы воспроизвести запрос в консоли

Способ 2. Отладка через консоль СКД

Если нет возможности менять код, используют внешние инструменты — консоли СКД, которые распространяются как открытые обработки. Типовая консоль позволяет загрузить схему из отчёта, применить настройки и выполнить отчёт по шагам: показать макет компоновки, итоговые запросы, результаты наборов данных.

Порядок работы обычно следующий: открываете консоль, указываете отчёт или файл схемы, загружаете вариант настроек, нажимаете команду формирования макета — и получаете вкладку с текстом итогового запроса и таблицу параметров. Дальше запрос можно скопировать в консоль запросов, подставить параметры и анализировать план выполнения.

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

Способ 3. Технологический журнал и реальный SQL

Когда нужен не запрос на встроенном языке 1С, а фактический SQL, уходящий на сервер СУБД, помогает технологический журнал. В конфигурационный файл logcfg.xml добавляют события DBMSSQL (для MS SQL Server), DBPOSTGRS (PostgreSQL) или DBORACLE — и платформа начинает писать в лог все обращения к базе.

После включения лога выполняете отчёт один раз, останавливаете запись и ищете в журнале запрос по характерному фрагменту текста или по имени таблицы. Это единственный способ увидеть окончательный SQL с подставленными значениями, учётом соединений с виртуальными таблицами и итоговой структуры, которую построила СУБД.

Учтите ограничения: технологический журнал нагружает диск и замедляет сервер, поэтому на продуктиве его включают точечно и на короткое время. Файл logcfg.xml размещается в каталоге conf сервера 1С, и для его изменения нужны права администратора сервера.

Способ 4. Перехват запроса в модуле отчёта

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

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

Если Не РежимОтладки Тогда

Возврат;

КонецЕсли;

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

Макет = КомпоновщикМакета.Выполнить(

СхемаКомпоновкиДанных,

КомпоновщикНастроек.ПолучитьНастройки()

);

Для Каждого Набор Из Макет.НаборыДанных Цикл

ЗаписьЖурналаРегистрации("ОтладкаСКД",

УровеньЖурналаРегистрации.Информация,,, Набор.Запрос);

КонецЦикла;

КонецПроцедуры

Флаг РежимОтладки стоит хранить в параметре отчёта или константе, чтобы не засорять журнал у обычных пользователей. Стандартную обработку при этом не отключают — отчёт продолжает формироваться штатно.

Как воспроизвести итоговый запрос в консоли запросов

Полученный текст сам по себе ещё не готов к выполнению: в нём остались параметры, а иногда — обращения к внешним функциям и таблицам, которые СКД передаёт отдельно. Чтобы воспроизвести запрос, перенесите текст в консоль запросов, затем из коллекции ЗначенияПараметров макета выпишите каждый параметр и его значение и установите их в консоли.

Типичная загвоздка — параметры-периоды: СКД часто добавляет служебные параметры вроде Период с типом «Момент времени» или преобразует даты к границам периода. Если в консоли результат расходится с отчётом, первым делом сверяйте именно типы и точные значения параметров, а не текст запроса.

Вторая частая ситуация — набор-объект вместо набора-запроса. Если данные отчёта берутся из таблицы значений, переданной через ПроцессорКомпоновкиДанных.Инициализировать с внешними наборами, итогового запроса просто не существует: данные уже материализованы, и отлаживать нужно код, формирующий таблицу.

Контрольные точки

Как проверить результат

Совпадение результата
Норма

Запрос в консоли с параметрами макета даёт те же строки, что и отчёт

Тревожный признак

Результат отличается — проверяйте типы параметров и отборы

Количество наборов
Норма

Число запросов в макете равно числу наборов данных схемы

Тревожный признак

Наборов меньше — часть данных приходит из внешних наборов

Параметры
Норма

Все параметры запроса присутствуют в ЗначенияПараметров

Тревожный признак

Параметр есть в тексте, но отсутствует в макете — он вычисляется выражением СКД

Типичные ошибки при извлечении итогового запроса

Самая распространённая ошибка — анализировать базовый запрос набора данных вместо итогового. Отчёт при этом ведёт себя «необъяснимо»: отбор вроде задан, а в консоли запроса его нет, потому что проверяется не тот текст.

Вторая ошибка — формировать макет с настройками по умолчанию, когда пользователь работает со своим вариантом отчёта. Настройки нужно брать из компоновщика отчёта или из хранилища пользовательских настроек, иначе итоговый запрос будет другим.

Третья ошибка — игнорировать расширения языка запросов СКД: конструкции в фигурных скобках {ГДЕ ...}, {ВЫБРАТЬ ...} обрабатываются самой СКД. Если скопировать их в обычную консоль запросов, запрос не выполнится — фигурные блоки нужно предварительно развернуть или удалить.

Типичные ошибки
01
Отладка базового запроса набора вместо итогового — проблема не воспроизводится
02
Компоновка макета с настройками по умолчанию вместо пользовательских — получен другой запрос
03
Копирование текста с фигурными скобками расширений СКД в консоль запросов — синтаксическая ошибка
04
Игнорирование параметров макета — результат запроса в консоли не совпадает с отчётом
05
Поиск запроса для набора-объекта — его нет, данные передаются таблицей значений

Какой способ выбрать в разных ситуациях

Выбор зависит от цели и доступных инструментов. Для разработчика, который отлаживает собственный отчёт, оптимален программный способ через КомпоновщикМакетаКомпоновкиДанных — он даёт точный запрос и параметры без сторонних средств. Для аналитика на чужой базе удобнее консоль СКД — она не требует изменения конфигурации.

Для проблем производительности, когда нужен план запроса на стороне СУБД, без технологического журнала не обойтись: только он показывает финальный SQL. Для массовой диагностики жалоб пользователей подходит перехват в ПриКомпоновкеРезультата с записью в журнал регистрации — так можно собрать запросы от реальных сеансов.

Сравнение вариантов

Макет компоновки программно

Точный запрос и параметры; требует написания кода

Консоль СКД

Быстро и без доработок; нужна внешняя обработка и права на её запуск

Технологический журнал

Показывает реальный SQL; нагружает сервер и требует прав администратора

Перехват в ПриКомпоновкеРезультата

Работает в фоне у пользователей; требует доработки отчёта

Итог

Что важно запомнить

Итоговый запрос СКД формируется в макете компоновки данных и отличается от базового запроса набора. Получить его можно программно через КомпоновщикМакетаКомпоновкиДанных, визуально через консоль СКД или на уровне SQL — через технологический журнал. Для воспроизведения обязательно переносите значения параметров из макета.

Частые вопросы

Почему запрос из макета не выполняется в консоли запросов?

Чаще всего из-за расширений языка запросов СКД в фигурных скобках или неустановленных параметров. Уберите фигурные блоки, развернув их вручную, и задайте все параметры из коллекции ЗначенияПараметров макета, включая служебные периоды.

Можно ли получить итоговый запрос без написания кода?

Да, через консоль СКД: она формирует макет компоновки и показывает итоговые запросы визуально. Альтернатива — технологический журнал, но он показывает уже SQL, а не запрос на языке 1С.

Почему в макете несколько запросов, хотя отчёт один?

СКД создаёт отдельный запрос для каждого набора данных схемы. Если наборы связаны между собой, объединение выполняет сама СКД после получения данных, поэтому единого запроса не существует.

Как получить запрос, если данные берутся из набора-объекта?

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

Отличается ли итоговый запрос у разных вариантов одного отчёта?

Да, и существенно: варианты отличаются настройками, а настройки определяют состав полей, отборы и группировки итогового запроса. Всегда формируйте макет с теми настройками, при которых возникает проблема.

Безопасно ли включать технологический журнал на продуктиве?

Только точечно и на короткое время: логи событий СУБД растут быстро и могут заполнить диск. Настройте фильтр по событию, соберите данные за один прогон отчёта и сразу отключите запись.