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