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