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