При разработке и оптимизации отчетов на базе системы компоновки данных (СКД) часто возникает задача увидеть не исходный текст запроса со спецификаторами компоновки в фигурных скобках {}, а результирующий текст запроса, который система отправляет к базе данных после наложения всех пользовательских отборов, выбранных полей и группировок. Разберем основные способы решения этой задачи в обычном режиме запуска 1С:Предприятие.
Для толстого клиента и обычного режима работы платформы существует специализированная версия внешней обработки Консоль системы компоновки данных (поставляется фирмой «1С» на диске ИТС в составе комплекта внешних обработок разработчика). Разберем, как получить конечный запрос с ее помощью:
КонсольСистемыКомпоновкиДанных.epf в обычном режиме 1С:Предприятие.Если требуется получить и проанализировать сформированный СКД запрос в процессе отладки собственного отчета или обработки, разберем по шагам, как платформа генерирует этот запрос. Окончательный текст формируется не в объекте СхемаКомпоновкиДанных, а на этапе генерации объекта МакетКомпоновкиДанных с помощью компоновщика макета.
Посмотрим на пример программного кода для извлечения готового текста запроса и значений параметров:
// 1. Инициализируем компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
// 2. Получаем текущие настройки компоновщика (с учетом пользовательских отборов)
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// 3. Формируем макет компоновки данных
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки);
// 4. Обходим наборы данных макета и извлекаем тексты запросов
Для Каждого НаборДанных Из МакетКомпоновки.НаборыДанных Цикл
Если ТипЗнч(НаборДанных) = Тип("НаборДанныхЗапросМакетаКомпоновкиДанных") Тогда
ТекстИтоговогоЗапроса = НаборДанных.Запрос;
Сообщить("--- ИТОГОВЫЙ ЗАПРОС НАБОРА: " + НаборДанных.Имя + " ---");
Сообщить(ТекстИтоговогоЗапроса);
КонецЕсли;
КонецЦикла;
// 5. Просматриваем фактически переданные параметры
Для Каждого ПараметрМакета Из МакетКомпоновки.ЗначенияПараметров Цикл
Сообщить(Строка(ПараметрМакета.Имя) + " = " + Строка(ПараметрМакета.Значение));
КонецЦикла;
Проанализируем важные нюансы, которые необходимо учитывать при анализе полученного текста:
МакетКомпоновки.НаборыДанных.Запрос отсутствует, так как данные передаются напрямую из оперативной памяти.Если требуется увидеть не только текст запроса на внутреннем языке 1С, но и фактический SQL-запрос, переданный в СУБД, рассмотрим следующие инструменты:
SDBL фиксирует выполнение внутренних запросов платформы, а событие DBMSSQL (или аналог для PostgreSQL/Oracle) перехватывает прямой SQL-запрос с реальными параметрами.