Где в расширении конфигурации 1С хранить значения и параметры по умолчанию?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке интеграционных решений, таких как HTTP-сервисы, веб-сервисы или регламентные задания в расширениях конфигурации, часто возникает необходимость задать статические или полустатические параметры по умолчанию. Это могут быть ссылки на элементы справочников (например, организация по умолчанию, основной склад, тип цен), служебные токены или логические флаги. Основная задача при этом — сохранить тиражируемость расширения и избежать внесения правок в метаданные основной конфигурации.

Разберем основные и наиболее надежные способы хранения настроек в расширении конфигурации 1С, их особенности, а также нюансы чтения параметров в модулях HTTP-сервисов.

Способ 1. Создание собственных объектов данных в расширении (Константы и Регистры сведений)

Проанализируем возможности современных версий платформы «1С:Предприятие 8.3». Начиная с версии платформы 8.3.14 (при соответствующем режиме совместимости конфигурации), разработчикам доступно создание собственных объектов данных прямо в расширении с назначением Адаптация или Дополнение.

Это самый прозрачный и штатный подход. Выполним следующие шаги:

  1. Добавим в дерево метаданных расширения собственный объект: Константу для одиночного значения либо Регистр сведений для набора параметров.
  2. Создадим форму настроек в расширении (например, обработку или общую форму), в которой пользователь или администратор сможет заполнить эти значения через интерфейс.
  3. В модуле HTTP-сервиса прочитаем сохраненные значения обычным обращением к менеджеру объекта или запросом.

Посмотрим на пример получения значения константы в коде метода HTTP-сервиса:


// Чтение созданной в расширении константы
ЗначениеПоУмолчанию = Константы.расш_ОсновнойСклад.Получить();
Если Не ЗначениеЗаполнено(ЗначениеПоУмолчанию) Тогда
    // Обработка ситуации, когда настройка еще не задана
    Возврат Новый HTTPСервисОтвет(500, "В системе не настроены параметры по умолчанию");
КонецЕсли;

Способ 2. Использование системного объекта «ХранилищеОбщихНастроек»

Если расширение разрабатывается для конфигурации, работающей в устаревшем режиме совместимости (где добавление собственных таблиц данных в расширения запрещено), воспользуемся платформенным механизмом ХранилищеОбщихНастроек. Данный механизм хранит произвольные сериализуемые структуры данных в системных таблицах базы.

Рассмотрим важную особенность: по умолчанию методы Загрузить() и Сохранить() привязываются к имени текущего авторизованного пользователя. Так как HTTP-сервис может вызываться под отдельной служебной учетной записью или вовсе без интерактивного контекста, настройки, сохраненные администратором в пользовательском сеансе, не прочитаются сервисом, если не указать имя пользователя явно.

Чтобы избежать этой проблемы, разберем правильную схему сохранения и чтения системных параметров:

  1. При сохранении настроек из формы явно передаем системное или пустое имя пользователя ("").
  2. При чтении данных внутри HTTP-сервиса указываем тот же ключ объекта, ключ настроек и пустое имя пользователя.

Посмотрим на пример кода сохранения настроек в форме администратора:


&НаСервере
Процедура СохранитьНастройкиНаСервере()
    СтруктураНастроек = Новый Структура;
    
    // Рекомендуется сохранять не саму ссылку, а ее УникальныйИдентификатор в виде строки
    СтруктураНастроек.Вставить("ОрганизацияGUID", Строка(Объект.ОрганизацияПоУмолчанию.УникальныйИдентификатор()));
    СтруктураНастроек.Вставить("ТаймаутЗапроса", Объект.Таймаут);
    
    // Сохраняем настройку для пустой строки пользователя (общая для всей базы)
    ХранилищеОбщихНастроек.Сохранить("расш_ИнтеграционныйСервис", "ОсновныеПараметры", СтруктураНастроек, , "");
КонецПроцедуры

Теперь разберем, как прочитать эти данные в методе HTTP-сервиса:


// В методе HTTP-сервиса
СтруктураНастроек = ХранилищеОбщихНастроек.Загрузить("расш_ИнтеграционныйСервис", "ОсновныеПараметры", Неопределено, "");

Если СтруктураНастроек = Неопределено Тогда
    // Настройки еще не были инициализированы
    ОрганизацияПоУмолчанию = Справочники.Организации.ПустаяСсылка();
Иначе
    // Восстанавливаем ссылку по сохраненному идентификатору
    Идентификатор = Новый УникальныйИдентификатор(СтруктураНастроек.ОрганизацияGUID);
    ОрганизацияПоУмолчанию = Справочники.Организации.ПолучитьСсылку(Идентификатор);
КонецЕсли;

Способ 3. Использование типовых регистров конфигурации и БСП

Если мы работаем с типовой конфигурацией (на базе «Библиотеки стандартных подсистем» — БСП), в ней уже присутствуют служебные регистры сведений, которые можно задействовать без изменения структуры базы данных.

Рассмотрим доступные варианты:

  1. Регистр сведений «СохраненныеНастройки» (для конфигураций обычного приложения): позволяет записывать настройки отчетов и внешних обработок в разрезе пользователей или для всех пользователей.
  2. Регистр сведений «БезопасноеХранилищеДанных» (в БСП): оптимален, если параметрами по умолчанию являются конфиденциальные данные — пароли, секретные ключи авторизации, API-токены сторонних сервисов.
  3. Механизмы общего модуля ОбщегоНазначения: предоставляют типовой интерфейс для чтения и записи общих настроек программы без прямого обращения к низкоуровневым таблицам.

Рекомендации по надежному хранению ссылочных данных

Проанализируем риски хранения прямых ссылок СправочникСсылка в хранилищах настроек. При переносе данных, выгрузке/загрузке или удалении элементов прямая ссылка может превратиться в «Объект не найден». Чтобы повысить надежность решения, рекомендуется соблюдать следующие правила:

  1. Хранить строковое представление УникальныйИдентификатор и при вызове восстанавливать ссылку через метод ПолучитьСсылку() соответствующего менеджера.
  2. Для предопределенных элементов метаданных использовать имена предопределенных значений и метод ПредопределенноеЗначение().
  3. Предусматривать проверку на существование и заполненность объекта при каждом обращении из HTTP-сервиса, возвращая понятный код ошибки клиенту в случае некорректных настроек.
← На главную