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