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

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

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

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

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

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

Где в СКД хранится запрос и почему их два

В схеме компоновки данных запрос существует в двух ипостасях. Первая — исходный текст запроса набора данных, который разработчик пишет в конструкторе на закладке «Наборы данных». Это статичный текст с параметрами и расширениями языка запросов СКД (конструкции в фигурных скобках).

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

Способ 1: скопировать запрос из конструктора схемы

Самый простой вариант подходит, когда нужен исходный запрос набора данных. Откройте отчёт в конфигураторе, перейдите в «Основная схема компоновки данных» и выберите закладку «Наборы данных». В списке наборов выделите нужный (обычно это «Набор данных — запрос») — в правой части окна отобразится поле «Запрос» с полным текстом.

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

Способ 2: получить запрос через консоль СКД

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

Порядок работы обычно такой: открываете консоль СКД, загружаете файл схемы (его можно сохранить из конструктора кнопкой «Сохранить настройки/схему в файл»), устанавливаете параметры и отборы, затем нажимаете команду показа запроса. Инструмент строит макет компоновки и выводит текст запроса, который реально пойдёт в СУБД.

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

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

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

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

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

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

Для Каждого ЭлементТела Из МакетКомпоновки.Тело Цикл
    Если ТипЗнч(ЭлементТела) = Тип("ЗапросМакетаКомпоновкиДанных") Тогда
        ТекстЗапроса = ЭлементТела.Текст; // финальный запрос
    КонецЕсли;
КонецЦикла;

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

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

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

Способ 4: перехват запроса через технологический журнал

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

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

Сравнение способов и выбор под задачу

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

Сравнение способов получения запроса

Конструктор схемы

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

Консоль СКД

Показывает результирующий запрос без программирования, но требует внешней обработки

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

Точный запрос с любыми настройками, полный контроль, но нужно писать код

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

Запрос на уровне СУБД для анализа производительности, но требует доступа к серверу и очистки текста

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

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

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

Типичные ошибки
01
Вставка запроса с фигурными скобками в консоль запросов — синтаксическая ошибка при выполнении
02
Забытые параметры виртуальных таблиц — запрос падает или возвращает пустой результат
03
Отладка с настройками по умолчанию вместо пользовательских — полученный запрос не совпадает с реальным
04
Поиск запроса в Тело макета без проверки типа элемента — пропуск нужного элемента или ошибка приведения типов
Контрольные точки

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

Текст запроса
Норма

Нет фигурных скобок и конструкций СКД, запрос выполняется в консоли

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

Ошибка синтаксиса или упоминание расширений компоновки

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

Все параметры из текста заполнены значениями нужного типа

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

Сообщение о незаданном параметре или пустая выборка

Результат
Норма

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

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

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

FAQ

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

Да. Исходный запрос копируется прямо из конструктора схемы на закладке «Наборы данных». Для результирующего запроса с настройками используйте внешнюю консоль СКД — она покажет текст без написания кода.

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

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

Как получить запрос, если отчёт использует несколько наборов данных?

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

Что делать с параметрами типа «Период» или стандартными датами?

Стандартные периоды СКД в макете преобразуются в обычные параметры дат (например, НачалоПериода и КонецПериода). Их значения берите из коллекции ЗначенияПараметров макета — там уже вычисленные даты, готовые для передачи в консоль запросов.

Виден ли в макете компоновки запрос на SQL?

Нет, макет содержит запрос на встроенном языке запросов 1С. Текст на SQL виден только в технологическом журнале по событиям DBMSSQL или в средствах мониторинга самой СУБД.

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

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

Итог

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

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