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