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