Как выделить цветом строки табличной части по условию в управляемых формах 1С?

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

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

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

Способ 1. Интерактивная настройка в свойствах формы

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

Рассмотрим по шагам процесс интерактивной настройки:

  1. Открываем нужную управляемую форму в конфигураторе.
  2. В окне элементов или реквизитов формы переходим к корневому элементу Форма и открываем окно ее свойств.
  3. Находим свойство Условное оформление и нажимаем кнопку открытия (педаль/троеточие).
  4. Нажимаем Добавить для создания нового элемента оформления.
  5. На вкладке Оформление отмечаем флажком параметр Цвет фона (или Цвет текста) и выбираем необходимый цвет (например, красный или желтый).
  6. На вкладке Условие задаем правило отбора. Указываем левое значение (путь к реквизиту табличной части, например, Объект.ТО.Дельта), вид сравнения (например, Меньше) и правое значение (0).
  7. На вкладке Оформляемые поля указываем колонки, которые должны окрашиваться. Важный нюанс: если оставить список оформляемых полей пустым, оформление автоматически применится ко всей строке целиком.

Способ 2. Программная настройка условного оформления

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

Посмотрим на пример программного создания элемента условного оформления для подсветки строки красным цветом, если расчетное значение колонки меньше нуля:


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

    // Добавляем новый элемент условного оформления
    ЭлементОформления = УсловноеОформление.Элементы.Добавить();
    
    // 1. Устанавливаем оформление (цвет фона)
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Красный);
    ЭлементОформления.Использование = Истина;

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

    // 3. Указываем оформляемые поля
    // Если требуется выделить конкретные колонки:
    ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТОНомерМашины");
    ПолеОформления.Использование = Истина;

    ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТОТекущийПробег");
    ПолеОформления.Использование = Истина;

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

Обратите внимание на адресацию полей:

  1. В объекте ЭлементОтбора.ЛевоеЗначение указывается полный путь к данным реквизита: Объект.ИмяТабличнойЧасти.ИмяРеквизита.
  2. В коллекции ЭлементОформления.Поля указывается имя элемента формы (колонки таблицы на форме): ИмяТабличнойЧастиИмяРеквизита.
  3. Если не добавлять поля в коллекцию ЭлементОформления.Поля, то при выполнении условия цветом выделится вся строка таблицы.

Сравнение значений двух колонок одной строки

Нередко требуется сравнить две колонки одной и той же строки между собой (например, если фактический пробег превысил значение нормы). В свойство ПравоеЗначение отбора можно передавать не только константы, но и другое поле строки.

Разберем, как передать поле в правое значение:


// Сравнение: ТекущийПробег >= Норма
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ТО.ТекущийПробег");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
ЭлементОтбора.ПравоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ТО.Норма");
ЭлементОтбора.Использование = Истина;

Сложные формулы и динамические расчеты

Механизм условного оформления формы не поддерживает вычисление произвольных арифметических формул (например, Норма * 0.1 или ТекущийПробег - Норма) прямо внутри отбора.

Для реализации сложной логики применяются следующие подходы:

  1. Вспомогательный реквизит табличной части: создается реквизит (например, Дельта или булев флаг ТребуетсяТО). Его значение рассчитывается при заполнении таблицы на сервере и пересчитывается на клиенте в событиях ПриИзменении числовых колонок. Условное оформление настраивается на простое сравнение этого реквизита.
  2. Динамические списки: если данные отображаются через Динамический список, все формулы и условия с процентами рассчитываются непосредственно в тексте запроса через конструкцию ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ. Полученное поле списка затем используется в отборе условного оформления.

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

← На главную