Как программно реализовать условное оформление в табличной части на управляемых формах 1С 8.3

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

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

Основные принципы программного создания условного оформления

Условное оформление (УО) в управляемых формах — это декларативный механизм. Мы не раскрашиваем каждую строку в цикле при её выводе, а задаем системе набор правил: "если выполняется такое-то условие, то примени к таким-то полям такие-то настройки оформления".

Для программной реализации нам необходимо работать с коллекцией УсловноеОформление, которая доступна в контексте формы. Разберем по шагам типовой алгоритм добавления элемента оформления на сервере:

  1. Очищаем существующие правила (если это необходимо).
  2. Добавляем новый элемент в коллекцию УсловноеОформление.Элементы.
  3. Определяем оформляемые поля (колонки, которые будут менять вид).
  4. Настраиваем условия отбора (при каких значениях реквизитов сработает правило).
  5. Устанавливаем сами параметры оформления (цвет, шрифт, формат и т.д.).

Рассмотрим пример кода, который раскрашивает колонки в зависимости от значения месяца в строке:


&НаСервере
Процедура ВыполнитьУсловноеОформлениеФормы()
    // Очищаем старые правила, чтобы не дублировать их при повторном вызове
    УсловноеОформление.Элементы.Очистить();

    Для НомерМесяца = 2 По 12 Цикл
        НовыйЭлемент = УсловноеОформление.Элементы.Добавить();
        
        // 1. Указываем поля, к которым применяется оформление
        Для МесяцОформления = 1 По (НомерМесяца - 1) Цикл
            НовоеПоле = НовыйЭлемент.Поля.Элементы.Добавить();
            НовоеПоле.Использование = Истина;
            // Важно: указываем ИМЯ элемента формы (колонки)
            НовоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТаблицаПлановПлан" + МесяцОформления);
        КонецЦикла;

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

        // 3. Устанавливаем визуальные параметры
        НовыйЭлемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.БледноСиреневый);
        НовыйЭлемент.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(,, Истина));
    КонецЦикла;
КонецПроцедуры

Критическая разница между именами полей и путями к данным

Проанализируем ситуацию, когда код написан верно, но оформление не отображается. Самая частая причина — путаница в именовании. Выясним причину этого поведения:

В коллекции Поля необходимо указывать имя элемента формы. Это то имя, которое вы видите в дереве элементов формы (например, СписокТоварыЦена). В коллекции Отбор (свойство ЛевоеЗначение) необходимо указывать путь к данным реквизита (например, Объект.Товары.Цена). Если эти строки перепутать, платформа не сможет сопоставить правило с данными или визуальным элементом.

Пример правильного обращения:

Если у нас есть табличная часть План и колонка Категория, то код настройки отбора и поля будет выглядеть так:


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

// В Отбор пишем ПУТЬ К ДАННЫМ
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.План.ПланКатегория"); 
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Справочники.Категории.НайтиПоНаименованию("Важные");
ЭлементОтбора.Использование = Истина;

// В Поля пишем ИМЯ ЭЛЕМЕНТА ФОРМЫ
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ПланКатегория"); 
ПолеОформления.Использование = Истина;

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

Работа из внешних обработок: управление формой владельца

Сложной задачей является применение условного оформления "на лету" из внешней обработки, например, при заполнении документа. Если мы используем стандартный механизм заполнения через объект, мы имеем доступ к данным, но не к самой форме. Однако в 1С существует способ получить контекст формы.

Для этого в сведениях о внешней обработке (функция СведенияОВнешнейОбработке) необходимо указать тип использования команды ЗаполнениеФормы (вместо стандартного ВызовКлиентскогоМетода или ВызовСерверногоМетода).

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

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


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

Дополнительные возможности и оптимизация

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

С точки зрения производительности важно помнить следующее:

1. Место вызова: Программное оформление лучше всего настраивать один раз в процедуре ПриСозданииНаСервере. Если условия зависят от реквизитов объекта, платформа сама будет пересчитывать оформление на клиенте при изменении данных, повторно вызывать серверный код не нужно.

2. Приоритет: Элементы условного оформления применяются сверху вниз. Если строка попадает под два правила, сработает то, которое находится ниже в списке Элементы. Используйте метод Вставить(Индекс), если вам нужно задать правилу определенный приоритет.

3. Динамические списки: Помните, что у динамических списков есть свое собственное свойство УсловноеОформление (например, Список.УсловноеОформление). Его использование эффективнее для списков справочников или документов, так как часть условий может обрабатываться на уровне запроса к СУБД.

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

← На главную