При разработке сложных отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда итоговый результат в отчете не соответствует ожиданиям. Это происходит потому, что СКД — это не просто «выполнитель запроса», а мощный генератор, который динамически изменяет исходный текст запроса: добавляет условия ГДЕ, присоединяет новые таблицы для получения полей, обрабатывает параметры и учитывает права доступа (RLS). Разберемся, как увидеть тот самый финальный текст запроса, который платформа 1С отправляет на СУБД.
Если вы используете типовые или упрощенные консоли компоновки данных, в них часто отсутствует отдельная кнопка «Показать запрос». Однако механизм получения этой информации универсален. Рассмотрим по шагам, как извлечь запрос вручную, основываясь на опыте практикующих разработчиков:
.dcs или текст XML) в консоль.ВЫБРАТЬ (или SELECT, если конфигурация на английском).Для более комфортной работы рекомендуется использовать специализированные расширения или обработки. Одним из наиболее мощных инструментов является комплекс «Инструменты разработчика». Проанализируем возможности современных версий этого инструментария:
Ранее считалось, что подобные инструменты работают только в толстом клиенте (обычные формы). Однако современные версии полностью адаптированы под управляемое приложение. Рассмотрим преимущества использования профессиональной консоли СКД:
{ГДЕ (Поле.*)} превращаются в реальные фильтры.Иногда требуется программно «отловить» запрос непосредственно в коде вашего отчета или обработки. Для этого мы можем воспользоваться объектами платформы. Разберем пример кода, который позволяет получить текст запроса из макета компоновки:
// Создаем компоновщик макета
КомпоновщикМакета = Новый ГенераторМакетаКомпоновкиДанных;
// Формируем макет компоновки
// СхемаКомпоновкиДанных - ваша схема, Настройки - текущие настройки отчета
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
// Проходим по наборам данных в полученном макете
Для Каждого НаборДанных Из МакетКомпоновки.НаборыДанных Цикл
Если ТипЗнч(НаборДанных) = Тип("НаборДанныхЗапросМакетаКомпоновкиДанных") Тогда
// Выводим итоговый текст запроса в консоль сообщений
Сообщить("Фактический запрос:");
Сообщить(НаборДанных.Запрос);
КонецЕсли;
КонецЦикла;
Этот метод является самым точным, так как объект НаборДанныхЗапросМакетаКомпоновкиДанных содержит именно ту строку, которая будет передана в СУБД после обработки всеми механизмами платформы 1С.
При выборе консоли для управляемых форм важно понимать технический нюанс: выполнение запросов СКД происходит на стороне сервера. Поэтому консоль должна корректно передавать контекст настроек между клиентом и сервером. Выясним, почему некоторые консоли работают медленно или некорректно:
Многие старые обработки требуют запуска в толстом клиенте. Если вы работаете в тонком клиенте (через веб-сервер или обычное подключение), такие консоли могут не запуститься или выдавать ошибки доступа к файловой системе. Рекомендуем использовать консоли, реализованные в виде Расширений конфигурации. Они бесшовно интегрируются в интерфейс и имеют доступ ко всем серверным процедурам без необходимости переключения режима запуска платформы.
Помимо самого текста запроса, в современных консолях (например, входящих в состав БСП — Библиотеки стандартных подсистем) можно проанализировать следующие аспекты:
ГДЕ добавила система безопасности.Резюме: Для быстрого анализа достаточно посмотреть XML-макет в любой доступной консоли. Для глубокой разработки и оптимизации запросов (особенно с временными таблицами) лучше один раз настроить «Инструменты разработчика» или использовать качественную консоль с портала Infostart, адаптированную под управляемое приложение.