Почему значения ресурсов в расшифровке СКД пустые и как получить числовые данные из ячеек

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

При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда при программном анализе расшифровки или чтении табличного документа значения полей-ресурсов оказываются пустыми (Неопределено), в то время как обычные поля (ссылки, строки) заполнены корректно. Это создает сложности, если требуется выполнить постобработку отчета — например, изменить цвет ячеек в зависимости от значения или выполнить дополнительные расчеты на основе выведенных данных. В этой статье мы подробно разберем причины такого поведения платформы и рассмотрим способы получения «живых» данных из ресурсов.

Почему значение ресурса в расшифровке по умолчанию пустое

Разберем ситуацию: при использовании метода ДанныеРасшифровки(Идентификатор).ПолучитьПоля() для обычной ячейки со ссылкой мы получаем пару «Поле — Значение», где значение заполнено ссылкой на объект. Однако для ресурсов (сумм, количеств) значение часто остается пустым, хотя текст в ячейке присутствует.

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

Чтобы значение ресурса гарантированно попадало в расшифровку, проанализируем следующие шаги:

  1. Перейдем в настройки набора данных или в настройки конкретного поля в структуре отчета.
  2. Найдем свойство «Выражение расшифровки».
  3. Пропишем в этом свойстве имя самого поля ресурса. После этого система начнет передавать вычисленное значение в обработчик расшифровки, и оно станет доступно программно.

Получение числовых значений через свойства ячейки табличного документа

Если ваша задача — прочитать данные из уже сформированного ТабличногоДокумента, вы можете заметить, что свойство ячейки Значение содержит Неопределено, а число видно только в свойстве Текст. Использование текста для расчетов — плохая практика, так как число там представлено в виде строки с учетом региональных настроек (разделители групп разрядов, неразрывные пробелы и т.д.).

Для того чтобы СКД принудительно заполняла свойство Значение в ячейках табличного документа, мы можем использовать собственные макеты. Рассмотрим, как это сделать:

  1. Создадим макет поля или макет ресурса на закладке «Макеты» в схеме компоновки данных.
  2. В области макета для соответствующей ячейки установим свойство «Заполнение» в значение «Параметр».
  3. В параметрах макета укажем наше поле-ресурс.
  4. Важный момент: в свойствах параметра макета (в нижней части окна редактирования макета) необходимо явно указать Тип значения (например, Число).

При таком подходе СКД при выводе отчета заполнит не только видимый текст, но и объектное свойство Значение ячейки 1С. После этого при обходе табличного документа вы сможете обращаться к данным напрямую: ТекущаяОбласть.Значение.

Особенности использования макетов ресурсов в таблицах

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

Рассмотрим пример правильной настройки макета ресурса для таблицы. Если у вас в строках «Номенклатура», а в колонках «Склады», то в окне добавления макета ресурса нужно выбрать в поле «Группировки строк» — «Номенклатура», а в «Группировки колонок» — «Склады». Только тогда оформление и параметры расшифровки из макета применятся к ячейкам на пересечении.

Использование параметров расшифровки для сложной постобработки

Если вам нужно передать в расшифровку не одно число, а целый набор данных (например, структуру или массив для сложной логики), используйте свойство «Параметр расшифровки» в макете. Разберем по шагам:

  1. В макете ячейки в поле «Параметр расшифровки» впишите произвольное имя (например, ДополнительныеДанные).
  2. В таблице «Параметры» внизу появится эта строка. В колонке «Выражение» вы можете написать конструктор структуры:
    
    Новый Структура("Сумма, Количество, ТекстовоеОписание", СуммаОстаток, КоличествоОстаток, "Данные за период")
    
  3. Теперь при клике на ячейку в ДанныеРасшифровки по этому идентификатору вы получите не просто число, а целую структуру данных, которую можно использовать в процедуре ОбработкаРасшифровки на форме отчета.

Альтернативный подход: Вывод в коллекцию значений

Проанализируем ситуацию, когда целью является не визуальное представление, а именно получение данных для алгоритмов. Вместо того чтобы мучиться с расшифровкой табличного документа, эффективнее использовать ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений.

Посмотрим на пример кода для вывода в дерево значений:


ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);

ДеревоРезультата = Новый ДеревоЗначений;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ДеревоРезультата);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

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

Резюме

Подводя итог, можно выделить основные правила работы с ресурсами в СКД:

← На главную