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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Разработка сложных отчетов на Системе Компоновки Данных (СКД) часто приводит к ситуации, когда итоговый результат не соответствует ожиданиям. В отчете могут использоваться десятки временных таблиц, сложные соединения и множество параметров, устанавливаемых программно. Чтобы найти ошибку, нам часто требуется прибегнуть к экспресс-отладке дополнительных отчетов, «вытащить» запрос из макета и выполнить его в обычной консоли. Однако напрямую получить объект Запрос из набора данных СКД нельзя — там хранится только текст.

В этой статье мы подробно разберем, как эффективно отладить такой отчет, получить текст запроса вместе со значениями параметров и перенести все это в консоль.

Проблема: текст есть, а параметров нет

Когда мы работаем с СКД, схема компоновки данных содержит наборы данных. В наборе данных типа "Запрос" есть свойство Запрос, которое содержит строку с текстом SQL-подобного запроса 1С. Также в настройках компоновки или параметрах данных есть значения параметров.

Сложность заключается в том, что:

  1. В объекте НаборДанных нет готового метода, который вернул бы нам объект Запрос с заполненными параметрами.
  2. Параметров может быть очень много (20+), и заполнять их вручную в консоли — долго и чревато ошибками.
  3. Некоторые параметры могут быть списками значений или границами периодов, которые сложно корректно перенести вручную.

Рассмотрим несколько способов решения этой задачи: от использования готовых инструментов до написания собственного кода.

Способ 1. Программное создание объекта Запрос (Метод автора)

Если вы находитесь в процессе отладки кода (например, поставили точку останова в модуле объекта или формы отчета), вы можете воспользоваться функцией-оберткой — для этого есть отладка кода и просмотр переменных в режиме Предприятие. Суть метода заключается в том, чтобы программно взять текст запроса из схемы и "скормить" ему параметры из коллекции значений параметров макета.

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

Рассмотрим код функции:


Функция ПолучитьЗапросИзНабораДанных(СтрЗапрос, ЗначенияПараметров) Экспорт
    
    // Создаем новый объект Запрос на основе текста из СКД
    Запрос = Новый Запрос(СтрЗапрос);
    
    // Перебираем коллекцию параметров и устанавливаем их в запрос
    Для каждого Параметр Из ЗначенияПараметров Цикл
        Запрос.УстановитьПараметр(Параметр.Имя, Параметр.Значение);    
    КонецЦикла;
    
    Возврат Запрос;    
    
КонецФункции

Как этим пользоваться при отладке:

  1. Поставьте точку останова в месте, где компоновщик настроек уже инициализирован и параметры заполнены.
  2. В табло (Shift+F9) вызовите эту функцию, передав туда СхемаКомпоновкиДанных.НаборыДанных.ИмяВашегоНабора.Запрос и коллекцию параметров (например, из КомпоновщикМакета.ЗначенияПараметров или подготовленной структуры).
  3. Полученный результат (объект Запрос) можно проанализировать через "Вычислить выражение" или использовать в продвинутой консоли запросов для УФ, которая отлично справляется с пакетными запросами и временными таблицами.

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

Способ 2. Использование продвинутых консолей СКД (Инструменты разработчика)

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

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

Давайте разберем алгоритм действий:

  1. В режиме 1С:Предприятие в форме отчета заполните все параметры, отборы и настройки.
  2. Сохраните настройки отчета в XML (обычно это кнопка "Все действия" -> "Сохранить настройки" или стандартная команда формы).
  3. Если схема компоновки изменялась программно, сохраните и её (через ЗаписьXML и СериализаторXDTO).
  4. Откройте консоль СКД (внешнюю обработку), такую как Пользовательская СКД, позволяющую гибко работать со схемами на стороне клиента — для этого подойдёт консоль запросов и СКД для анализа сложных схем.
  5. Загрузите туда схему и сохраненные настройки.

После этого консоль сама сформирует макет компоновки. Большинство таких инструментов имеют вкладку "Макет" или "Запрос", где можно увидеть итоговый текст запроса, который реально отправляется в СУБД. Это критически важно, так как СКД часто модифицирует исходный текст запроса:

Для понимания того, как именно система интерпретирует сложные условия, можно использовать AI-Анализатор 1С, который поможет расшифровать логику работы запроса на естественном языке.

Способ 3. Перехват через Макет Компоновки Данных

Если у вас нет под рукой мощных инструментов, но нужно увидеть реальный запрос, который сформировала система с учетом всех галочек пользователя, мы можем получить его программно. Запрос в НаборыДанных — это "черновик". "Чистовик" находится в макете.

Посмотрим, как получить реальный исполняемый текст:


// 1. Получаем настройки из компоновщика (то, что выбрал пользователь)
Настройки = КомпоновщикНастроек.ПолучитьНастройки();

// 2. Создаем компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

// 3. Выполняем компоновку. Это самый важный шаг.
// Система превращает настройки и схему в конкретный макет исполнения.
Макет = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки);

// 4. Теперь в макете можно найти итоговый запрос
// Обратите внимание: в макете может быть несколько наборов данных
Для Каждого Набор ИЗ Макет.НаборыДанных Цикл
    Если ТипЗнч(Набор) = Тип("НаборДанныхЗапросМакетаКомпоновкиДанных") Тогда
        Сообщить("Запрос для набора: " + Набор.Имя);
        Сообщить(Набор.Запрос); // Это реальный SQL/текст запроса с учетом отборов
        
        // Значения параметров для исполнения лежат здесь:
        // Макет.ЗначенияПараметров
    КонецЕсли;
КонецЦикла;

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

Способ 4. Замер производительности

Если вам нужно просто быстро посмотреть текст запроса с подставленными значениями параметров (как он уходит на SQL-сервер), и вы не хотите писать код:

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

В нижней части окна замера будет показан полный текст запроса. Если включен режим отображения запросов, вы увидите его уже с подставленными значениями параметров (например, вместо &П1 будет стоять конкретная дата или ссылка). Это самый быстрый способ "подглядеть", что происходит "под капотом", не прибегая к внешним обработкам.

Резюме

Для отладки сложных запросов в СКД не стоит пытаться воссоздать их вручную. Используйте:

← На главную