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

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

В процессе разработки на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с необходимостью визуального выделения строк в динамических списках. Особенно остро этот вопрос встает, когда условие оформления зависит от значений Дополнительных реквизитов. В типовых конфигурациях, таких как УНФ 3.0, ЗУП 3.1 или ERP, механизм дополнительных реквизитов реализован через табличные части, что создает определенные трудности при попытке настроить стандартное условное оформление. Разберем по шагам, почему классический подход может не работать и как правильно реализовать задачу программно.

Проблема: Почему не срабатывает отбор по табличной части дополнительных реквизитов?

Рассмотрим ситуацию: у документа (например, Приходная накладная) создано несколько дополнительных реквизитов, таких как "Состояние" и "Номер приходной накладной". Если мы попытаемся добавить элемент условного оформления, обращаясь напрямую к пути ДополнительныеРеквизиты.Свойство и ДополнительныеРеквизиты.Значение, система столкнется с логической коллизией.

Проанализируем причину: в базе данных дополнительные реквизиты хранятся в виде строк табличной части. Когда в документе заполнено два реквизита, это две разные записи в таблице. Динамический список при выполнении запроса и наложении оформления проверяет строки. Если условие требует, чтобы Свойство было равно "Состояние", а Значение — "В работе", то система находит первую строку (например, с номером накладной), видит, что она не подходит под условие "Состояние", и переходит к следующей. Однако механизм условного оформления в динамических списках часто некорректно обрабатывает такие связи "один-ко-многим", особенно если реквизиты не выведены в список как отдельные колонки. В итоге, если у документа заполнено более одного доп. реквизита, оформление просто перестает применяться.

Решение №1: Использование виртуальных (синтетических) полей

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

Выясним, как правильно сослаться на такое поле в коде. Вместо обращения к коллекции ДополнительныеРеквизиты, следует использовать путь к данным, который выглядит как Ссылка.[ИмяРеквизита] ([ИмяВладельца]).

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


&НаСервере
Процедура ИТФПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    УсловноеОформлениеКД = Список.КомпоновщикНастроек.Настройки.УсловноеОформление;
    
    // Создаем новый элемент оформления
    ЭлементУсловногоОформления = УсловноеОформлениеКД.Элементы.Добавить();
    
    // Устанавливаем визуальные свойства (например, красный цвет текста)
    ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Красный); 
    ЭлементУсловногоОформления.Использование = Истина;
    ЭлементУсловногоОформления.Представление = "Оформление строки по состоянию 'В работе'";
    
    // Настраиваем отбор, используя синтетическое поле
    ЭлементОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    
    // Важно: используем путь к полю, сформированный БСП
    ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Ссылка.Состояние (Приходные накладные)");
    ЭлементОтбора.ВидСравнения    = ВидСравненияКомпоновкиДанных.Равно;
    
    // Получаем значение из предопределенных настроек или констант
    ЭлементОтбора.ПравоеЗначение  = ИТФДобавленное.ПолучитьЗначениеПоКлючу("Состояние_ВРаботе"); 
    ЭлементОтбора.Использование = Истина;
    
КонецПроцедуры

Важный нюанс: Чтобы узнать точное имя поля для вашего реквизита, рекомендуется открыть форму в режиме пользователя, зайти в "Настройки списка" -> "Условное оформление" и посмотреть, как поле называется в доступных полях выбора. Обычно оно совпадает с заголовком реквизита и названием объекта в скобках.

Решение №2: Программная корректировка существующего оформления

Иногда задача усложняется тем, что нужно не добавить новое оформление, а изменить то, которое уже создано системой автоматически (например, в ЗУП 3.1). Рассмотрим типичную ошибку при попытке перебора элементов оформления:

Попытка сравнения Строка(ОформлениеПоля.Поля) = "ИмяПоля" не увенчается успехом. Свойство Поля — это не строка, а коллекция ОформлениеПоляКомпоновкиДанных. Чтобы найти нужное поле, необходимо проанализировать каждый элемент этой коллекции.

Проанализируем правильный алгоритм поиска и изменения оформления:

  1. Обходим циклом коллекцию УсловноеОформление.Элементы.
  2. Внутри каждого элемента запускаем вложенный цикл по ОформлениеПоля.Поля.Элементы.
  3. Сравниваем свойство Поле с искомым типом ПолеКомпоновкиДанных.
  4. Если поле найдено, устанавливаем требуемый параметр оформления (например, ЦветФона).

Процедура КорректировкаОформления(НужноеИмяПоля)
    Для Каждого ЭлементОформления Из ЭтаФорма.УсловноеОформление.Элементы Цикл
        Для Каждого ОформляемоеПоле Из ЭлементОформления.Поля.Элементы Цикл
            Если Строка(ОформляемоеПоле.Поле) = НужноеИмяПоля Тогда
                // Устанавливаем цвет фона (оранжевый)
                ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(255, 157, 100));
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры

Особенности отображения цвета фона и шрифта

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

1. Приоритет пользовательских настроек. Если пользователь самостоятельно изменил оформление через меню "Еще -> Настроить список", программные настройки могут быть проигнорированы. Для решения этой проблемы рекомендуется программно очищать настройки формы при первом открытии или использовать ИдентификаторПользовательскойНастройки, чтобы ваше оформление было видно пользователю и он мог им управлять.

2. Ограничения операционной системы. Замечено, что в некоторых версиях платформы (особенно под управлением Linux) или в Веб-клиенте параметр ЦветФона может отображаться некорректно или игнорироваться при включенном режиме чередования цветов строк. В таких случаях надежнее использовать ЦветТекста или изменение начертания шрифта (свойство Шрифт, установка жирного начертания).

3. Режим отрисовки формы. Если вы меняете оформление динамического списка, убедитесь, что вы работаете с Список.КомпоновщикНастроек.Настройки.УсловноеОформление, а не с ЭтаФорма.УсловноеОформление, если только вы не хотите оформить элементы самой формы, не связанные с данными списка.

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

← На главную