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