Отчеты и Аналитика · 10 мин
Как получить текст запроса из СКД 1С
Как программно получить текст запроса из схемы компоновки данных 1С: через КомпоновщикМакетаКомпоновкиДанных, отладку отчёта и консоль СКД. Примеры кода и типичные ошибки.
Система компоновки данных (СКД) в 1С собирает итоговый запрос динамически: платформа учитывает выбранные настройки, отборы, группировки, ресурсы и связи наборов данных. Поэтому текст, который разработчик видит в конструкторе запроса на вкладке «Наборы данных», — это лишь исходный шаблон, а не тот запрос, который реально выполняется к базе данных. Чтобы получить фактический текст запроса, нужно обратиться к макету компоновки данных или использовать вспомогательные инструменты.
Задача возникает в нескольких типовых ситуациях: нужно отладить медленный отчёт и посмотреть план запроса в консоли, перенести логику СКД в обычный запрос, разобраться, почему отбор пользователя «не срабатывает», или проверить, какие поля реально попадают в выборку. Ниже разобраны рабочие способы — от программного получения текста через объектную модель до анализа в отладчике.
Почему текст из конструктора не совпадает с реальным запросом
Когда отчёт на СКД выполняется, платформа проходит несколько этапов: берёт схему компоновки, применяет пользовательские настройки (отборы, порядок, группировки, выбранные поля), строит макет компоновки и только потом формирует окончательный запрос. На этом пути исходный текст трансформируется: добавляются условия отборов, убираются неиспользуемые поля и таблицы, подставляются параметры, разворачиваются выражения виртуальных таблиц.
Практическое следствие: если вы скопируете запрос из конструктора и выполните его в консоли запросов, результат может отличаться от того, что выводит отчёт. Особенно заметно это при использовании периодических виртуальных таблиц, характеристик и отборов, заданных пользователем в форме отчёта. Для диагностики всегда нужен именно итоговый запрос из макета компоновки.
Способ 1. Получить текст программно через КомпоновщикМакетаКомпоновкиДанных
Основной и самый надёжный способ — самостоятельно выполнить этапы компоновки и прочитать запрос из полученного макета. Для этого используются объекты КомпоновщикНастроекКомпоновкиДанных и КомпоновщикМакетаКомпоновкиДанных. Метод Выполнить компоновщика макета возвращает объект МакетКомпоновкиДанных, у которого есть коллекция НаборыДанных. У каждого набора данных макета доступно свойство Запрос — это и есть итоговый текст запроса с применёнными настройками.
Типовой фрагмент кода выглядит так:
СхемаКД = Отчеты.МойОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКД));
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКД.НастройкиПоУмолчанию);
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКД, КомпоновщикНастроек.ПолучитьНастройки());
Для Каждого Набор Из МакетКомпоновки.НаборыДанных Цикл
Сообщить(Набор.Запрос);
КонецЦикла;
Если отчёт формируется из формы и нужно учесть пользовательские настройки, вместо настроек по умолчанию передавайте текущие настройки компоновщика отчёта (в управляемой форме отчёта они доступны через Отчет.КомпоновщикНастроек.Настройки). Так вы получите запрос ровно в том виде, в каком он выполняется при нажатии кнопки «Сформировать».
Обратите внимание: наборов данных в макете может быть несколько (объединения, связанные наборы), и у каждого будет свой запрос. Также в макете хранятся значения параметров — коллекция ЗначенияПараметров, которую удобно выгрузить рядом с текстом запроса для воспроизведения в консоли.
Способ 2. Посмотреть запрос в отладчике
Если отчёт формируется стандартно и дорабатывать код не хочется, итоговый запрос можно увидеть в конфигураторе через точку останова. Для управляемых форм удобное место — обработчик расширения формы отчёта или общий модуль, через который проходит формирование; для отчётов с переопределённым формированием — модуль объекта отчёта, процедура ПриКомпоновкеРезультата.
Через переопределение ПриКомпоновкеРезультата
В модуле объекта отчёта создайте или найдите обработчик ПриКомпоновкеРезультата. Внутри него макет компоновки уже сформирован и доступен как параметр. Поставьте точку останова и в табло вычислите выражение МакетКомпоновки.НаборыДанных[0].Запрос (индекс зависит от структуры макета). Текст можно скопировать из окна выражения в консоль запросов.
Через технологический журнал
Альтернатива без изменения кода — включить технологический журнал с событием DBMSSQL или DBPOSTGRS (в зависимости от СУБД) и посмотреть физический SQL-запрос, который ушёл на сервер. Это уже не текст на встроенном языке запросов 1С, а транслированный SQL, но для анализа плана запроса и поиска узких мест производительности это часто даже полезнее.
- 1Получите схему компоновки данных отчёта через ПолучитьМакет
- 2Создайте компоновщик настроек и загрузите нужные настройки (по умолчанию или пользовательские)
- 3Выполните компоновку макета через КомпоновщикМакетаКомпоновкиДанных
- 4Переберите МакетКомпоновки.НаборыДанных и выведите свойство Запрос каждого набора
- 5Выгрузите МакетКомпоновки.ЗначенияПараметров, чтобы воспроизвести запрос в консоли
Способ 3. Консоль СКД и внешние инструменты
Для разработчиков существуют внешние обработки — консоли компоновки данных, которые загружают схему, позволяют интерактивно менять настройки и показывают итоговый запрос вместе с результатом. Такая консоль удобна, когда нужно быстро поэкспериментировать: поменяли отбор — сразу видно, как изменился текст запроса.
При выборе инструмента проверяйте его совместимость с вашей версией платформы и режимом работы (тонкий клиент, веб-клиент, управляемые формы). Внешние обработки из непроверенных источников запускайте только на копии базы: обработка выполняется с правами текущего пользователя и теоретически может содержать любой код.
Как воспроизвести полученный запрос в консоли запросов
Полученный текст почти всегда содержит параметры: периоды, отборы, служебные параметры СКД. Чтобы выполнить его в консоли запросов, нужно заполнить все параметры значениями. Их список и значения берите из МакетКомпоновки.ЗначенияПараметров — там лежат уже вычисленные значения, включая даты, приведённые к нужному типу.
Также учитывайте особенности: в запросе могут встречаться конструкции, специфичные для СКД (например, расширение языка запросов для компоновки — фигурные скобки с выражениями полей и отборов). Если вы брали текст из схемы, а не из макета, такие конструкции нужно либо развернуть вручную, либо удалить. Текст из макета компоновки уже очищен от этих конструкций и выполняется в консоли напрямую при корректно заполненных параметрах.
Как проверить результат
В тексте нет фигурных скобок и конструкций расширения СКД
Остались {ВЫБРАТЬ}, {ГДЕ} — это шаблон из схемы, а не итоговый запрос
Все параметры из ЗначенияПараметров макета перенесены в консоль
Консоль выдаёт ошибку «Параметр не найден» или пустой результат
Результат консоли совпадает с данными отчёта при тех же настройках
Расхождения — значит, взяты не те настройки или не тот набор данных
Типичные ошибки и ограничения
Самая частая ошибка — попытка анализировать запрос из конструктора наборов данных и удивляться, почему результат не совпадает с отчётом. Вторая по популярности — получать макет с настройками по умолчанию, тогда как пользователь формирует отчёт со своими отборами: запросы будут различаться, и диагностика пойдёт по ложному следу.
Ещё одна ловушка — наборы данных типа «Объект» и «Запрос» в одной схеме: у наборов типа «Объект» свойства Запрос нет, данные туда передаются программно. Если в схеме используются вычисляемые поля и ресурсы, помните, что часть логики выполняется уже после запроса — на этапе вывода результата компоновки, и в тексте запроса её не будет.
Когда какой способ выбрать
Для разовой диагностики быстрее всего отладчик: одна точка останова в ПриКомпоновкеРезультата — и запрос у вас. Для регулярной работы с отчётами удобнее держать под рукой небольшую процедуру или консоль СКД, которая выводит тексты запросов по любому отчёту. Для глубокого анализа производительности, когда важен реальный план выполнения, дополнительно подключайте технологический журнал и смотрите SQL на стороне СУБД.
Как выбрать действие
Частые вопросы
Можно ли получить текст запроса СКД без программирования?
Да, частично. В отладчике конфигуратора можно остановиться в момент формирования отчёта и посмотреть макет компоновки без написания собственного кода. Также технологический журнал покажет SQL-запрос без вмешательства в конфигурацию. Полноценного штатного инструмента «показать запрос» в типовых отчётах обычно нет.
Почему запрос из макета отличается от текста в конструкторе наборов данных?
СКД динамически модифицирует запрос: применяет отборы пользователя, удаляет неиспользуемые поля и соединения, подставляет параметры и разворачивает конструкции расширения языка запросов. Конструктор показывает только исходный шаблон.
Как узнать значения параметров, с которыми выполняется запрос?
Они хранятся в коллекции ЗначенияПараметров макета компоновки данных. Переберите её в коде или посмотрите в отладчике — там будут уже вычисленные значения, включая даты периодов и параметры отборов.
Что делать, если в схеме несколько наборов данных?
У каждого набора в макете компоновки свой запрос. Переберите коллекцию НаборыДанных и выведите текст для каждого. Учтите, что наборы типа «Объект» запроса не имеют — их данные формируются программно.
Почему запрос из макета не выполняется в консоли запросов?
Чаще всего не заполнены параметры — сверьтесь с ЗначенияПараметров макета. Реже причина в том, что вы взяли текст из схемы, а не из макета: в нём остаются конструкции расширения СКД в фигурных скобках, которые обычный запрос не понимает.
Можно ли подменить или изменить итоговый запрос СКД?
Напрямую текст в макете менять не принято, но можно влиять на результат через настройки компоновки, параметры и события отчёта (например, ПриКомпоновкеРезультата с собственной компоновкой макета). Для радикальных изменений обычно проще доработать саму схему или формировать данные запросом вне СКД.