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