При разработке интерфейсов на платформе 1С:Предприятие 8.3 часто возникает задача визуального выделения данных в табличных частях. Если для простых условий достаточно интерактивной настройки в конфигураторе, то для динамически меняющихся правил или сложных алгоритмов требуется программное управление механизмом УсловноеОформление. В этой статье мы подробно разберем, как избежать типичных ошибок при добавлении нескольких условий оформления и научимся правильно группировать отборы.
Рассмотрим ситуацию, когда нам необходимо раскрасить строки в зависимости от значения скидки: если скидка больше 10 — синим, если больше 20 — зеленым. Типичная ошибка начинающего разработчика заключается в том, что он пытается добавить несколько отборов в один и тот же элемент оформления или не учитывает порядок их применения. Проанализируем, как система обрабатывает правила: условное оформление применяется последовательно. Если строка удовлетворяет нескольким правилам, приоритет будет иметь то, которое находится ниже в списке (добавлено последним).
Если мы напишем код, где сначала идет условие Больше 10, а затем Больше 20, то для значения 25 сработают оба правила. В итоге применится оформление от второго правила. Однако, если логика сложнее (например, используются разные поля), правила могут конфликтовать или затирать друг друга. Выясним причину, почему в коде автора из обсуждения «перестает краситься» первый вариант: часто это связано с неправильным обращением к коллекции Элементы или отсутствием четкого разделения между разными объектами оформления.
Самый простой и надежный способ — создать для каждого цвета отдельный элемент в коллекции УсловноеОформление. Давайте разберем этот процесс по шагам. Важно помнить, что мы работаем с коллекцией ЭтаФорма.УсловноеОформление (для обычных ТЧ документа) или Список.КомпоновкаДанных.Настройки.УсловноеОформление (для динамических списков).
Посмотрим на пример кода, реализующий два независимых правила:
// Очистим текущие настройки, чтобы избежать дублирования при повторном вызове
ЭтаФорма.УсловноеОформление.Элементы.Очистить();
// ПРАВИЛО №1: Скидка больше 10 (Синий цвет)
Элемент1 = ЭтаФорма.УсловноеОформление.Элементы.Добавить();
Элемент1.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Синий);
Отбор1 = Элемент1.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор1.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.МаксимальноДоступнаяСкидка");
Отбор1.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
Отбор1.ПравоеЗначение = 10;
// Укажем, какое именно поле красить (если не указать, покрасится вся строка)
ПолеОформления1 = Элемент1.Поля.Элементы.Добавить();
ПолеОформления1.Поле = Новый ПолеКомпоновкиДанных("ТоварыМаксимальноДоступнаяСкидка");
// ПРАВИЛО №2: Скидка больше 20 (Зеленый цвет)
Элемент2 = ЭтаФорма.УсловноеОформление.Элементы.Добавить();
Элемент2.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Зеленый);
Отбор2 = Элемент2.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор2.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.МаксимальноДоступнаяСкидка");
Отбор2.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
Отбор2.ПравоеЗначение = 20;
ПолеОформления2 = Элемент2.Поля.Элементы.Добавить();
ПолеОформления2.Поле = Новый ПолеКомпоновкиДанных("ТоварыМаксимальноДоступнаяСкидка");
Важный нюанс: Чтобы правило «Больше 20» корректно перекрывало «Больше 10», оно должно быть добавлено в коллекцию позже. Если вы хотите, чтобы условия были взаимоисключающими (например, от 10 до 20 — один цвет, от 20 до 30 — другой), лучше использовать вид сравнения Между.
Иногда требуется раскрасить строку только при одновременном выполнении нескольких условий (например, Скидка > 10 И Остаток > 0). Для этого в программном коде используются объекты типа ГруппаЭлементовОтбораКомпоновкиДанных. Проанализируем ситуацию: если мы просто добавим два элемента отбора в один ЭлементУсловногоОформления, система по умолчанию объединит их по логике «И». Но если нам нужна более сложная вложенность, без групп не обойтись.
Рассмотрим подробнее создание группы условий:
Элемент = ЭтаФорма.УсловноеОформление.Элементы.Добавить();
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СветлоЖелтый);
// Создаем группу условий "ИЛИ"
ГруппаИЛИ = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаИЛИ.ТипГруппы = ТипГруппыЭлементовОтбора.ГруппаИЛИ;
// Добавляем условия в группу
Отбор1 = ГруппаИЛИ.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор1.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Количество");
Отбор1.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
Отбор1.ПравоеЗначение = 5;
Отбор2 = ГруппаИЛИ.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор2.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.СпецЗаказ");
Отбор2.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Отбор2.ПравоеЗначение = Истина;
В данном примере строка будет подсвечена желтым фоном, если количество меньше 5 ИЛИ если установлен флаг «СпецЗаказ».
Чтобы ваше решение работало эффективно и не замедляло интерфейс, придерживайтесь следующих правил:
УсловноеОформление.Элементы.Очистить() перед программным заполнением в процедуре ПриСозданииНаСервере. Если этого не сделать, при каждом обновлении формы (например, при вызове из кода) правила будут дублироваться, что приведет к «тормозам».Элемент.Поля.Элементы. Если оставить её пустой, 1С будет красить всю строку целиком. Это часто выглядит избыточно и мешает чтению данных в других колонках.ПолеКомпоновкиДанных для отбора указывается путь к данным (например, Объект.Товары.Цена), а в ОформляемыеПоля указывается имя элемента формы — колонки (например, ТоварыЦена).WebЦвета, старайтесь использовать ЦветаСтиля. Это позволит оформлению корректно отображаться как в стандартной, так и в темной теме интерфейса «Такси».Таким образом, мы выяснили, что секрет успешной программной раскраски заключается в правильном управлении коллекцией элементов оформления и понимании иерархии отборов компоновки данных. Используйте раздельные элементы для разных цветов и группы отборов для сложной логики — это сделает ваш код чистым, а интерфейс — интуитивно понятным для пользователя.