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