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