Почему не работает выражение представления для узлов иерархии в СКД и как это исправить?

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

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

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

Выясняем причину: почему ломается представление в узлах иерархии?

Для того чтобы понять корень проблемы, нам необходимо заглянуть во внутреннюю кухню СКД. Когда мы указываем для группировки тип «Иерархия» или «Иерархия только», система компоновки данных не просто выполняет исходный запрос. Она берет на себя задачу по достраиванию дерева связей.

В зависимости от структуры данных этот процесс происходит по-разному:

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

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

Теперь, когда мы понимаем физику процесса, давайте разберем по шагам методы решения этой проблемы.

Способ 1. Дублирование выражения представления в наборе данных «Иерархия»

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

Рассмотрим по шагам, как это сделать:

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

Важное примечание: при использовании этого метода обязательно убедитесь, что в иерархическом наборе данных доступны все реквизиты, используемые в выражении (в нашем примере это Артикул и Наименование). Если эти поля отсутствуют в выборке иерархического набора, выражение вернет пустую строку.

Способ 2. Использование механизма условного оформления (самый гибкий метод)

Существует еще более элегантный способ, который не требует вмешательства в структуру наборов данных и дублирования кода выражений. Мы можем использовать механизм Условного оформления на уровне настроек отчета. Этот способ хорош тем, что условное оформление применяется уже к готовому результату компоновки, независимо от того, из какого набора данных пришел конкретный узел дерева.

Разберем этот процесс по шагам:

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

Этот метод гарантирует, что оформление в виде подмены текста применится абсолютно ко всем уровням иерархии, включая системные родительские узлы, автоматически решая проблему.

Способ 3. Использование вычисляемых полей СКД

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

Проанализируем этот подход:

  1. Перейдем на вкладку «Вычисляемые поля» схемы компоновки данных.
  2. Добавим новое поле. Зададим ему имя, например, НоменклатураПредставление.
  3. В колонке «Выражение» напишем формулу формирования нашего представления: Номенклатура.Артикул + " - " + Номенклатура.Наименование
  4. Перейдем на вкладку «Настройки» и в структуре отчета заменим стандартное группировочное поле Номенклатура на созданное нами вычисляемое поле НоменклатураПредставление.

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

Способ 4. Контроль связей наборов данных и внешних источников

Иногда разработчики настраивают выражение представления в иерархическом наборе данных (Способ 1), но представление в узлах все равно не выводится. Давайте разберем, почему так происходит, и проверим типичные ошибки:

Дополнительно: решение сопутствующей проблемы «лишней иерархии»

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

Чтобы избежать этого визуального шума и сохранить красивое дерево, мы рекомендуем использовать системный отбор на уровне настроек группировки. Для этого выполните следующие действия:

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

Это позволит вам получить чистое, лаконичное и профессионально оформленное дерево данных, в котором каждый узел и каждый лист будут иметь именно то представление, которое вы задумали.

← На главную