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