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

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

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

Анализ проблемы: почему окрашиваются все строки?

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

Проанализируем фрагмент исходного кода с ошибкой:


ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СуммаНачислено");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;   
ЭлементОтбора.ПравоеЗначение = Новый ПолеКомпоновкиДанных("СуммаОплачено");

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

Решение 1: Правильное программное оформление

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

Посмотрим на полностью рабочий пример кода:


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

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

Решение 2: Интерактивная настройка в конфигураторе

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

  1. Откройте свойства динамического списка и перейдите к настройке условного оформления.
  2. В поле отбора выберите левое значение (например, СуммаОплачено).
  3. В колонке правого значения нажмите на кнопку очистки (крестик), чтобы сбросить тип данных по умолчанию.
  4. Нажмите на кнопку выбора типа (буква "Т") и выберите тип ПолеКомпоновкиДанных.
  5. Теперь вы сможете выбрать второе поле из вашего динамического списка (например, СуммаНачислено).

Рекомендации по производительности и сложным отборам

Проанализируем лучшие практики от фирмы 1С при работе с оформлением списков:

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

2. Оформление списка вместо формы
Если условие касается только данных таблицы, настраивайте оформление непосредственно в свойствах элемента формы "Таблица", а не в условном оформлении всей формы. Это ускоряет общую инициализацию и открытие окна.

3. Скрытие строк списка
Категорически не рекомендуется использовать условное оформление для управления свойством Видимость (попытка полностью скрыть строку таблицы). В веб-клиенте это приводит к серьезным визуальным багам и "тормозам" интерфейса. Если строку не нужно показывать, её следует отсекать на уровне текста запроса динамического списка.

← На главную