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

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

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

Разбор типичной ошибки при программном создании правил

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

Проблема в исходном коде заключалась в следующем фрагменте:


// Первое правило (Синий) — работает верно
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
// ... настройка отбора и цвета ...
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("тзТаб1");

// Второе правило (Зеленый) — НЕ работает
ЭлементОформления2 = УсловноеОформление.Элементы.Добавить();
// ... настройка отбора и цвета ...
ПолеОформления2 = ЭлементОформления.Поля.Элементы.Добавить(); // ОШИБКА ЗДЕСЬ
ПолеОформления2.Поле = Новый ПолеКомпоновкиДанных("тзТаб1");

Выясним причину некорректной работы. При создании второго правила (ЭлементОформления2) для добавления полей оформления была ошибочно использована переменная от первого правила (ЭлементОформления). В результате настройки для "Зеленого" цвета фактически перезаписывали или дополняли список полей "Синего" правила, а само второе правило оставалось без привязки к конкретным полям формы. Чтобы исправить это, необходимо строго следить за соответствием объектов: для каждого нового элемента коллекции УсловноеОформление.Элементы должны создаваться свои объекты отбора и полей.

Оптимизация кода: создание универсальной процедуры

Чтобы избежать ошибок при дублировании кода и сделать решение более гибким, целесообразно вынести логику создания правила в отдельную процедуру с параметрами. Это позволит добавлять неограниченное количество цветов, передавая лишь текстовое условие и целевой цвет.

Рассмотрим пример такой процедуры:


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

КонецПроцедуры

Теперь мы можем вызвать эту процедуру для любого количества цветов:


ДобавитьОформлениеПоЦвету("Синий", Новый Цвет(100, 100, 255));
ДобавитьОформлениеПоЦвету("Зеленый", Новый Цвет(100, 255, 100));
ДобавитьОформлениеПоЦвету("Красный", WebЦвета.СветлоКоралловый);

Важные нюансы работы с условным оформлением

Проанализируем дополнительные аспекты, которые критичны для производительности и корректности отображения интерфейса в 1С.

  1. Очистка коллекции перед созданием. Если вы вызываете программное создание оформления в обработчиках типа ПриЧтенииНаСервере или при нажатии кнопок, обязательно выполняйте метод УсловноеОформление.Элементы.Очистить(). В противном случае правила будут дублироваться при каждом вызове, что приведет к "раздуванию" памяти и резкому замедлению работы формы.
  2. Использование системных цветов. Вместо жесткого указания RGB-компонент через Новый Цвет(R, G, B), рекомендуется использовать объект ЦветаСтиля или WebЦвета. Это гарантирует, что ваше оформление будет корректно отображаться как в светлой, так и в темной теме интерфейса "Такси". Например, ЦветаСтиля.ЦветФонаВыделения автоматически адаптируется под настройки системы.
  3. Оформление всей строки целиком. Если ваша задача — раскрасить всю строку таблицы, а не отдельные колонки, вы можете не добавлять элементы в коллекцию Поля. Если коллекция Элемент.Поля.Элементы пуста, платформа применяет оформление ко всем колонкам строки, что упрощает код и уменьшает количество объектов.
  4. Приоритет правил. Помните, что правила в коллекции УсловноеОформление применяются последовательно. Если одна и та же ячейка попадает под условия нескольких правил, применится то, которое находится ниже в списке (добавлено позже). Это позволяет создавать сложные иерархии оформления.
  5. Работа с динамическими списками. Если вы работаете не с таблицей значений, а с динамическим списком (СправочникСписок, ДокументСписок), оформление эффективнее настраивать через свойство самого списка: Список.УсловноеОформление. Это работает быстрее, так как платформа оптимизирует отрисовку на уровне запроса.

Расширенные возможности оформления

Механизм условного оформления позволяет управлять не только цветом. Рассмотрим, какие еще параметры можно изменять программно:

Параметр "Доступность" и "ТолькоПросмотр". С помощью оформления можно заблокировать ввод данных в определенных строках на основании условий. Например, запретить редактирование строки, если документ уже проведен.

Параметр "Текст". Это мощный инструмент, позволяющий подменять отображаемое значение в ячейке, не меняя самих данных. Например, можно выводить слово "Критично" вместо числового кода ошибки.

Параметр "Видимость". Позволяет скрывать содержимое ячеек. Это удобно для очистки интерфейса от лишней информации в зависимости от контекста строки.

Разберем пример сложного условия (Группировка И/ИЛИ). Если нам нужно раскрасить строку только при выполнении нескольких условий одновременно, мы используем группы элементов отбора:


ГруппаОтбора = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;

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

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

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

← На главную