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