Получить данные запроса скд

Устали бороться с кодом? Узнайте, как легко получить данные запроса СКД за минуту. Примеры, лайфхаки и нюансы платформы 1С — читайте и применяйте!

Бесплатная консультация юриста

+7 (800) 302-87-29

Реклама jurik.ru

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

Основные понятия: от схемы к исполняемому запросу

  • Структуры отчета (группировки, ресурсы, вычисляемые поля);
  • Пользовательских настроек (отборы, порядок, условное оформление);
  • Параметров схемы компоновки;
  • Настроек наборов данных (например, «Использовать группировки запроса, если возможно»).

Поэтому простой просмотр текста запроса в макете не дает полной картины. Необходимо получить исполняемый текст запроса с подставленными параметрами («твердыми» и «мягкими»).

Интерактивные способы просмотра запроса

Консоль компоновки данных (Стандартная обработка)

Самый доступный способ — использование встроенной обработки «Консоль компоновки данных» (доступна в конфигураторе: Файл → Открыть → Обработка → КонсольКомпоновкиДанных.epf или через меню Администрирование → Консоль компоновки данных в режиме предприятия).

Возможности консоли:

  1. Импорт схемы компоновки из XML-файла или прямо из метаданных отчета.
  2. Вызов конструктора схемы компоновки для редактирования.
  3. Выполнение компоновки с произвольными пользовательскими настройками.
  4. Просмотр итогового запроса, который сгенерировала платформа (вкладка «Запрос» или «Результат»).
  5. Просмотр плана запроса (Explain Plan) для анализа производительности.

Консоль запросов в режиме предприятия

При запуске отчета в пользовательском режиме (при наличии прав администратора или специальных ролей) часто доступна кнопка «Консоль запросов» или «Показать запрос» в командной панели отчета (зависит от реализации командного интерфейса конкретного отчета). Это позволяет увидеть запрос «здесь и сейчас» с текущими отборами пользователя.

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

Для автоматизации тестирования, логирования или построения сложных алгоритмов часто требуется получить текст запроса в коде (на сервере).

Через объект КомпоновщикМакета

Это основной способ генерации кода компоновки. После выполнения метода Выполнить у объекта КомпоновщикМакета становится доступен сгенерированный программный код, а также можно извлечь текст запроса.

Пример:

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

// 2. Создаем компоновщики
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
НастройкиОтчета = КомпоновщикМакета.НастройкиПоУмолчанию; // или загружаем пользовательские

// 3. Выполняем компоновку (генерируем код и запрос)
КомпоновщикМакета.Выполнить(СхемаКомпоновки, НастройкиОтчета, ДанныеРасшифровки);

// 4. Получаем текст запроса.
// Вариант А: Из сгенерированного кода (сложно парсить).
// Вариант Б: Из наборов данных схемы ПОСЛЕ выполнения компоновки (если платформа заполнила их).
// Наиболее надежный способ, анализ сгенерированного кода или использование Консоли СКД программно.

// Для получения готового текста запроса с параметрами часто используют внутренние механизмы: // ТекстЗапроса = ПолучитьМакет("ИмяМакетаВОтчете").НаборыДанных[0].Запрос; // Внимание: это даст только шаблон из макета, БЕЗ учета настроек пользователя!

Использование объекта ПроцессорКомпоновкиДанных

Более высокоуровневый подход — запуск процесса компоновки через ПроцессорКомпоновкиДанных. Это позволяет получить готовый набор данных (таблицу значений) и, при необходимости, перехватить запрос через события или анализ временных таблиц.

Пример получения запроса через ПроцессорКомпоновкиДанных (концептуально):

Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(СхемаКомпоновки, НастройкиОтчета);

// Стандартный паттерн: использовать КонсольКомпоновкиДанных программно или
// извлекать запрос из кода, сгенерированного КомпоновщикомМакета.

// Пример извлечения из сгенерированного кода (упрощенно):
КодГенерации = КомпоновщикМакета.КодПрограммы; // Строка с кодом на языке 1С
// В этом коде можно найти строку: Запрос.Текст = "SELECT ...";

Получение параметров и отборов программно

Часто нужно не просто текст запроса, а понять, какие параметры и отборы в него попали. Актуально для платформы 8.3.27+.

// Пример получения структуры параметров/отборов из настроек

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

Особенности формирования запроса СКД (Почему запрос в консоли отличается от СКД)

Частая проблема: запрос в «Консоли запросов» работает правильно, а отчет на СКД выдает другие данные. Причины кроются в автоматические преобразования, которые делает платформа:

Исключение неиспользуемых полей

СКД анализирует структуру отчета (группировки, ресурсы, вычисляемые поля). Если поле из запроса не используется ни в одной группировке, ни в ресурсе, ни в вычисляемом поле — оно будет исключено из итогового SELECT;

Решение: Установить свойство поля в наборе данных: «Обязательное» = Истина. Это заставит платформу оставить поле в запросе даже если оно не используется в макете напрямую (например, нужно для детальных записей или передачи в подчиненные наборы данных).

Перенос отборов в запрос (Пуш-даун / Push-down)

Начиная с релизов 8.3.14+, СКД умеет переносить пользовательские отборы (из настроек отчета) прямо в текст SQL-запроса (в секцию WHERE), что критично для производительности.

  • Если отбор по полю, которое есть в запросе — он переносится в WHERE.
  • Если отбор по вычисляемому полю или полю, исключенном из SELECT — отбор выполняеться после получения данных на сервере приложений (в памяти), что медленно.

Опция «Использовать группировки запроса, если возможно»

Настройка набора данных. Если включена (по умолчанию часто да), СКД пытается сделать GROUP BY на уровне СУБД.

  • Включена: Запрос возвращает уже сгруппированные данные (по полям группировки отчета). Ресурсы считаются агрегатными функциями (SUM, COUNT) в SQL.
  • Выключена: Запрос возвращает детальные записи (как написано в макете), а группировку и расчет ресурсов делает сам процессор СКД на сервере приложений.

Это кардинально меняет текст итогового запроса и план выполнения.

Язык выражений СКД vs Язык запросов

СКД работает в два этапа:

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

Если в ресурсе используется сложное выражение на языке СКД (не стандартная агрегация), платформа не сможет перенести его расчет в SQL — придется выгружать детализацию.

Отладка и анализ итогового SQL

Получить чистый SQL (на языке СУБД: PostgreSQL, MSSQL, Oracle) напрямую из 1С сложно, так как платформа использует параметризованные запросы.

  • Технологический журнал (ТЖ): Включение профилирования (планов запросов) в logcfg.xml позволяет увидеть реальный SQL с параметрами на стороне кластера/СУБД.
  • План запроса в Консоли СКД: Показывает план выполнения, который строит СУБД для сгенерированного запроса.
  • Расширение конфигурации «Инструментарий разработчика СКД»: Умеет генерировать программный код, воспроизводящий схему компоновки, что помогает увидеть логику формирования запроса.

Чек-лист: Как получить корректный исполняемый запрос

  1. Откройте Консоль компоновки данных.
  2. Загрузите схему компоновки вашего отчета.
  3. Укажите Настройки отчета (можно загрузить вариант настроек пользователя из файла или задать программно).
  4. Нажмите «Сформировать» / «Выполнить».
  5. Перейдите на вкладку «Запрос» (или «Текст запроса»).
  6. Проверьте: есть ли нужные поля (помните про «Обязательное»), перенеслись ли отборы в WHERE, используется ли GROUP BY на стороне БД.

Резюме

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

Ключевые инструменты: Консоль компоновки данных (интерактивно), КомпоновщикМакета.Выполнить + анализ КодПрограммы (программно), Технологический журнал (для реального SQL). Ключевые ловушки: автоматическое удаление полей (лечится флагом «Обязательное»), перенос отборов в WHERE (зависит от наличия поля в SELECT), режим группировки на стороне БД vs стороне приложения.

Статья подготовлена на основе актуальной информации сообщества 1С-разработчиков (Infostart, Хабр, блоги экспертов) на дату .