Как проверить результат временной таблицы в СКД

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

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

Метод 1. Использование консоли запросов (ручной перенос)

Самый простой, но требующий внимательности способ — это «выдергивание» запросов из схемы компоновки в обычную консоль запросов. Рассмотрим этот процесс пошагово:

  1. Откроем конструктор схемы компоновки данных и перейдем на закладку Наборы данных.
  2. Скопируем текст всех запросов, которые участвуют в формировании временных таблиц (ВТ).
  3. В консоли запросов объединим их в один пакет. Например, если у нас есть три запроса, где первые два создают ВТ_Данные1 и ВТ_Данные2, а третий их объединяет, мы должны последовательно вставить их в окно консоли.
  4. В конце пакета добавим временный запрос для вывода содержимого интересующей нас таблицы: ВЫБРАТЬ * ИЗ ИмяНужнойВТ.

Важно помнить, что СКД автоматически добавляет параметры (например, &НачалоПериода, &КонецПериода) и расширения ({ГДЕ...}). При проверке в консоли их придется прописать вручную, иначе запрос не выполнится.

Метод 2. Изменение схемы для вывода ВТ как основного результата

Если мы хотим проверить данные непосредственно внутри отчета, не прибегая к внешним инструментам, проанализируем ситуацию и внесем временные изменения в саму схему СКД:

  1. В основном тексте запроса набора данных закомментируем (или временно удалим) финальный выбор данных.
  2. Вместо него напишем прямой запрос к проблемной временной таблице: ВЫБРАТЬ * ИЗ ИмяВашейВременнойТаблицы.
  3. Перейдем на закладку Наборы данных и нажмем кнопку Заполнить поля (или добавим их вручную), чтобы система «увидела» колонки из нашей временной таблицы.
  4. На закладке Настройки добавим эти новые поля в выбранные поля отчета.

Этот метод позволяет увидеть «сырые» данные временной таблицы прямо в пользовательском режиме, со всеми наложенными отборами и параметрами.

Метод 3. Специализированные консоли СКД

Существуют профессиональные инструменты, такие как консоли компоновки данных (например, консоли от авторов Хрусталева или Ирхина). Эти инструменты умеют делать «дамп» (выгрузку) временных таблиц автоматически. Разберем, как они работают:

Такие консоли перехватывают управление в момент компоновки результата. Они модифицируют текст запроса так, что после создания каждой временной таблицы добавляется команда помещения её данных во внешний набор или вывода в отдельное окно отладки. Это избавляет программиста от ручного копирования кода и настройки параметров.

Метод 4. Программный перехват текста запроса через ПроцессорКомпоновкиДанных

Выясним причину расхождения данных, получив реальный текст запроса, который СКД отправляет на сервер СУБД. Это можно сделать в модуле объекта отчета в процедуре ПриКомпоновкеРезультата. Рассмотрим пример кода для перехвата:


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

Полученный таким образом ТекстЗапросаДляОтладки будет содержать все реальные соединения и временные таблицы, сформированные платформой.

Метод 5. Отладка через Менеджер временных таблиц (Платформа 8.3.16+)

В современных версиях платформы (начиная с 8.3.16) появился удобный механизм отладки временных таблиц. Если ваш отчет использует внешний МенеджерВременныхТаблиц, вы можете:

  1. Установить точку останова в коде после выполнения запроса.
  2. Вызвать окно Вычислить выражение.
  3. Использовать конструктор запроса или специализированные методы просмотра содержимого менеджера.

Это позволяет визуально просмотреть таблицы в памяти, не модифицируя саму конфигурацию.

Метод 6. Использование Технологического журнала (ТЖ)

Если проблема сложная и воспроизводится только в специфических условиях, можно прибегнуть к анализу логов технологического журнала. Настроив сбор события SDBL, мы увидим низкоуровневые SQL-команды:

В логах будут записи вида CREATE TABLE #temp... и INSERT INTO #temp.... Проанализируем эти записи, чтобы понять, какие именно данные физически записываются в базу. Это самый трудоемкий, но и самый надежный способ увидеть реальную картину мира на уровне СУБД.

Важные нюансы: почему данные в ВТ могут отличаться от ожидаемых?

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

Используя предложенные методы, мы сможем эффективно контролировать состояние данных на любом этапе формирования отчета и быстро находить ошибки в логике работы с временными таблицами.

← На главную