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