Как программно настроить условное оформление с несколькими условиями в управляемых формах 1С?

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

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

В этой статье мы подробно разберем, как правильно комбинировать элементы отбора, использовать логические группы и корректно обрабатывать особенности типа Дата в механизме компоновки данных.

Проблема сравнения пустых дат

Рассмотрим стандартную ситуацию: нам необходимо выделить красным цветом ячейку, если дата исполнения меньше или равна текущей. Типичный код для реализации этой задачи выглядит следующим образом:


ЭлементУО = УсловноеОформление.Элементы.Добавить();

// Настройка оформления (красный цвет текста)
ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ОсобыйТекст);

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

Проанализируем ситуацию: при выполнении этого кода система закрасит не только просроченные задачи, но и все строки, где ДатаИсполнения не заполнена. Происходит это потому, что в 1С пустая дата (01.01.0001) при сравнении всегда меньше любой актуальной даты. Чтобы этого избежать, нам нужно добавить второе условие: проверку на то, что дата заполнена.

Логическое объединение условий «И»

Выясним важную особенность коллекции Отбор.Элементы: по умолчанию все элементы, добавленные в корень этой коллекции, соединяются между собой логическим оператором «И». Таким образом, чтобы решить задачу автора темы, нам достаточно просто добавить вторую строку условия в тот же самый элемент условного оформления.

Рассмотрим правильный подход к реализации двойного условия:


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

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

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

Работа со сложными группами условий (И, ИЛИ, НЕ)

Иногда логика оформления требует более сложных конструкций, например: «Закрасить, если (Дата просрочена И Статус = "Активен") ИЛИ (Приоритет = "Критический")». В управляемых формах для этого используется объект ГруппаЭлементовОтбораКомпоновкиДанных.

Разберем по шагам процесс создания группы условий:

  1. Создаем группу в коллекции отбора.
  2. Устанавливаем тип группы (ГруппаИ, ГруппаИЛИ или ГруппаНе).
  3. Добавляем условия непосредственно внутрь коллекции Элементы этой группы, а не в корень отбора.

Посмотрим на пример реализации логики «ИЛИ»:


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

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

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

Важные нюансы и рекомендации

При работе с программным условным оформлением следует учитывать несколько критических факторов, влияющих на стабильность и производительность системы:

1. Использование свойства «Заполнено»
Для проверки на пустые значения всегда лучше использовать ВидСравненияКомпоновкиДанных.Заполнено или ВидСравненияКомпоновкиДанных.НеЗаполнено. Это универсальный способ, который корректно работает для дат, ссылок, строк и чисел, избавляя вас от необходимости вручную прописывать пустые ссылки или даты вида 00010101.

2. Имена полей компоновки
При создании объекта Новый ПолеКомпоновкиДанных("ИмяПоля"), убедитесь, что имя поля совпадает с именем реквизита в схеме компоновки или в таблице формы. Если поле находится внутри структуры (например, реквизит объекта), путь указывается через точку: Объект.Контрагент.

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

4. Включение использования
Распространенная ошибка — забыть установить Использование = Истина для созданной группы или элемента. По умолчанию этот флаг может быть ложным, и оформление просто не отобразится на форме без каких-либо сообщений об ошибках.

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

← На главную