Как просмотреть итоговый запрос, сформированный компоновкой данных в обычном приложении?

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

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

Использование внешней обработки «Консоль системы компоновки данных»

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

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

Программное получение результирующего запроса через макет компоновки

Если требуется получить и проанализировать сформированный СКД запрос в процессе отладки собственного отчета или обработки, разберем по шагам, как платформа генерирует этот запрос. Окончательный текст формируется не в объекте СхемаКомпоновкиДанных, а на этапе генерации объекта МакетКомпоновкиДанных с помощью компоновщика макета.

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


// 1. Инициализируем компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

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

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

// 4. Обходим наборы данных макета и извлекаем тексты запросов
Для Каждого НаборДанных Из МакетКомпоновки.НаборыДанных Цикл
    Если ТипЗнч(НаборДанных) = Тип("НаборДанныхЗапросМакетаКомпоновкиДанных") Тогда
        ТекстИтоговогоЗапроса = НаборДанных.Запрос;
        Сообщить("--- ИТОГОВЫЙ ЗАПРОС НАБОРА: " + НаборДанных.Имя + " ---");
        Сообщить(ТекстИтоговогоЗапроса);
    КонецЕсли;
КонецЦикла;

// 5. Просматриваем фактически переданные параметры
Для Каждого ПараметрМакета Из МакетКомпоновки.ЗначенияПараметров Цикл
    Сообщить(Строка(ПараметрМакета.Имя) + " = " + Строка(ПараметрМакета.Значение));
КонецЦикла;

Особенности формирования запросов в СКД

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

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

Альтернативные способы фиксации запроса

Если требуется увидеть не только текст запроса на внутреннем языке 1С, но и фактический SQL-запрос, переданный в СУБД, рассмотрим следующие инструменты:

  1. Технологический журнал 1С: Настройка сбора событий SDBL фиксирует выполнение внутренних запросов платформы, а событие DBMSSQL (или аналог для PostgreSQL/Oracle) перехватывает прямой SQL-запрос с реальными параметрами.
  2. Профайлер СУБД: Использование встроенных средств мониторинга СУБД (например, SQL Server Profiler / Extended Events) позволяет зафиксировать запрос в момент выполнения отчета пользователем.
← На главную