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