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