Часто перед разработчиком встает задача сохранения промежуточных данных, таких как дата последней выгрузки или параметры настройки, внутри внешней обработки. Главная сложность заключается в том, чтобы сделать эти данные доступными не только в интерактивном режиме, но и для РегламентныеЗадания, не прибегая к модификации основной конфигурации (снятию с поддержки). Рассмотрим наиболее эффективные способы решения этой задачи.
Если ваша конфигурация построена на базе БиблиотекаСтандартныхПодсистем (БСП), самым надежным и современным способом является работа с БезопасноеХранилище. Это позволяет хранить конфиденциальные данные, к которым ограничен доступ обычных пользователей, но которые доступны коду, работающему в привилегированном режиме.
Для реализации этого подхода выполним следующие шаги:
ПривилегированныйРежим, так как чтение и запись в хранилище требуют повышенных прав.ОбщегоНазначения для записи и чтения данных.Пример кода для записи данных:
УстановитьПривилегированныйРежим(Истина);
// Используем произвольную строку-идентификатор в качестве владельца
ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище("КлючНастройки", ДатаПоследнейВыгрузки);
УстановитьПривилегированныйРежим(Ложь);
Пример кода для чтения данных:
УстановитьПривилегированныйРежим(Истина);
ДатаПоследнейВыгрузки = ОбщегоНазначения.ПрочитатьДанныеИзБезопасноеХранилище("КлючНастройки");
УстановитьПривилегированныйРежим(Ложь);
Важно: убедитесь, что первый параметр функции — это строка или ссылка на объект метаданных, допустимая вашей версией БСП.
Если задача состоит в том, чтобы запомнить пользовательские предпочтения на форме обработки, можно воспользоваться механизмом ХранилищеСистемныхНастроек. Это позволяет сохранять состояние элементов формы автоматически.
Чтобы получить доступ к этим настройкам из регламентного задания, необходимо:
ХранилищеСистемныхНастроек.Выбрать().Рассмотрим структуру получения данных:
Отбор = Новый Структура;
Отбор.Вставить("Пользователь", ИмяПользователя);
Отбор.Вставить("КлючОбъекта", "ВнешняяОбработка.ИмяВашейОбработки.Форма.Форма/ТекущиеДанные");
Выборка = ХранилищеСистемныхНастроек.Выбрать(Отбор);
Если Выборка.Следующий() Тогда
МойРеквизит = Выборка.Настройки["МойРеквизит"];
КонецЕсли;
Обратите внимание: этот способ привязан к конкретному пользователю, поэтому регламентное задание должно выполняться от имени того же пользователя, чьи настройки мы считываем.
Для глобальных данных, которые не должны зависеть от пользователя, лучше всего подходит ХранилищеОбщихНастроек. В отличие от системных настроек, данные здесь доступны глобально во всей информационной базе. Используйте методы ХранилищеОбщихНастроек.Сохранить() и ХранилищеОбщихНастроек.Загрузить(). Это идеальный вариант для даты последней выгрузки, которая должна быть общей для всех фоновых процессов.
Вне зависимости от выбранного метода, мы настоятельно рекомендуем:
Структура, наполните ее нужными параметрами и сохраняйте структуру целиком. Это даст гибкость: при расширении функционала вам не придется менять логику сохранения, достаточно будет добавить новый ключ в структуру.ХранилищеНастроек в справочнике ДополнительныеОтчетыИОбработки. Это штатный способ хранения настроек для внешних обработок, поддерживаемый системой автоматически.Выбирая между РегистрСведений и Хранилище, помните: регистр — это объект метаданных (требует прав на конфигурацию), а хранилища — это программные инструменты, которые позволяют решать задачу полностью в пользовательском режиме. Для простых настроек внешних обработок инструменты хранилищ являются наиболее предпочтительными.