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

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

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

Почему окрашивается вся колонка целиком

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

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

Промежуточным компромиссом иногда выступает свойство Поле.ЦветФонаЗаголовка, позволяющее визуально отметить всю колонку в шапке, но для точечной подсветки ячеек в конкретных строках требуется другой штатный механизм платформы.

Решение: Индивидуальная раскраска ячеек через условное оформление

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

  1. Добавляем в реквизит формы (в коллекцию колонок таблицы значений) служебную колонку булевого типа, например, с именем Изменено (ее можно скрыть от пользователя, не добавляя в элементы формы).
  2. На сервере (например, в процедуре ПриСозданииНаСервере) программно формируем правило условного оформления.
  3. На клиенте при изменении значения в строке просто устанавливаем флаг СтрокаТаблицы.Изменено = Истина. Платформа самостоятельно и мгновенно перерисует цвет нужной ячейки на клиенте без лишних серверных вызовов.

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


&НаСервере
Процедура НастроитьОформлениеИзмененныхЯчеек()

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

КонецПроцедуры

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

Где найти параметры обработчиков событий элементов формы

Рассмотрим вторую часть вопроса: разработчик динамически назначает обработчик события с помощью метода ТаблицаФормы.УстановитьДействие(), но не знает, какую сигнатуру параметров должна иметь целевая процедура.

Рассмотрим два надежных способа узнать точный список и типы параметров:

  1. Через встроенный «Синтаксис-помощник»:

    Открываем «Синтаксис-помощник» и переходим по ветке: Интерфейс (управляемый) $\rightarrow$ Элементы управляемой формы $\rightarrow$ выбираем нужный элемент (например, Таблица формы или Поле формы) $\rightarrow$ раздел События.

    В описании каждого события (например, Выбор, ПриАктивизацииСтроки, ПередНачаломИзменения) приводится точный список параметров, их порядок, типы и контекст вызова.

  2. Через палитру свойств в конфигураторе:

    В визуальном редакторе управляемой формы выделяем нужный элемент управления и открываем окно «Свойства». В самом низу палитры находится список всех событий элемента. Нажатие на кнопку с увеличительным стеклом или лупой напротив события автоматически генерирует в модуле формы процедуру со всеми необходимыми параметрами.

Разберем пример: для события Выбор у таблицы формы процедура-обработчик обязана принимать четыре параметра:


&НаКлиенте
Процедура ВыборПоля(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    
    // Элемент - ТаблицаФормы, для которой вызвано событие
    // ВыбраннаяСтрока - идентификатор текущей строки
    // Поле - ПолеФормы, в котором был совершен клик/выбор
    // СтандартнаяОбработка - Булево, флаг выполнения стандартных действий платформы
    
    СтандартнаяОбработка = Ложь;

КонецПроцедуры

Важное ограничение: метод УстановитьДействие доступен исключительно на сервере. Однако сама процедура, имя которой передается в качестве действия для интерактивных событий (таких как Выбор), должна иметь директиву компиляции &НаКлиенте, так как пользовательские действия обрабатываются клиентской частью приложения.

← На главную