К статье
Практический материал

Разработка и Конфигурация · 11 мин

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

Как программно настроить условное оформление в 1С: работа с коллекцией УсловноеОформление, отборы, оформляемые поля, примеры кода и типичные ошибки.

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

Программная установка выполняется через коллекцию УсловноеОформление формы или динамического списка. Каждый элемент этой коллекции содержит отбор (условие), оформление (что менять) и список оформляемых полей (где применять). Ниже разобраны структура элемента, типовые сценарии и ошибки, из-за которых оформление «не срабатывает».

Где живёт условное оформление и когда нужен программный подход

В управляемой форме условное оформление существует в двух местах: у самой формы (ЭтаФорма.УсловноеОформление) и у динамического списка (Список.УсловноеОформление). Оформление формы применяется к элементам формы, оформление списка — к строкам динамического списка, и оно работает даже тогда, когда список выводится без формы, например в отчётах или при программном обращении.

Программная установка оправдана, когда условия зависят от параметров, ролей пользователя, функциональных опций или когда однотипных правил много и их проще сгенерировать в цикле. Если правило одно-два и оно статично, проще настроить его в конструкторе формы — так его увидит и сможет поправить другой разработчик без чтения кода.

Структура элемента условного оформления

Каждый элемент коллекции содержит три обязательные части. Отбор — это условие, построенное по тем же принципам, что и отбор динамического списка: левое поле, вид сравнения, правое значение. Оформление — набор пар «параметр — значение», например ЦветФона, ЦветТекста, Шрифт, Доступность, Видимость, Текст. Поля — список имён колонок, к которым применяется оформление.

Дополнительно у элемента есть свойства Использование (включено ли правило) и Представление (человекочитаемое имя, видимое пользователю при настройке оформления). Если представление не задать, пользователь увидит техническую строку, что затрудняет самостоятельное отключение правил.

Элемент = УсловноеОформление.Элементы.Добавить();

Элемент.Представление = "Просроченные документы";

Элемент.Использование = Истина;

// Условие

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

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДатаОплаты");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;

ЭлементОтбора.ПравоеЗначение = ТекущаяДатаСеанса();

ЭлементОтбора.Использование = Истина;

// Что меняем

Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Красный);

// Где применяем

ПолеЭлемента = Элемент.Поля.Элементы.Добавить();

ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("ДатаОплаты");

ПолеЭлемента.Использование = Истина;

Установка оформления для динамического списка

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

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Элемент = Список.УсловноеОформление.Элементы.Добавить();

Элемент.Представление = "Не проведённые";

ОтборЭлемент = Элемент.Отбор.Элементы.Добавить(

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

ОтборЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Проведен");

ОтборЭлемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ОтборЭлемент.ПравоеЗначение = Ложь;

ОтборЭлемент.Использование = Истина;

Элемент.Оформление.УстановитьЗначениеПараметра(

"ЦветТекста", WebЦвета.Серый);

ПолеЭлемента = Элемент.Поля.Элементы.Добавить();

ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("Номер");

ПолеЭлемента.Использование = Истина;

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

Обратите внимание: в Поля указываются имена полей данных списка, а не имена элементов формы. Если колонка в списке называется «Номер», а элемент формы — «СписокНомер», в оформлении используется именно «Номер». Несовпадение имён — самая частая причина «молчащего» оформления.

Оформление табличной части и таблицы значений на форме

Для табличной части объекта или таблицы значений, выведенной на форму, оформление добавляется в ЭтаФорма.УсловноеОформление. Здесь в отборе указывается путь к данным через имя реквизита формы, например Объект.Товары.Цена, а в полях — имена элементов формы (колонок таблицы).

Элемент = УсловноеОформление.Элементы.Добавить();

ОтборЭлемент = Элемент.Отбор.Элементы.Добавить(

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

ОтборЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(

"Объект.Товары.Количество");

ОтборЭлемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ОтборЭлемент.ПравоеЗначение = 0;

ОтборЭлемент.Использование = Истина;

Элемент.Оформление.УстановитьЗначениеПараметра(

"ЦветФона", WebЦвета.СветлоЖелтый);

ПолеЭлемента = Элемент.Поля.Элементы.Добавить();

ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных("ТоварыКоличество");

ПолеЭлемента.Использование = Истина;

Чтобы оформление применилось ко всей строке таблицы, добавьте в Поля каждую видимую колонку. Удобно сделать это в цикле по подчинённым элементам таблицы формы — так при добавлении новой колонки правило не придётся переписывать.

Порядок действий
  1. 1
    Определите, где нужно оформление: у формы или у динамического списка
  2. 2
    В ПриСозданииНаСервере добавьте элемент в нужную коллекцию УсловноеОформление
  3. 3
    Заполните Отбор: левое значение — поле данных, вид сравнения, правое значение
  4. 4
    Установите параметры Оформления через УстановитьЗначениеПараметра
  5. 5
    Добавьте в Поля все колонки, к которым применяется правило
  6. 6
    Откройте форму и проверьте, что строки с нужными значениями подсвечены

Управление видимостью и доступностью колонок

Условное оформление умеет не только красить: параметры Видимость и Доступность позволяют скрывать колонку или блокировать её редактирование для строк, удовлетворяющих условию. Например, поле «Серия» можно сделать доступным только в строках, где номенклатура ведёт учёт по сериям.

Элемент.Оформление.УстановитьЗначениеПараметра("Доступность", Ложь);

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

Отборы по нескольким условиям и сравнение с полями

Несколько условий внутри одного элемента по умолчанию объединяются по «И». Если нужно «ИЛИ», добавьте группу отбора типа ГруппаЭлементовОтбораКомпоновкиДанных с типом группы ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли и размещайте условия внутри неё.

Вид сравнения ВСписке принимает список значений в правом значении — удобно для подсветки нескольких статусов одним правилом. Сравнение поля с другим полем строки (например, «Цена больше максимальной цены из той же строки») в условном оформлении формы напрямую не поддерживается: выход — вычисляемая колонка-флаг, заполняемая при изменении данных, и отбор уже по ней.

Маршрут решения

Как выбрать подход

Правило статично и одно-два на формуНастройте оформление в конструкторе формы, без кода
Правила зависят от ролей, параметров или генерируются в циклеДобавляйте элементы программно в ПриСозданииНаСервере
Нужно сравнить два поля одной строки между собойДобавьте вычисляемую колонку-флаг и стройте отбор по ней
Оформление должно работать вне формы, в отчётах по спискуЗадавайте оформление в коллекции динамического списка

Типичные ошибки и проверка результата

Главные причины, по которым оформление не работает: неверное имя поля в отборе или в списке полей, не установлен флаг Использование у элемента отбора, и код размещён не в том обработчике. Ещё одна ловушка — сравнение даты с ТекущаяДатаСеанса(): значение вычисляется один раз при создании формы и «застывает», для длительно открытых форм это может давать устаревший результат.

Проверяйте результат визуально: откройте форму, найдите строку, заведомо подпадающую под условие, и убедитесь, что оформление применилось именно к тем колонкам, которые перечислены в Поля. Затем проверьте строку, которая под условие не попадает, — она должна остаться без изменений.

Типичные ошибки
01
Указано имя элемента формы вместо имени поля данных — правило молча не срабатывает
02
Не установлено свойство Использование у элемента отбора — условие игнорируется
03
В Поля добавлена только одна колонка — оформляется ячейка, а не вся строка
04
Код размещён в ПриОткрытии на клиенте — коллекция условного оформления там недоступна, нужен серверный обработчик
05
Значение даты зафиксировано при создании формы — правило устаревает при долгой работе
Контрольные точки

Как проверить результат

Строка, подпадающая под условие
Норма

Подсвечена заданным цветом или скрыта нужная колонка

Тревожный признак

Внешний вид не изменился

Строка вне условия
Норма

Выглядит стандартно

Тревожный признак

Оформление применилось ко всем строкам — ошибка в отборе

Настройки пользователя
Норма

Правило видно с заданным Представлением

Тревожный признак

Отображается техническая строка без имени

Частые вопросы

Можно ли изменить условное оформление после создания формы?

Да, коллекция доступна на сервере в любой момент жизни формы. Можно найти элемент по представлению или индексу, изменить отбор или установить Использование = Ложь. Изменения применяются при следующем обновлении отображения данных.

Почему оформление работает в списке, но не работает в форме выбора?

Форма выбора может использовать тот же динамический список, но если оформление задано у формы, а не у списка, в другой форме оно не появится. Перенесите правила в коллекцию Список.УсловноеОформление — тогда они будут общими.

Как задать жирный шрифт через условное оформление?

Через параметр «Шрифт»: Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(,,Истина)) — третий параметр конструктора отвечает за полужирное начертание. Учтите, что явно заданный шрифт переопределяет стилевой, при смене темы интерфейса он не подстроится.

Сколько правил можно добавить без потери производительности?

Точного ограничения нет, но каждый элемент отбора вычисляется для каждой видимой строки. Десятки простых правил обычно незаметны, а сотни правил со сложными условиями могут замедлить прорисовку больших списков. Объединяйте однотипные условия через «ВСписке» и группы отборов.

Как программно удалить условное оформление, заданное в конфигураторе?

Элементы, заданные в свойствах формы в конфигураторе, присутствуют в той же коллекции. Найдите нужный элемент по представлению или индексу и вызовите УсловноеОформление.Элементы.Удалить(Элемент) либо отключите его через Использование = Ложь, если удалять правило нельзя.

Работает ли условное оформление в обычных формах?

Нет, описанный механизм относится к управляемым формам. В обычных формах подсветка строк реализуется через обработчики событий табличного поля, например «ПриПолученииДанных» или «ПриВыводеСтроки», где оформление ячеек задаётся вручную.

Итог

Что важно запомнить

Программное условное оформление — это элемент коллекции УсловноеОформление с тремя частями: Отбор, Оформление, Поля. Код размещают на сервере, имена полей берут из данных, а не из элементов формы, и каждое правило проверяют на строке внутри условия и вне его.