Работа с временными таблицами в системе компоновки данных (СКД) часто напоминает «черный ящик». В отличие от обычного запроса, который можно легко запустить в консоли, СКД самостоятельно управляет жизненным циклом временных таблиц, оптимизирует запросы и динамически накладывает условия. Разберем подробно, как заглянуть внутрь этого процесса и проверить данные во временных таблицах на разных этапах выполнения отчета.
Самый простой, но требующий внимательности способ — это «выдергивание» запросов из схемы компоновки в обычную консоль запросов. Рассмотрим этот процесс пошагово:
ВТ_Данные1 и ВТ_Данные2, а третий их объединяет, мы должны последовательно вставить их в окно консоли.ВЫБРАТЬ * ИЗ ИмяНужнойВТ.Важно помнить, что СКД автоматически добавляет параметры (например, &НачалоПериода, &КонецПериода) и расширения ({ГДЕ...}). При проверке в консоли их придется прописать вручную, иначе запрос не выполнится.
Если мы хотим проверить данные непосредственно внутри отчета, не прибегая к внешним инструментам, проанализируем ситуацию и внесем временные изменения в саму схему СКД:
ВЫБРАТЬ * ИЗ ИмяВашейВременнойТаблицы.Этот метод позволяет увидеть «сырые» данные временной таблицы прямо в пользовательском режиме, со всеми наложенными отборами и параметрами.
Существуют профессиональные инструменты, такие как консоли компоновки данных (например, консоли от авторов Хрусталева или Ирхина). Эти инструменты умеют делать «дамп» (выгрузку) временных таблиц автоматически. Разберем, как они работают:
Такие консоли перехватывают управление в момент компоновки результата. Они модифицируют текст запроса так, что после создания каждой временной таблицы добавляется команда помещения её данных во внешний набор или вывода в отдельное окно отладки. Это избавляет программиста от ручного копирования кода и настройки параметров.
Выясним причину расхождения данных, получив реальный текст запроса, который СКД отправляет на сервер СУБД. Это можно сделать в модуле объекта отчета в процедуре ПриКомпоновкеРезультата. Рассмотрим пример кода для перехвата:
// В модуле отчета
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// СхемаКомпоновкиДанных - встроенный реквизит
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
// В макете компоновки уже содержится реальный текст запроса со всеми подстановками
Для Каждого НаборДанных Из МакетКомпоновки.НаборыДанных Цикл
Если ТипЗнч(НаборДанных) = Тип("НаборДанныхЗапросМакетаКомпоновкиДанных") Тогда
ТекстЗапросаДляОтладки = НаборДанных.Запрос;
// Здесь можно поставить точку останова и скопировать ТекстЗапросаДляОтладки
КонецЕсли;
КонецЦикла;
// Далее стандартный вывод
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Полученный таким образом ТекстЗапросаДляОтладки будет содержать все реальные соединения и временные таблицы, сформированные платформой.
В современных версиях платформы (начиная с 8.3.16) появился удобный механизм отладки временных таблиц. Если ваш отчет использует внешний МенеджерВременныхТаблиц, вы можете:
Это позволяет визуально просмотреть таблицы в памяти, не модифицируя саму конфигурацию.
Если проблема сложная и воспроизводится только в специфических условиях, можно прибегнуть к анализу логов технологического журнала. Настроив сбор события SDBL, мы увидим низкоуровневые SQL-команды:
В логах будут записи вида CREATE TABLE #temp... и INSERT INTO #temp.... Проанализируем эти записи, чтобы понять, какие именно данные физически записываются в базу. Это самый трудоемкий, но и самый надежный способ увидеть реальную картину мира на уровне СУБД.
Посмотрим на ситуацию, когда запрос в консоли работает, а в СКД временная таблица пуста. Проанализируем возможные причины:
ГДЕ во вложенные запросы и временные таблицы, основываясь на настройках отборов пользователя. Если отбор наложен на поле, которого нет в ВТ, платформа может попытаться «пробросить» его внутрь, что приведет к пустой таблице.ОстаткиИОбороты), убедитесь, что параметры периодов в СКД передаются корректно именно в эти виртуальные таблицы.Используя предложенные методы, мы сможем эффективно контролировать состояние данных на любом этапе формирования отчета и быстро находить ошибки в логике работы с временными таблицами.