При разработке регламентных заданий, механизмов выгрузки на FTP или интеграций со сторонними сервисами регулярно возникает задача хранения параметров подключения (адрес сервера, порт, логин, пути к каталогам). Создавать для двух-трех параметров отдельный справочник или регистр сведений разработчики хотят далеко не всегда, чтобы не перегружать дерево метаданных конфигурации. В то же время параметры должны быть доступны как для фонового задания, так и для редактирования пользователем через форму.
Разберем основные практические варианты хранения настроек в платформе 1С:Предприятие 8.3, их плюсы, минусы и примеры реализации.
Создание константы — один из самых простых, наглядных и надежных способов сохранения настроек в информационной базе. Константа добавляет минимум сущностей в структуру метаданных, легко выводится на общую форму настроек и кэшируется платформой.
Для хранения набора параметров создадим константу, например НастройкиПодключенияFTP. Для типа значения выберем ХранилищеЗначения либо Строка неограниченной длины (для сериализации в JSON).
Посмотрим на пример сохранения и чтения параметров через ХранилищеЗначения:
// Сохранение настроек из формы
Настройки = Новый Структура;
Настройки.Вставить("Сервер", "ftp.example.com");
Настройки.Вставить("Порт", 21);
Настройки.Вставить("Пользователь", "ftp_user");
Настройки.Вставить("КаталогВыгрузки", "/upload/");
Константы.НастройкиПодключенияFTP.Установить(Новый ХранилищеЗначения(Настройки));
Теперь разберем чтение этих настроек в коде регламентного задания:
// Чтение настроек в регламентном задании
Хранилище = Константы.НастройкиПодключенияFTP.Получить();
Если Хранилище <> Неопределено Тогда
Настройки = Хранилище.Получить();
Если ТипЗнч(Настройки) = Тип("Структура") Тогда
Сервер = Настройки.Сервер;
Порт = Настройки.Порт;
// Дальнейшая логика подключения к FTP
КонецЕсли;
КонецЕсли;
Если вносить изменения в структуру метаданных (добавлять константы) нежелательно вовсе, платформа предоставляет штатный механизм — ХранилищеОбщихНастроек. Он хранит данные в системных таблицах базы данных и не требует создания новых объектов конфигурации.
Механизм доступен на сервере и позволяет читать и записывать произвольные сериализуемые структуры данных. Проанализируем пример работы с общими настройками:
// Запись настроек из формы
КлючОбъекта = "ИнтеграцияСФТП";
КлючНастроек = "ПараметрыПодключения";
Настройки = Новый Структура;
Настройки.Вставить("Сервер", "ftp.example.com");
Настройки.Вставить("Порт", 21);
Настройки.Вставить("Пользователь", "ftp_user");
ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, Настройки);
Чтение параметров в контексте регламентного или фонового задания выполняется так:
// Чтение настроек в фоновом задании
КлючОбъекта = "ИнтеграцияСФТП";
КлючНастроек = "ПараметрыПодключения";
Настройки = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта, КлючНастроек);
Если Настройки <> Неопределено Тогда
Сервер = Настройки.Сервер;
// Работа с полученными параметрами
КонецЕсли;
В объекте РегламентноеЗадание предусмотрено свойство Параметры (тип Массив). Если настройки привязаны исключительно к конкретному регламентному заданию, их можно передавать непосредственно в момент его запуска.
Разберем программную настройку регламентного задания:
// Поиск и установка параметров задания
МассивЗаданий = РегламентныеЗадания.ПолучитьРегламентныеЗадания(
Новый Структура("Метаданные", Метаданные.РегламентныеЗадания.ВыгрузкаНаFTP)
);
Если МассивЗаданий.Количество() > 0 Тогда
Задание = МассивЗаданий[0];
ПараметрыЗадания = Новый Массив;
ПараметрыЗадания.Добавить("ftp.example.com"); // 1-й параметр процедуры
ПараметрыЗадания.Добавить(21); // 2-й параметр
Задание.Параметры = ПараметрыЗадания;
Задание.Записать();
КонецЕсли;
В модуле регламентного задания процедура обработчика принимает эти значения в виде входных аргументов.
При выборе способа хранения параметров подключений обратим внимание на следующие правила:
БезопасноеХранилищеДанных или соответствующие функции БСП), где пароли шифруются платформенными средствами.ХранилищеНастроекДанныхФорм), для фоновых сеансов недоступны. Использовать следует именно ХранилищеОбщихНастроек или константы.ХранилищеЗначения или через системные хранилища убедимся, что все вложенные элементы структуры являются сериализуемыми типами (Строка, Число, Булево, Дата, Структура, Соответствие, Массив). Ссылки на динамические формы или COM-объекты сохранять нельзя.