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