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

Программист IT и автоматизация бизнеса
← На главную

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

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

Почему схема компоновки данных не содержит итоговый запрос

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

Преобразование абстрактного описания в конкретный исполняемый код происходит на следующем шаге конвейера компоновки — при формировании макета компоновки данных. Именно объект КомпоновщикМакетаКомпоновкиДанных сопоставляет исходную схему с текущими настройками (отборами, выбранными полями, группировками) и генерирует готовый к исполнению объект МакетКомпоновкиДанных.

Где хранится модифицированный запрос

После генерации макета компоновки платформа формирует коллекцию наборов данных, адаптированных под запрошенные пользователем настройки. Если в схеме использовался набор данных типа «Запрос», то в макете компоновки соответствующий элемент имеет тип НаборДанныхЗапросМакетаКомпоновкиДанных.

Именно у этого элемента в свойстве Запрос находится результирующая строка текста запроса. В ней:

Порядок действий для получения текста запроса

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

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

Пример программного обращения к результирующему запросу:


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

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

ИтоговыйТекстЗапроса = МакетКомпоновки.НаборыДанных.НаборДанных1.Запрос;

Ограничения и важные нюансы реализации

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

← На главную