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