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