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

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

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

Разбор проблемы: почему условия «перекрывают» друг друга?

Рассмотрим ситуацию, когда нам необходимо раскрасить строки в зависимости от значения скидки: если скидка больше 10 — синим, если больше 20 — зеленым. Типичная ошибка начинающего разработчика заключается в том, что он пытается добавить несколько отборов в один и тот же элемент оформления или не учитывает порядок их применения. Проанализируем, как система обрабатывает правила: условное оформление применяется последовательно. Если строка удовлетворяет нескольким правилам, приоритет будет иметь то, которое находится ниже в списке (добавлено последним).

Если мы напишем код, где сначала идет условие Больше 10, а затем Больше 20, то для значения 25 сработают оба правила. В итоге применится оформление от второго правила. Однако, если логика сложнее (например, используются разные поля), правила могут конфликтовать или затирать друг друга. Выясним причину, почему в коде автора из обсуждения «перестает краситься» первый вариант: часто это связано с неправильным обращением к коллекции Элементы или отсутствием четкого разделения между разными объектами оформления.

Вариант 1. Последовательное добавление элементов оформления

Самый простой и надежный способ — создать для каждого цвета отдельный элемент в коллекции УсловноеОформление. Давайте разберем этот процесс по шагам. Важно помнить, что мы работаем с коллекцией ЭтаФорма.УсловноеОформление (для обычных ТЧ документа) или Список.КомпоновкаДанных.Настройки.УсловноеОформление (для динамических списков).

Посмотрим на пример кода, реализующий два независимых правила:


// Очистим текущие настройки, чтобы избежать дублирования при повторном вызове
ЭтаФорма.УсловноеОформление.Элементы.Очистить();

// ПРАВИЛО №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 — другой), лучше использовать вид сравнения Между.

Вариант 2. Группировка условий (И, ИЛИ, НЕ)

Иногда требуется раскрасить строку только при одновременном выполнении нескольких условий (например, Скидка > 10 И Остаток > 0). Для этого в программном коде используются объекты типа ГруппаЭлементовОтбораКомпоновкиДанных. Проанализируем ситуацию: если мы просто добавим два элемента отбора в один ЭлементУсловногоОформления, система по умолчанию объединит их по логике «И». Но если нам нужна более сложная вложенность, без групп не обойтись.

Рассмотрим подробнее создание группы условий:


Элемент = ЭтаФорма.УсловноеОформление.Элементы.Добавить();
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СветлоЖелтый);

// Создаем группу условий "ИЛИ"
ГруппаИЛИ = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаИЛИ.ТипГруппы = ТипГруппыЭлементовОтбора.ГруппаИЛИ;

// Добавляем условия в группу
Отбор1 = ГруппаИЛИ.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор1.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Количество");
Отбор1.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
Отбор1.ПравоеЗначение = 5;

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

В данном примере строка будет подсвечена желтым фоном, если количество меньше 5 ИЛИ если установлен флаг «СпецЗаказ».

Методические рекомендации по работе с оформлением

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

  1. Очистка коллекции: Всегда выполняйте УсловноеОформление.Элементы.Очистить() перед программным заполнением в процедуре ПриСозданииНаСервере. Если этого не сделать, при каждом обновлении формы (например, при вызове из кода) правила будут дублироваться, что приведет к «тормозам».
  2. Оформляемые поля: Всегда заполняйте коллекцию Элемент.Поля.Элементы. Если оставить её пустой, 1С будет красить всю строку целиком. Это часто выглядит избыточно и мешает чтению данных в других колонках.
  3. Имена полей: Обратите внимание, что в ПолеКомпоновкиДанных для отбора указывается путь к данным (например, Объект.Товары.Цена), а в ОформляемыеПоля указывается имя элемента формы — колонки (например, ТоварыЦена).
  4. Использование стилей: Вместо жесткого кодирования цветов через WebЦвета, старайтесь использовать ЦветаСтиля. Это позволит оформлению корректно отображаться как в стандартной, так и в темной теме интерфейса «Такси».

Таким образом, мы выяснили, что секрет успешной программной раскраски заключается в правильном управлении коллекцией элементов оформления и понимании иерархии отборов компоновки данных. Используйте раздельные элементы для разных цветов и группы отборов для сложной логики — это сделает ваш код чистым, а интерфейс — интуитивно понятным для пользователя.

← На главную