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