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

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

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

Анализ проблемы: почему оформление не применяется?

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

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

Способ 1: Оформление через параметры и серверный контекст (Рекомендуемый)

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

Шаг 1. Вызов формы на клиенте:

В исходной форме подготовим параметры, которые будут содержать данные для отбора или оформления.


&НаКлиенте
Процедура ОткрытьФормуСНастройками(Команда)
    ПараметрыФормы = Новый Структура;
    СписокКодов = Новый Массив;
    СписокКодов.Добавить("001");
    СписокКодов.Добавить("005");
    
    ПараметрыФормы.Вставить("МассивДляОформления", СписокКодов);
    ОткрытьФорму("Справочник.Должности.ФормаВыбора", ПараметрыФормы);
КонецПроцедуры

Шаг 2. Настройка в открываемой форме:

В модуле открываемой формы проанализируем параметры и создадим элементы УО. Это гарантирует, что оформление применится до того, как пользователь увидит данные.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Параметры.Свойство("МассивДляОформления") Тогда
        УстановитьПрограммноеОформление(Параметры.МассивДляОформления);
    КонецЕсли;
КонецПроцедуры

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

Способ 2: Настройка динамического списка на клиенте

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

Посмотрим на пример реализации такой задачи в одной процедуре на клиенте:


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

Важные технические нюансы

Проанализируем тонкости, которые помогут избежать ошибок при работе с программным оформлением:

Правильные пути к полям: При создании объекта ПолеКомпоновкиДанных необходимо указывать имя поля из схемы компоновки данных динамического списка или имя реквизита. Если поле находится внутри объекта (например, код номенклатуры в списке заказов), путь может выглядеть как Номенклатура.Код.

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

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

Приоритетность: Программное условное оформление, добавленное в коллекцию формы или списка, обычно имеет приоритет над тем, что задано в конфигураторе. Однако оно может быть перекрыто настройками, которые пользователь установил вручную через меню «Настроить список...», если ваше оформление не добавлено в ФиксированныеНастройки компоновщика.

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

← На главную