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