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