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

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

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

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

Архитектурные ограничения управляемых форм

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

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

Способ 1. Использование булевых реквизитов-флагов в табличной части

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

Для реализации этого подхода в структуру табличной части добавляются вспомогательные колонки с типом Булево для каждого контролируемого дня или показателя (например, для колонки День1 создается реквизит День1_Изменен):

  1. Размещаем на форме основную колонку День1. Вспомогательную колонку День1_Изменен на форму выводить не требуется или можно оставить скрытой.
  2. В обработчике события ПриИзменении поля ввода День1 устанавливаем значение флага:

&НаКлиенте
Процедура ТабельДень1ПриИзменении(Элемент)
    СтрокаТаблицы = Элементы.Табель.ТекущиеДанные;
    Если СтрокаТаблицы <> Неопределено Тогда
        СтрокаТаблицы.День1_Изменен = Истина;
    КонецЕсли;
КонецПроцедуры

Затем в редакторе формы переходим на вкладку Условное оформление и добавляем новое правило:

  1. Оформление: указываем параметр ЦветФона (например, мягкий зеленый или красный цвет).
  2. Условие: выбираем поле Объект.Табель.День1_Изменен, вид сравнения — Равно, значение — Истина.
  3. Оформляемые поля: указываем конкретное поле формы — ТабельДень1.

Способ 2. Сравнение с эталонным (плановым) значением через ПолеКомпоновкиДанных

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

Чтобы не хранить множество булевых флагов, добавим в табличную часть скрытый реквизит День1_План с исходным значением. В механизме условного оформления 1С доступно прямое сравнение двух колонок строки между собой. Для этого в правом значении отбора используется не статическая константа, а объект ПолеКомпоновкиДанных.

Настроим такое правило программно при создании формы на сервере:


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

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

Когда таблица содержит большое количество однотипных колонок (например, 31 день месяца в табеле учета рабочего времени), настраивать условное оформление вручную в конфигураторе неэффективно. Гораздо удобнее сгенерировать правила в цикле при инициализации формы.

Посмотрим на пример кода, который формирует правила подсветки для всех 31 дней:


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

Способы оптимизации и альтернативные варианты

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

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