Как программно настроить условное оформление в динамическом списке с несколькими условиями

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

В разработке на платформе 1С:Предприятие 8.3 часто возникает задача выделить цветом или шрифтом строки в динамическом списке, основываясь не на одном, а на нескольких логических условиях. Например, нам нужно подсветить документы, где дата превышает определенный порог, и при этом заполнено специфическое поле. Рассмотрим подробно, как реализовать такую задачу программно, проанализируем типичные ошибки и разберем нюансы работы с объектами компоновки данных.

Основы программного создания условного оформления

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

Любой элемент условного оформления состоит из трех ключевых частей:

  1. Оформление: что именно мы меняем (цвет, шрифт, текст, видимость).
  2. Отбор: при каких условиях оформление должно сработать.
  3. Поля: какие колонки (ячейки) будут изменены визуально.

Шаг 1. Создание элемента оформления и настройка стиля

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


ЭлементУО = УсловноеОформление.Элементы.Добавить();
ЭлементУО.Использование = Истина;
ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Красный);

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

Шаг 2. Настройка сложного условия (Группа И)

Выясним, как добавить два условия, которые должны выполняться одновременно. Для этого в свойство Отбор нашего элемента УО нужно добавить группу элементов. Рассмотрим пример, где должны совпасть два фактора: поле мНачДатаЭДО заполнено, а Дата документа больше или равна этой дате.


ГруппаОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
ГруппаОтбора.Использование = Истина;

Теперь внутрь этой группы мы добавим сами условия. Первое условие — проверка на заполненность:


ЭлементОтбора1 = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора1.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список.мНачДатаЭДО");
ЭлементОтбора1.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;
ЭлементОтбора1.Использование = Истина;

Обратите внимание на объект ПолеКомпоновкиДанных. Мы указываем путь к данным поля, часто с префиксом имени основного реквизита списка (например, Список.).

Шаг 3. Сравнение двух полей между собой

Это самая ответственная часть. Часто разработчики совершают ошибку, пытаясь сравнить поле с другим полем как со значением. Если мы хотим сравнить Дата и мНачДатаЭДО, то ПравоеЗначение также должно быть объектом ПолеКомпоновкиДанных.


ЭлементОтбора2 = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора2.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список.Дата");
ЭлементОтбора2.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
// Критически важная строка:
ЭлементОтбора2.ПравоеЗначение = Новый ПолеКомпоновкиДанных("Список.мНачДатаЭДО");
ЭлементОтбора2.Использование = Истина;

Если в ПравоеЗначение передать просто дату или строку, система будет искать именно это статичное значение, а не брать его из соседней колонки каждой строки списка.

Шаг 4. Указание оформляемых полей

Теперь выберем, какие именно колонки в списке должны покраситься. Если мы хотим выделить только колонку Контрагент, добавим её в коллекцию Поля.


ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Контрагент");
ОформляемоеПоле.Использование = Истина;

Нюанс именования: в зависимости от того, где настраивается УО (в форме или в списке), имя поля может требовать или не требовать префикса. Если Список.Контрагент не срабатывает, попробуйте просто Контрагент. Также проверьте, чтобы поле было включено в состав "Выбранных полей" динамического списка, иначе система компоновки его "не увидит".

Использование методов БСП для упрощения кода

Рассмотрим более современный способ написания того же функционала, если в вашей конфигурации используется Библиотека стандартных подсистем (БСП). Код становится значительно компактнее и читаемее благодаря общим модулям.


ЭлементУО = УсловноеОформление.Элементы.Добавить();
ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Красный);

// Используем БСП для добавления полей
КомпоновкаДанныхКлиентСервер.ДобавитьОформляемоеПоле(ЭлементУО.Поля, "Контрагент");

// Используем БСП для добавления условий
ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ЭлементУО.Отбор,
    "Список.мНачДатаЭДО", ВидСравненияКомпоновкиДанных.Заполнено);

// Для сравнения полей через БСП нужно вручную создать ПолеКомпоновкиДанных в значении
ЭлементСравнения = ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ЭлементУО.Отбор,
    "Список.Дата", ВидСравненияКомпоновкиДанных.БольшеИлиРавно);
ЭлементСравнения.ПравоеЗначение = Новый ПолеКомпоновкиДанных("Список.мНачДатаЭДО");

Типичные проблемы и способы их решения

Проанализируем ситуацию, когда код написан верно, но оформление не отображается:

  1. Порядок правил: правила условного оформления применяются по порядку. Если ниже в списке есть другое правило, которое перекрывает ваше (например, красит ту же ячейку в другой цвет), оно победит.
  2. Пустые даты: помните, что пустая дата в 1С (01.01.0001) иногда может интерпретироваться механизмом компоновки неожиданно. При проверке на "Заполнено" для дат всегда убеждайтесь, что в данных действительно пустая дата 1С, а не NULL из левого соединения в запросе.
  3. Видимость колонок: если поле, участвующее в отборе (например, мНачДатаЭДО), скрыто пользователем через "Изменить форму" и при этом не включено в обязательные поля в настройках динамического списка, оформление может перестать работать, так как данные этого поля не будут получены с сервера.

Таким образом, мы разобрали полный цикл создания программного условного оформления. Главное — помнить о правильном сравнении полей через ПолеКомпоновкиДанных и группировке условий для реализации сложной логики. Для ознакомления с практическим примером настройки выделения элементов в типовых конфигурациях можно использовать пример реализации оформления ссылочных объектов в списках.

← На главную