При интеграции 1С:УНФ 3.0 с внешними сервисами, такими как маркетплейсы (Ozon, Wildberries, Яндекс Маркет) или службы доставки (СДЭК, Boxberry), разработчики неизбежно сталкиваются с проблемой: где и как хранить авторизационные данные? Ключи client_id, client_secret, API-токены и логины требуют централизованного и безопасного хранения. Рассмотрим основные способы решения этой задачи, начиная от типовых механизмов конфигурации и заканчивая программными методами на базе Библиотеки стандартных подсистем (БСП).
Если ваша конфигурация построена на современных версиях БСП (что справедливо для УНФ 3.0), наиболее правильным с точки зрения безопасности будет использование подсистемы Пароли и секреты. Этот механизм позволяет сохранять конфиденциальные данные так, чтобы они не были доступны в открытом виде через консоль запросов или стандартные интерфейсы.
Проанализируем программный метод работы с безопасным хранилищем. Для записи данных мы можем использовать структуру или соответствие, которые будут автоматически сериализованы и зашифрованы.
Рассмотрим пример кода для записи параметров:
ПараметрыПодключения = Новый Структура;
ПараметрыПодключения.Вставить("ClientID", "12345");
ПараметрыПодключения.Вставить("ClientSecret", "секретный_ключ_98765");
ПараметрыПодключения.Вставить("Token", "abcde12345");
// В качестве владельца настроек обычно выступает ссылка на организацию или узел обмена
ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(СсылкаНаОбъект, ПараметрыПодключения);
Для получения данных в коде модуля обмена выполним обратную операцию:
ДанныеAPI = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(СсылкаНаОбъект);
Если ДанныеAPI <> Неопределено Тогда
КлючСессии = ДанныеAPI.Token;
КонецЕсли;
Этот способ является стандартом разработки для современных типовых решений 1С.
Если вам требуется хранить настройки для большого количества различных систем (СДЭК, маркетплейсы, внутренние API), целесообразно создать собственный Регистр Сведений. Это обеспечит гибкость и наглядность для администратора системы.
Разберем оптимальную структуру такого регистра:
Посмотрим на пример сохранения данных в такой регистр:
МенеджерЗаписи = РегистрыСведений.МоиНастройкиИнтеграций.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Организация = ВыбраннаяОрганизация;
МенеджерЗаписи.ИнтеграционнаяСистема = "Ozon";
Настройки = Новый Структура("ID, Secret, URL", "my_id", "my_secret", "https://api-seller.ozon.ru/");
МенеджерЗаписи.Параметры = Новый ХранилищеЗначения(Настройки);
МенеджерЗаписи.Записать();
В ситуациях, когда доработка конфигурации (создание новых объектов) нежелательна, можно воспользоваться механизмом Дополнительных реквизитов и сведений. В УНФ этот функционал доступен практически для всех справочников.
Проанализируем этот сценарий: мы можем создать для справочника Организации один дополнительный реквизит типа "Строка" (неограниченной длины). В эту строку мы будем записывать параметры в формате JSON.
Рассмотрим пример кода для работы с JSON-конфигурацией:
// Сериализация настроек в JSON для записи в доп. реквизит
МассивНастроек = Новый Массив;
Настройка1 = Новый Структура("Service, Key", "CDEK", "key_111");
МассивНастроек.Добавить(Настройка1);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, МассивНастроек);
СтрокаДляХранения = ЗаписьJSON.Закрыть();
// Чтение из JSON
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаДляХранения);
Результат = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Важный момент: данный способ удобен тем, что не требует изменения структуры метаданных, однако он менее защищен, так как данные хранятся в открытом текстовом виде.
Для настроек, которые не привязаны к конкретным документам или организациям, а носят общесистемный или пользовательский характер, можно использовать встроенный объект платформы ХранилищеОбщихНастроек.
Выясним преимущества этого метода: данные хранятся в системных таблицах платформы, их легко записывать и считывать без создания лишних объектов в дереве метаданных. Пример записи:
КлючОбъекта = "ПараметрыИнтеграцииМаркетплейсов";
КлючНастроек = "Настройки_СДЭК";
ЗначениеНастроек = Новый Структура("Логин, Пароль", "user1", "pass1");
ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, ЗначениеНастроек);
В современных релизах 1С:УНФ 3.0 уже присутствует справочник УчетныеЗаписиМаркетплейсов. Он активно используется подсистемой интеграции. Если ваша задача — работа именно с популярными площадками, в первую очередь стоит проверить состав этого справочника.
Однако, как справедливо отмечают специалисты, этот справочник жестко завязан на перечисление ВидыМаркетплейсов. Если вам нужно добавить туда СДЭК или специфический API, которого нет в списке, придется использовать расширение конфигурации, чтобы добавить новое значение в перечисление и адаптировать форму справочника.
Подведем итоги нашего анализа и выберем оптимальный путь:
ХранилищеЗначения.access_token, который живет 24 часа), можно использовать регистр КэшПрограммныхИнтерфейсов, но помните, что он может очищаться системой автоматически.Выбор конкретного метода зависит от требований к безопасности и архитектурных предпочтений, но в 1С:УНФ 3.0 наиболее сбалансированным решением будет сочетание регистра сведений и безопасного хранилища БСП для хранения паролей и секретов.