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