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