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