Как программно настроить условное оформление для подмены значения в дереве значений 1С?

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

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

Давайте разберем, почему это происходит и какие существуют способы решения данной задачи.

Почему программная настройка УО может не работать?

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

Кроме того, условное оформление — это механизм оформления (визуального стиля), а не изменения данных. Использование параметра Текст для подмены значения является допустимым, но требует корректного заполнения Отбор, чтобы платформа понимала, к каким именно строкам применять данное правило.

Способ 1: Визуальная настройка в конфигураторе

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

Если после визуальной настройки функционал заработал, вы можете открыть модуль формы в отладчике и посмотреть, как именно платформа сформировала объекты ЭлементУсловногоОформления. Это лучший способ «подсмотреть» правильный синтаксис путей для вашего конкретного дерева.

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

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


// Пример настройки условного оформления для дерева
УО = ЭтаФорма.УсловноеОформление;  
УО.Элементы.Очистить();  

ЭлементУО = УО.Элементы.Добавить();
ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ИмяВашейКолонкиВДереве");
ОформляемоеПоле.Использование = Истина;

// Указываем, какое поле будет источником текста
ЭлементУО.Оформление.УстановитьЗначениеПараметра("Текст", Новый ПолеКомпоновкиДанных("Путь.К.ИсточникуДанных"));

// Добавляем отбор, чтобы оформление применилось
ЭлОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлОтбора.Использование = Истина;
ЭлОтбора.ЛевоеЗначение = Истина; // Или поле, которое всегда заполнено
ЭлОтбора.ПравоеЗначение = Истина;
ЭлОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

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

Способ 3: Использование обработчика «ПриПолученииДанных»

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

  1. В обработчике события вы получаете доступ к коллекции данных дерева.
  2. Вы можете в цикле пройтись по полученным данным.
  3. Вручную изменить визуальное представление нужных колонок для каждой строки.

Этот подход избавляет от проблем с путями в ПолеКомпоновкиДанных и позволяет реализовать любую логику отображения.

Рекомендации по реализации

При работе с деревьями на управляемых формах мы рекомендуем придерживаться следующих правил:

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

← На главную