При разработке интерфейсов на платформе 1С:Предприятие 8.3 часто возникает необходимость визуально выделить данные в таблицах или списках. Условное оформление позволяет изменять цвет фона, текста, шрифт и другие параметры ячеек в зависимости от определенных условий. В этой статье мы разберем, как правильно реализовать программную раскраску строк, проанализируем типичные ошибки при создании нескольких правил и научимся оптимизировать код для повторного использования.
Рассмотрим ситуацию, когда необходимо раскрасить строки таблицы в разные цвета в зависимости от строкового значения в колонке (например, "Синий" и "Зеленый"). Часто разработчики используют метод копирования фрагментов кода для создания второго правила оформления, что может привести к трудноуловимым ошибкам. Проанализируем пример кода, в котором одно условие работает корректно, а второе — нет.
Проблема в исходном коде заключалась в следующем фрагменте:
// Первое правило (Синий) — работает верно
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
// ... настройка отбора и цвета ...
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("тзТаб1");
// Второе правило (Зеленый) — НЕ работает
ЭлементОформления2 = УсловноеОформление.Элементы.Добавить();
// ... настройка отбора и цвета ...
ПолеОформления2 = ЭлементОформления.Поля.Элементы.Добавить(); // ОШИБКА ЗДЕСЬ
ПолеОформления2.Поле = Новый ПолеКомпоновкиДанных("тзТаб1");
Выясним причину некорректной работы. При создании второго правила (ЭлементОформления2) для добавления полей оформления была ошибочно использована переменная от первого правила (ЭлементОформления). В результате настройки для "Зеленого" цвета фактически перезаписывали или дополняли список полей "Синего" правила, а само второе правило оставалось без привязки к конкретным полям формы. Чтобы исправить это, необходимо строго следить за соответствием объектов: для каждого нового элемента коллекции УсловноеОформление.Элементы должны создаваться свои объекты отбора и полей.
Чтобы избежать ошибок при дублировании кода и сделать решение более гибким, целесообразно вынести логику создания правила в отдельную процедуру с параметрами. Это позволит добавлять неограниченное количество цветов, передавая лишь текстовое условие и целевой цвет.
Рассмотрим пример такой процедуры:
&НаСервере
Процедура ДобавитьОформлениеПоЦвету(ТекстУсловия, ЗначениеЦвета)
// Добавляем новый элемент оформления
Элемент = УсловноеОформление.Элементы.Добавить();
// Настраиваем отбор: поле "тзТаб1.Цвет" должно быть равно параметру ТекстУсловия
ЭлементОтбора = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("тзТаб1.Цвет");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = ТекстУсловия;
ЭлементОтбора.Использование = Истина;
// Устанавливаем визуальный параметр (ЦветФона)
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", ЗначениеЦвета);
// Указываем, какие поля нужно раскрасить (в данном случае всю таблицу)
ПолеОформления = Элемент.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("тзТаб1");
ПолеОформления.Использование = Истина;
Элемент.Использование = Истина;
КонецПроцедуры
Теперь мы можем вызвать эту процедуру для любого количества цветов:
ДобавитьОформлениеПоЦвету("Синий", Новый Цвет(100, 100, 255));
ДобавитьОформлениеПоЦвету("Зеленый", Новый Цвет(100, 255, 100));
ДобавитьОформлениеПоЦвету("Красный", WebЦвета.СветлоКоралловый);
Проанализируем дополнительные аспекты, которые критичны для производительности и корректности отображения интерфейса в 1С.
ПриЧтенииНаСервере или при нажатии кнопок, обязательно выполняйте метод УсловноеОформление.Элементы.Очистить(). В противном случае правила будут дублироваться при каждом вызове, что приведет к "раздуванию" памяти и резкому замедлению работы формы.Новый Цвет(R, G, B), рекомендуется использовать объект ЦветаСтиля или WebЦвета. Это гарантирует, что ваше оформление будет корректно отображаться как в светлой, так и в темной теме интерфейса "Такси". Например, ЦветаСтиля.ЦветФонаВыделения автоматически адаптируется под настройки системы.Поля. Если коллекция Элемент.Поля.Элементы пуста, платформа применяет оформление ко всем колонкам строки, что упрощает код и уменьшает количество объектов.УсловноеОформление применяются последовательно. Если одна и та же ячейка попадает под условия нескольких правил, применится то, которое находится ниже в списке (добавлено позже). Это позволяет создавать сложные иерархии оформления.СправочникСписок, ДокументСписок), оформление эффективнее настраивать через свойство самого списка: Список.УсловноеОформление. Это работает быстрее, так как платформа оптимизирует отрисовку на уровне запроса.Механизм условного оформления позволяет управлять не только цветом. Рассмотрим, какие еще параметры можно изменять программно:
Параметр "Доступность" и "ТолькоПросмотр". С помощью оформления можно заблокировать ввод данных в определенных строках на основании условий. Например, запретить редактирование строки, если документ уже проведен.
Параметр "Текст". Это мощный инструмент, позволяющий подменять отображаемое значение в ячейке, не меняя самих данных. Например, можно выводить слово "Критично" вместо числового кода ошибки.
Параметр "Видимость". Позволяет скрывать содержимое ячеек. Это удобно для очистки интерфейса от лишней информации в зависимости от контекста строки.
Разберем пример сложного условия (Группировка И/ИЛИ). Если нам нужно раскрасить строку только при выполнении нескольких условий одновременно, мы используем группы элементов отбора:
ГруппаОтбора = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
ЭлементОтбора1 = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора1.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Количество");
ЭлементОтбора1.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
ЭлементОтбора1.ПравоеЗначение = 100;
ЭлементОтбора2 = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора2.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Статус");
ЭлементОтбора2.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора2.ПравоеЗначение = "ВРезерве";
В заключение отметим, что программное управление условным оформлением — это гибкий инструмент, требующий внимательности к именам переменных и структуре объектов. Используя процедурный подход и учитывая системные настройки платформы, вы сможете создавать профессиональные и быстродействующие интерфейсы.