Отчеты и Аналитика · 9 мин
Как в 1С посмотреть результирующий запрос СКД
Как в 1С посмотреть результирующий запрос СКД: конструктор схемы компоновки, закладка «Запрос», консоль СКД, отладка через параметры и временные таблицы.
Результирующий запрос СКД (системы компоновки данных) — это итоговый текст запроса, который платформа фактически формирует и выполняет при построении отчёта. Он отличается от запроса, который разработчик видит на закладке «Наборы данных»: СКД добавляет отборы, параметры, вычисляемые поля, итоги и обёртки, поэтому итоговый текст может заметно отличаться от исходного. Знание того, где посмотреть этот запрос, критично при отладке медленных отчётов и поиске неверных данных.
Есть несколько рабочих способов увидеть итоговый запрос: через конструктор схемы компоновки, через консоль СКД, программно через отладку в конфигураторе и через технологический журнал. Каждый подходит для своей ситуации — от быстрой проверки до анализа запроса, который платформа отправляет в СУБД.
Зачем вообще смотреть результирующий запрос
Исходный запрос набора данных показывает только «скелет» выборки. В момент выполнения СКД подставляет в него параметры, добавляет условия отборов пользователя, формирует временные таблицы, оборачивает запрос для группировок и итогов. Если отчёт выводит не те данные или работает медленно, причина почти всегда видна именно в результирующем запросе, а не в исходном.
Типовые ситуации, когда нужен итоговый текст: отбор в настройках отчёта не срабатывает, параметр передаётся с неожиданным значением, итоги по группировке расходятся с детальными строками, запрос «вылетает» с ошибкой синтаксиса только при определённых настройках. Во всех этих случаях анализ исходного набора данных ничего не даст.
Способ 1. Конструктор СКД в конфигураторе
Откройте схему компоновки данных отчёта в конфигураторе: основная схема отчёта → кнопка «Открыть схему компоновки данных». На закладке «Наборы данных» вы увидите исходный запрос. Это не результирующий запрос, но он — отправная точка: здесь можно через конструктор запроса проверить корректность базовой выборки.
Чтобы приблизиться к итоговому виду, перейдите на закладку «Настройки» и откройте вариант отчёта. В режиме просмотра настроек СКД показывает, какие отборы, параметры и поля попадут в финальный запрос. Полный результирующий текст конфигуратор напрямую не показывает — для этого нужны следующие способы.
Способ 2. Просмотр запроса в режиме «1С:Предприятие»
В типовых конфигурациях на управляемых формах многие отчёты позволяют увидеть схему и настройки прямо в пользовательском режиме. Откройте отчёт, нажмите «Ещё» → «Изменить вариант...» (или «Прочее» → «Изменить вариант отчёта»). В открывшейся форме настроек видны отборы и параметры, которые СКД подставит в запрос.
В некоторых конфигурациях доступен пункт «Ещё» → «Изменить схему компоновки» или расширенный режим настроек, где отображается текст запроса набора данных с учётом текущих настроек. Доступность зависит от прав пользователя (нужны права на изменение вариантов или административные права) и от конкретной конфигурации.
Способ 3. Консоль СКД
Консоль системы компоновки данных — внешняя обработка, которая загружает схему, позволяет задать настройки и показывает результирующий запрос и результат его выполнения. Это самый удобный инструмент для отладки: вы видите итоговый текст запроса целиком, можете скопировать его в консоль запросов и выполнить по шагам.
Порядок работы: откройте консоль СКД, загрузите схему компоновки (из файла отчёта или скопировав XML схемы из конфигуратора), установите значения параметров и отборов как в проблемном случае, выполните отчёт. Консоль покажет результирующий запрос с уже подставленными условиями.
- 1Сохраните схему компоновки данных из конфигуратора в файл XML
- 2Откройте консоль СКД и загрузите схему
- 3Установите параметры и отборы, воспроизводящие проблему
- 4Выполните компоновку и откройте результирующий запрос
- 5Скопируйте запрос в консоль запросов и выполните с теми же параметрами
- 6Сравните результат с данными отчёта
Способ 4. Отладка в конфигураторе через макет компоновки
Самый точный способ увидеть именно тот запрос, который выполняется, — остановиться в отладчике в момент формирования отчёта. Если отчёт формируется программно, поставьте точку останова после вызова ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ...) и посмотрите содержимое макета компоновки данных.
В макете компоновки (МакетКомпоновки) наборы данных содержат уже готовый результирующий запрос. В отладчике через «Вычислить выражение» (Shift+F9) обратитесь к структуре макета: МакетКомпоновки.НаборыДанных — у элементов есть свойство Запрос, где лежит итоговый текст со всеми подстановками СКД.
Для типового отчёта без собственного кода можно временно добавить в модуль объекта отчёта обработчик ПриКомпоновкеРезультата и вывести запрос в сообщение или записать в файл. После отладки код нужно убрать или отключить, чтобы не засорять журнал.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
Для Каждого Набор Из Макет.НаборыДанных Цикл
Сообщить(Набор.Запрос);
КонецЦикла;
КонецПроцедурыСпособ 5. Технологический журнал для реального SQL
Если нужно увидеть не запрос на языке 1С, а фактический SQL, который уходит в СУБД, используйте технологический журнал. Включите в logcfg.xml события DBMSSQL (для MS SQL Server), DBPOSTGRS, DBORACLE или DBV8DBENG в зависимости от используемой СУБД, выполните отчёт и найдите в логе соответствующий запрос.
Этот способ незаменим при оптимизации: план запроса и фактический SQL показывают, какие индексы используются и где теряется время. Учтите, что технологический журнал пишется на сервере 1С — нужен доступ к каталогу логов и осторожность с настройками, чтобы не перегрузить диск подробным логированием.
Проверка результата и типичные ошибки
После получения результирующего запроса скопируйте его в консоль запросов, подставьте те же параметры и выполните. Если результат консоли совпадает с данными отчёта — проблема в настройках компоновки (группировки, ресурсы, отборы). Если не совпадает — ищите расхождение в параметрах: СКД могла преобразовать тип или подставить значение по умолчанию.
Частая ошибка — анализировать запрос набора данных вместо результирующего и делать выводы об отборах, которых в исходном тексте просто нет. Вторая типичная ошибка — забыть, что параметры виртуальных таблиц (период, отборы регистров) СКД подставляет автоматически из настроек, и в итоговом запросе они выглядят иначе, чем в конструкторе.
Как проверить результат
Содержит условия отборов и параметры из настроек отчёта
Отборы из настроек в запросе отсутствуют
Совпадает с детальными данными отчёта при тех же параметрах
Расходится — параметры переданы иначе
Сопоставимо с выполнением запроса в консоли
Отчёт намного медленнее запроса — проблема в компоновке, а не в SQL
FAQ
Почему запрос в конструкторе отличается от выполняемого?
СКД динамически модифицирует запрос: добавляет условия отборов пользователя, подставляет параметры, оборачивает выборку для группировок и итогов, формирует временные таблицы. Исходный текст набора данных — только основа, финальный запрос собирается в момент формирования отчёта.
Можно ли посмотреть результирующий запрос без конфигуратора?
Да, в режиме «1С:Предприятие» через консоль СКД, если она доступна, либо через расширенные настройки варианта отчёта в типовых конфигурациях. Для полного текста с подстановками удобнее всего консоль СКД — она показывает итоговый запрос целиком.
Как увидеть SQL-запрос, который 1С отправляет в СУБД?
Через технологический журнал: включите события DBMSSQL, DBPOSTGRS или аналог для вашей СУБД в файле logcfg.xml, выполните отчёт и найдите запрос в логе. Лог включайте только на время диагностики — объём записей очень большой.
Что делать, если в макете компоновки несколько наборов данных?
Переберите все элементы коллекции НаборыДанных макета компоновки — у каждого набора свой результирующий запрос. Наборы могут объединяться связями, поэтому анализировать нужно все запросы вместе, а не только первый.
Почему запрос в консоли работает, а в отчёте — ошибка?
Чаще всего отличаются параметры: СКД подставляет значения по умолчанию, преобразует типы или добавляет собственные отборы. Сравните результирующий запрос из макета компоновки с тем, что вы выполняете в консоли, — расхождение укажет на причину.
Безопасно ли добавлять отладочный код в ПриКомпоновкеРезультата?
Да, если делать это в тестовой копии базы или временно с последующим удалением кода. На рабочей базе вывод запроса через Сообщить() будет показываться пользователям и замедлять формирование отчёта, поэтому отладочный код нельзя оставлять в продуктиве.
Что важно запомнить
Результирующий запрос СКД отличается от запроса набора данных: смотреть его нужно в консоли СКД, через макет компоновки в отладчике или в технологическом журнале. Проверку выполняйте в консоли запросов с теми же параметрами, а технологический журнал включайте только на время диагностики.