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

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

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

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

Типичная ошибка: почему нельзя красить строки через свойства элементов формы

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


Для Каждого СтрТЧ Из МояТЗ Цикл
    Если СтрТЧ.Статус = "Просрочено" Тогда
        Элементы.МояТЗКолонка.ЦветФона = Новый Цвет(255, 65, 18);
    КонецЕсли;
КонецЦикла;

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

Базовый пример: программная настройка условного оформления

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

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


&НаСервере
Процедура НастроитьОформлениеТаблицы()

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

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

Разберем детально каждый шаг выполнения этой настройки:

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

Динамическое изменение условий в процессе работы

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

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

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

Ограничения механизма и вычисляемая раскраска

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

  1. В отборе нельзя сравнить два поля одной строки между собой напрямую (например, нельзя записать условие КоличествоФакт < КоличествоПлан, так как правое значение отбора принимает только константы или конкретные значения).
  2. Нельзя взять цвет динамически из колонки таблицы значений (если в строке сохранено значение типа Цвет) — условное оформление требует создания отдельного правила для каждого конкретного цвета.

Если условие раскраски требует сложной бизнес-логики, сравнения полей или анализа внешних регистров, применим подход с вычисляемой служебной колонкой:

  1. Добавим в реквизит формы «ТаблицаЗначений» колонку ТребуетВнимания с типом Булево (или числовой код статуса цвета). Эту колонку не обязательно выводить в элементы интерфейса.
  2. В момент заполнения или пересчета таблицы на сервере программно рассчитаем значение этого поля для каждой строки.
  3. В условном оформлении зададим простое и быстрое правило с отбором: ИмяТаблицы.ТребуетВнимания Равно Истина.

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

← На главную