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