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

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

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

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

Принцип работы условного оформления и ограничения

Проанализируем ключевые особенности механизма управляемых форм:

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

Пошаговое решение: интерактивная настройка

Рассмотрим стандартный порядок действий при работе с табличной частью обработки:

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

Программная настройка условного оформления

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


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

Поддержка интерактивного редактирования строк

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

  1. Для элемента формы ТоварыНоменклатура создаем клиентский обработчик события ПриИзменении.
  2. В обработчике получаем текущую строку через Элементы.Товары.ТекущиеДанные.
  3. Вызываем серверную функцию, считывающую актуальную категорию для выбранной позиции из регистра сведений, и записываем полученное значение в реквизит Категория текущей строки.

&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
    
    ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
    Если ТекущаяСтрока = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Получаем категорию номенклатуры с сервера и помещаем в строку
    ТекущаяСтрока.Категория = ПолучитьКатегориюНоменклатуры(ТекущаяСтрока.Номенклатура);
    
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьКатегориюНоменклатуры(НоменклатураСсылка)
    
    Если Не ЗначениеЗаполнено(НоменклатураСсылка) Тогда
        Возврат Справочники.КатегорииНоменклатуры.ПустаяСсылка();
    КонецЕсли;
    
    // Получение значения из регистра сведений
    Возврат РегистрыСведений.КатегорииОбъектов.ПолучитьПоследнее(, Новый Структура("Объект", НоменклатураСсылка)).Категория;
    
КонецФункции

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

Альтернативный вариант: Использование динамического списка

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

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

← На главную