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

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

Как получить текст запроса из СКД 1С

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

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

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

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

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

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

Способ 1. Получить текст программно через КомпоновщикМакетаКомпоновкиДанных

Основной и самый надёжный способ — самостоятельно выполнить этапы компоновки и прочитать запрос из полученного макета. Для этого используются объекты КомпоновщикНастроекКомпоновкиДанных и КомпоновщикМакетаКомпоновкиДанных. Метод Выполнить компоновщика макета возвращает объект МакетКомпоновкиДанных, у которого есть коллекция НаборыДанных. У каждого набора данных макета доступно свойство Запрос — это и есть итоговый текст запроса с применёнными настройками.

Типовой фрагмент кода выглядит так:

СхемаКД = Отчеты.МойОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

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

КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКД));

КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКД.НастройкиПоУмолчанию);

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

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

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

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

КонецЦикла;

Если отчёт формируется из формы и нужно учесть пользовательские настройки, вместо настроек по умолчанию передавайте текущие настройки компоновщика отчёта (в управляемой форме отчёта они доступны через Отчет.КомпоновщикНастроек.Настройки). Так вы получите запрос ровно в том виде, в каком он выполняется при нажатии кнопки «Сформировать».

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

Способ 2. Посмотреть запрос в отладчике

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

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

В модуле объекта отчёта создайте или найдите обработчик ПриКомпоновкеРезультата. Внутри него макет компоновки уже сформирован и доступен как параметр. Поставьте точку останова и в табло вычислите выражение МакетКомпоновки.НаборыДанных[0].Запрос (индекс зависит от структуры макета). Текст можно скопировать из окна выражения в консоль запросов.

Через технологический журнал

Альтернатива без изменения кода — включить технологический журнал с событием DBMSSQL или DBPOSTGRS (в зависимости от СУБД) и посмотреть физический SQL-запрос, который ушёл на сервер. Это уже не текст на встроенном языке запросов 1С, а транслированный SQL, но для анализа плана запроса и поиска узких мест производительности это часто даже полезнее.

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

Способ 3. Консоль СКД и внешние инструменты

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

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

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

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

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

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

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

Текст запроса получен из макета компоновки
Норма

В тексте нет фигурных скобок и конструкций расширения СКД

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

Остались {ВЫБРАТЬ}, {ГДЕ} — это шаблон из схемы, а не итоговый запрос

Заполнение параметров
Норма

Все параметры из ЗначенияПараметров макета перенесены в консоль

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

Консоль выдаёт ошибку «Параметр не найден» или пустой результат

Совпадение данных
Норма

Результат консоли совпадает с данными отчёта при тех же настройках

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

Расхождения — значит, взяты не те настройки или не тот набор данных

Типичные ошибки и ограничения

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

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

Типичные ошибки
01
Анализировать шаблон из конструктора вместо итогового запроса из макета — выводы о производительности окажутся неверными
02
Использовать настройки по умолчанию вместо пользовательских — запрос не совпадёт с тем, что реально выполняется
03
Забыть перенести значения параметров в консоль — запрос упадёт с ошибкой или вернёт пустой результат
04
Искать запрос у набора данных типа «Объект» — у него нет свойства Запрос, данные передаются из кода

Когда какой способ выбрать

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

Маршрут решения

Как выбрать действие

Нужна разовая проверка запроса конкретного отчётаПоставьте точку останова в ПриКомпоновкеРезультата и вычислите МакетКомпоновки.НаборыДанных[0].Запрос
Нужно получать запросы регулярно для разных отчётовНапишите процедуру с КомпоновщикМакетаКомпоновкиДанных или используйте проверенную консоль СКД
Проблема в производительности запросаДополнительно включите технологический журнал и проанализируйте SQL и план запроса на СУБД
В схеме есть наборы типа «Объект»Анализируйте код, который заполняет эти наборы, — запроса у них нет

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

Можно ли получить текст запроса СКД без программирования?

Да, частично. В отладчике конфигуратора можно остановиться в момент формирования отчёта и посмотреть макет компоновки без написания собственного кода. Также технологический журнал покажет SQL-запрос без вмешательства в конфигурацию. Полноценного штатного инструмента «показать запрос» в типовых отчётах обычно нет.

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

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

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

Они хранятся в коллекции ЗначенияПараметров макета компоновки данных. Переберите её в коде или посмотрите в отладчике — там будут уже вычисленные значения, включая даты периодов и параметры отборов.

Что делать, если в схеме несколько наборов данных?

У каждого набора в макете компоновки свой запрос. Переберите коллекцию НаборыДанных и выведите текст для каждого. Учтите, что наборы типа «Объект» запроса не имеют — их данные формируются программно.

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

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

Можно ли подменить или изменить итоговый запрос СКД?

Напрямую текст в макете менять не принято, но можно влиять на результат через настройки компоновки, параметры и события отчёта (например, ПриКомпоновкеРезультата с собственной компоновкой макета). Для радикальных изменений обычно проще доработать саму схему или формировать данные запросом вне СКД.