При разработке интерфейсов на управляемых формах разработчики часто сталкиваются с задачей визуального выделения конкретных данных: например, подсветить цветом только ту ячейку таблицы, значение которой было изменено пользователем. Попытка решить эту задачу прямым изменением свойств элемента формы приводит к неожиданным результатам, а попытка динамически назначить обработчик вызывает вопросы о его параметрах. Разберем обе эти проблемы детально.
Выясним причину такого поведения платформы. В управляемом интерфейсе 1С архитектура отображения данных принципиально отличается от обычных форм:
ПолеФормы представляет собой элемент управления всей колонки целиком, а не конкретную ячейку в строке.Поле.ЦветФона = Новый Цвет(...), мы меняем визуальное свойство элемента управления столбца. В результате платформа применяет указанный цвет ко всем ячейкам этого столбца во всех строках таблицы.ОформлениеСтрок или ОформлениеСтроки не принесут результата: эти механизмы (и сопутствующие события ПриВыводеСтроки или ПриПолученииДанных) существовали только для элемента ТабличноеПоле в обычном приложении. В управляемых формах для элемента ТаблицаФормы их нет.Промежуточным компромиссом иногда выступает свойство Поле.ЦветФонаЗаголовка, позволяющее визуально отметить всю колонку в шапке, но для точечной подсветки ячеек в конкретных строках требуется другой штатный механизм платформы.
Штатным и наиболее производительным способом раскраски конкретных ячеек на управляемой форме является использование коллекции УсловноеОформление формы. Проанализируем правильный алгоритм реализации:
Изменено (ее можно скрыть от пользователя, не добавляя в элементы формы).ПриСозданииНаСервере) программно формируем правило условного оформления.СтрокаТаблицы.Изменено = Истина. Платформа самостоятельно и мгновенно перерисует цвет нужной ячейки на клиенте без лишних серверных вызовов.Посмотрим на пример программной настройки условного оформления на сервере:
&НаСервере
Процедура НастроитьОформлениеИзмененныхЯчеек()
// 1. Создаем новый элемент условного оформления
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
// 2. Указываем оформление: цвет фона ячейки
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(197, 255, 185));
// 3. Задаем условие отбора (когда флаг Изменено равен Истина)
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("МояТаблицаЗначений.Изменено");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Истина;
ЭлементОтбора.Использование = Истина;
// 4. Ограничиваем область оформления конкретной колонкой
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("МояТаблицаЗначенийАртикул");
ОформляемоеПоле.Использование = Истина;
КонецПроцедуры
Обратите внимание: если не заполнить коллекцию ЭлементОформления.Поля, то при выполнении условия цветом будет выделена вся строка целиком. Добавление конкретного поля гарантирует подсветку ровно одной ячейки.
Рассмотрим вторую часть вопроса: разработчик динамически назначает обработчик события с помощью метода ТаблицаФормы.УстановитьДействие(), но не знает, какую сигнатуру параметров должна иметь целевая процедура.
Рассмотрим два надежных способа узнать точный список и типы параметров:
Открываем «Синтаксис-помощник» и переходим по ветке: Интерфейс (управляемый) $\rightarrow$ Элементы управляемой формы $\rightarrow$ выбираем нужный элемент (например, Таблица формы или Поле формы) $\rightarrow$ раздел События.
В описании каждого события (например, Выбор, ПриАктивизацииСтроки, ПередНачаломИзменения) приводится точный список параметров, их порядок, типы и контекст вызова.
В визуальном редакторе управляемой формы выделяем нужный элемент управления и открываем окно «Свойства». В самом низу палитры находится список всех событий элемента. Нажатие на кнопку с увеличительным стеклом или лупой напротив события автоматически генерирует в модуле формы процедуру со всеми необходимыми параметрами.
Разберем пример: для события Выбор у таблицы формы процедура-обработчик обязана принимать четыре параметра:
&НаКлиенте
Процедура ВыборПоля(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
// Элемент - ТаблицаФормы, для которой вызвано событие
// ВыбраннаяСтрока - идентификатор текущей строки
// Поле - ПолеФормы, в котором был совершен клик/выбор
// СтандартнаяОбработка - Булево, флаг выполнения стандартных действий платформы
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Важное ограничение: метод УстановитьДействие доступен исключительно на сервере. Однако сама процедура, имя которой передается в качестве действия для интерактивных событий (таких как Выбор), должна иметь директиву компиляции &НаКлиенте, так как пользовательские действия обрабатываются клиентской частью приложения.