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