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

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

При работе с управляемыми формами разработчики часто сталкиваются с ограничением стандартного редактора Условного оформления. Одна из типичных задач — раскрасить строки в таблице (например, в списке товаров или этикеток), основываясь на том, входит ли значение конкретной колонки в динамически формируемый СписокЗначений или Массив.

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

Почему не работает визуальная настройка

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

Программная настройка условного оформления

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

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


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

КонецПроцедуры

Критический нюанс: Правильная адресация полей

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

Важно: Платформа чувствительна к этим путям. Если ошибиться в одном слове, отбор просто не найдет данные для сравнения.

Выбор между Списком значений и Массивом

Хотя вид сравнения ВСписке поддерживает и СписокЗначений, и Массив, на практике рекомендуется использовать Массив. В некоторых версиях платформы 8.2 и ранних 8.3 наблюдались проблемы при передаче сложных списков значений в настройки компоновки данных. Массив более «легковесен» и надежно сериализуется при вызовах между клиентом и сервером.

Оптимизация: когда вызывать код

Не стоит вызывать полную очистку и создание оформления при каждом движении мыши. Рассмотрим наиболее подходящие события:

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

Если вы часто обновляете список, лучше не удалять весь массив оформления через Очистить() (это удалит и те настройки, что вы сделали в конфигураторе руками), а находить свой элемент по индексу или заранее заданному свойству и обновлять в нем только ПравоеЗначение.

Альтернативный метод: Скрытый флаг (Золотой стандарт)

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

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

Выясним, что же делать, если цвет все равно не появляется? Проверьте типы данных. Если в колонке таблицы лежат Ссылки на справочник, а в вашем списке — Строки (названия), то сравнение ВСписке всегда будет давать результат Ложь. Типы данных в списке условий и в колонке таблицы должны совпадать идеально.

← На главную