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