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