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