Как реализовать автоматическое сохранение и загрузку последних настроек во внешней обработке 1С?

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

При разработке внешних обработок в среде 1С:Предприятие 8.3 программисты часто сталкиваются с задачей сохранения пользовательского выбора. Пользователю удобно, если при повторном открытии файла все реквизиты, флажки и пути к файлам восстанавливаются в том виде, в котором они были оставлены в прошлый раз. Чтобы не изобретать велосипед, можно использовать Шаблон дополнительной обработки с сохранением параметров. Рассмотрим подробно, как реализовать этот механизм правильно, разберем типичные ошибки и изучим возможности платформы.

Разбор типичной ошибки ручного сохранения

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


&НаСервере
Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки)
    Для Каждого Настройка ИЗ Настройки Цикл
        ОбщегоНазначения.ХранилищеСистемныхНастроекСохранить(Настройка.Ключ, "ВнешняяОбработка", Настройка.Значение, , ИмяПользователя()); 
    КонецЦикла;
КонецПроцедуры

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

Способ 1. Использование стандартного механизма автосохранения

Прежде чем писать программный код, разберем возможности платформы, которые позволяют решить задачу без единой строчки кода. У управляемой формы есть встроенные свойства, которые часто игнорируются разработчиками.

  1. Откройте палитру свойств формы вашей внешней обработки.
  2. Найдите свойство Автосохранение (AutoSaveSettings) и установите в нем галочку.
  3. Перейдите в список реквизитов формы. В колонке Сохранение отметьте те реквизиты, которые платформа должна запоминать.
  4. Важный нюанс для внешних обработок: Обязательно заполните свойство формы КлючСохраненияПоложенияОкна или КлючНастроек.

Почему это важно? В отличие от объектов метаданных, входящих в состав конфигурации, внешняя обработка не имеет постоянного внутреннего идентификатора. Если оставить ключи пустыми, платформа может "запутаться". Указав уникальную строку в КлючНастроек, вы гарантируете, что настройки будут привязаны именно к этой логической задаче.

Способ 2. Программное управление через события формы

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

Событие ПриСохраненииДанныхВНастройкахНаСервере(Настройки) срабатывает при закрытии формы или при явном вызове команды сохранения настроек. В параметр Настройки (типа Структура) мы помещаем все данные, которые хотим запомнить. Платформа сама запишет эту структуру в системное хранилище.

Событие ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) вызывается автоматически при открытии формы. В параметре Настройки вы получаете ту самую структуру, которую сохранили ранее. Нам остается только распределить значения по реквизитам.


&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
    // Восстанавливаем значение реквизита из структуры
    Если Настройки.Свойство("Организация") Тогда
        ЭтаФорма.Организация = Настройки.Организация;
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки)
    // Добавляем значение в структуру для сохранения
    Настройки.Вставить("Организация", ЭтаФорма.Организация);
КонецПроцедуры

Понятие Ключа Объекта и Ключа Настроек

Проанализируем ситуацию, когда нам нужно программно обращаться к хранилищу напрямую через ХранилищеСистемныхНастроек. Здесь критически важно понимать разницу между двумя параметрами:

Как загрузить именно последнюю измененную настройку?

Если пользователь сохранял настройки под разными именами (разными Ключами Настроек), и вы хотите при открытии предложить ему ту, которую он редактировал крайней, можно использовать метод Выбрать(). Выясним, как программно определить "свежесть" настройки:


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

Использование ХранилищаНастроекДанныхФорм

Как упоминалось в сообщениях форума, существует также ХранилищеНастроекДанныхФорм. Оно предназначено для сохранения состояния элементов интерфейса: видимости колонок таблиц, положения разделителей, активности тех или иных вкладок. Если ваша задача — сохранить именно "лицо" формы, а не бизнес-данные (реквизиты), лучше использовать этот механизм. В свойстве формы ХранилищеНастроек можно выбрать тип хранилища, и платформа возьмет на себя всю работу по сохранению визуального состояния.

Заключение и рекомендации

Подведем итог нашему анализу. Для большинства внешних обработок идеальным решением будет:

  1. Указать фиксированный КлючНастроек в свойствах формы, чтобы настройки не зависели от пути к файлу на диске.
  2. Включить Автосохранение в свойствах формы.
  3. Использовать события ПриЗагрузкеДанныхИзНастроекНаСервере и ПриСохраненииДанныхВНастройкахНаСервере, если требуется дополнительная обработка данных перед записью (например, очистка временных данных или шифрование паролей).
  4. Передавать данные в хранилище целой структурой, а не в цикле по отдельным элементам, чтобы избежать избыточных вызовов базы данных и ошибок перезаписи.

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

← На главную