Как изменить цвет текста в колонке табличной части в зависимости от значения?

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

В процессе разработки часто возникает задача визуального акцентирования внимания пользователя на определенных данных в таблицах. Например, необходимо подсветить красным цветом отрицательные остатки, нулевые цены или просроченные даты. Подход к реализации этой задачи кардинально различается в зависимости от того, на какой архитектуре форм реализован интерфейс конфигурации: на обычных формах (толстый клиент) или на управляемых формах.

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

Решение для управляемых форм: механизм условного оформления

В управляемом интерфейсе прямое манипулирование визуальными свойствами строк в процедурах вывода отсутствует из-за клиент-серверной архитектуры. Для визуальных модификаций применяется декларативный механизм — Условное оформление (коллекция УсловноеОформление).

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

Программную инициализацию условного оформления выполняем на стороне сервера, как правило, в процедуре ПриСозданииНаСервере. Разберем по шагам создание нового правила:

  1. Добавляем новый элемент в коллекцию УсловноеОформление.Элементы.
  2. Устанавливаем признак активности правила через свойство Использование.
  3. Задаем параметр оформления — в нашем случае ЦветТекста.
  4. Формируем отбор: указываем путь к полю источника данных, правое значение для сравнения и вид операции.
  5. Определяем список колонок формы, к которым должно применяться форматирование.

Посмотрим на пример кода, где отрицательное количество в табличной части «Товары» окрашивается в красный цвет:


&НаСервере
Процедура НастроитьОформлениеТаблицы()

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

	// 4. Определение оформляемого поля таблицы
	ОформляемоеПоле      = ЭлементОформления.Поля.Элементы.Добавить();
	ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТоварыКоличество");

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

Обратите внимание на ключевые особенности работы с условным оформлением на управляемых формах:

  1. Раскраска всей строки целиком: если требуется выделить не конкретную ячейку, а всю строку целиком, коллекцию ЭлементОформления.Поля оставляют пустой.
  2. Сложная бизнес-логика: платформа не позволяет вызывать функции или выполнять запросы непосредственно внутри отборов СКД. Если цвет зависит от сложного алгоритма (например, анализ свободных остатков), на форме создают дополнительный реквизит (служебную колонку) булевого или числового типа, заполняют его при расчете, а в правиле условного оформления анализируют уже эту колонку.
  3. Динамические списки: для списков документов или справочников условное оформление можно настраивать в свойстве самого динамического списка (Список.УсловноеОформление), где поля отбора привязываются к колонкам запроса списка.
  4. Порядок применения правил: если для одной и той же ячейки срабатывают несколько правил, платформа применяет их в порядке добавления. Правило, расположенное в списке ниже, переопределяет параметры вышестоящих правил.

Решение для обычных форм: событие «ПриВыводеСтроки»

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

Рассмотрим структуру данного обработчика:


Процедура ТоварыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
	
	Если ДанныеСтроки.Количество < 0 Тогда
		ОформлениеСтроки.Ячейки.Количество.ЦветТекста = WebЦвета.Красный;
	КонецЕсли;
	
КонецПроцедуры

В параметре ОформлениеСтроки передается интерфейс к оформлению текущей строки таблицы. Через коллекцию Ячейки мы получаем доступ к конкретной ячейке по имени колонки и переопределяем ее свойство ЦветТекста. Если требуется перекрасить текст всей строки, свойство устанавливается напрямую объекту оформления: ОформлениеСтроки.ЦветТекста = WebЦвета.Красный.

Оптимизация производительности в обычных формах

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

Если для раскраски требуется получение дополнительных данных из базы, вместо события ПриВыводеСтроки применяют событие таблицы ПриПолученииДанных. Разберем его отличия:

  1. Обработчик ПриПолученииДанных(Элемент, ОформленияСтрок) принимает массив объектов оформления сразу для всей порции строк, которые видны пользователю на экране в данный момент.
  2. Это позволяет собрать массив ссылок или ключей текущих строк, выполнить один пакетный запрос к базе данных и быстро распределить оформление по массиву ОформленияСтрок без торможения прокрутки.

Учет читаемости и контрастности

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

← На главную