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