Как сохранить настройки отбора при закрытии обычной формы в 1С

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

В процессе разработки на платформе 1С (особенно для толстого клиента и обычных форм, которые можно выгружать в файлы формата управляемых) часто возникает задача сохранения пользовательских фильтров. В отличие от управляемых форм, где многие механизмы автоматизированы, в обычных формах программисту часто приходится реализовывать сохранение настроек вручную. В этой статье мы разберем, как сохранить состояние отбора при закрытии формы и восстановить его при следующем запуске (даже если требуется запуск 1С на полный экран), используя различные методы платформы.

Метод 1: Использование стандартных функций СохранитьЗначение и ВосстановитьЗначение

Самый простой и популярный способ — использование системных процедур СохранитьЗначение и ВосстановитьЗначение. Эти методы сохраняют данные в локальном файле настроек пользователя на конкретном рабочем месте. Проанализируем, как правильно реализовать этот механизм для коллекции отборов.

Рассмотрим пример кода, который можно разместить в модуле формы. Нам понадобятся два события: ПриЗакрытии и ПередОткрытием (или ПриОткрытии).


// Процедура сохранения настроек перед закрытием формы
Процедура ПриЗакрытии()
    // Создаем ключ уникальности, чтобы настройки разных форм не пересекались
    КлючСохранения = "Отбор_МояОбработка_Список";
    
    // Прямое сохранение объекта Отбор может быть нестабильным,
    // поэтому лучше передавать его как значение
    СохранитьЗначение(КлючСохранения, Отбор);
КонецПроцедуры

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

Важный нюанс: использование метода ЗаполнитьЗначенияСвойств позволяет быстро перенести состояние флажка «Использование», вид сравнения (включая отборы по шаблону списком) и само значение. Однако, если в отборе используется вид сравнения В списке, убедитесь, что тип значения инициализирован как СписокЗначений (здесь поможет универсальная форма выбора типа), иначе платформа может выдать ошибку при попытке записи данных.

Метод 2: Сохранение настроек в базе данных через ХранилищеОбщихНастроек

Если необходимо, чтобы настройки пользователя «путешествовали» вместе с ним при переходе на другой компьютер, следует использовать ХранилищеОбщихНастроек. Этот механизм записывает данные непосредственно в информационную базу. Выясним, как реализовать сохранение структуры настроек.

Рассмотрим алгоритм сохранения настроек через структуру:


// Сохранение в ХранилищеОбщихНастроек
Настройки = Новый Соответствие;
// Допустим, мы сохраняем конкретные важные поля отбора
Настройки.Вставить("ДатаНачала", ТекущаяДата());
// ... формирование соответствия из элементов Отбора ...

ХранилищеОбщихНастроек.Сохранить("МояОбработка", "ПользовательскиеНастройки", Настройки, , ИмяПользователя());

// Чтение из ХранилищаОбщихНастроек
Настройки = ХранилищеОбщихНастроек.Загрузить("МояОбработка", "ПользовательскиеНастройки", , ИмяПользователя());
Если ТипЗнч(Настройки) = Тип("Соответствие") Тогда
    // Обработка полученных данных
КонецЕсли;

Этот способ более надежен для корпоративных систем, так как администратор может программно перенести настройки от одного пользователя другому, используя параметр ИмяПользователя.

Метод 3: Использование встроенного свойства формы «Сохранять значения»

Платформа 1С предоставляет визуальный инструмент для автоматизации этого процесса. Посмотрим, как им воспользоваться без написания лишнего кода:

  1. Откройте свойства вашей формы в конфигураторе.
  2. Найдите флажок «Сохранять значения» (Save values) и установите его.
  3. В поле «Выбираемые настройки» нажмите на кнопку выбора и отметьте те реквизиты формы, которые должны сохраняться автоматически.

Ограничение метода: стандартный механизм плохо работает с объектом Отбор напрямую, так как это сложная коллекция. Мы рекомендуем использовать этот метод для простых реквизитов (строки, числа, даты), которые затем программно подставляются в отбор при инициализации формы.

Важные рекомендации при работе с отборами

Проанализируем несколько критических моментов, которые часто упускают разработчики:

  1. Выбор события: Рекомендуется сохранять настройки в событии ПриЗакрытии, а не ПередЗакрытием. Если в ПередЗакрытием параметр Отказ будет установлен в Истина (например, пользователь передумал закрывать форму), настройки все равно сохранятся, что может быть нежелательно.
  2. Сериализация: Не все типы данных в отборах могут быть корректно сериализованы. Если вы сталкиваетесь с ошибками при сохранении, попробуйте предварительно выгрузить настройки отбора в ТаблицуЗначений или массив структур, а затем поместить их в ХранилищеЗначения.
  3. Очистка настроек: Хорошим тоном считается добавление кнопки «Сбросить настройки» на форму. Программно это реализуется записью Неопределено по тому же ключу, который использовался для сохранения.
  4. Построитель отчета: Если ваша форма построена на базе Построителя отчета, лучше сохранять настройки через метод Построитель.ПолучитьНастройки() и восстанавливать через ЗагрузитьНастройки(). Это сохранит не только фильтры, но и порядок сортировки, а также группировки.

Таким образом, выбор метода зависит от ваших задач: для простых локальных нужд достаточно СохранитьЗначение, а для надежного хранения в рамках всей информационной базы лучше использовать системные хранилища настроек.

← На главную