При разработке интеграционных решений, таких как HTTP-сервисы, веб-сервисы или регламентные задания в расширениях конфигурации, часто возникает необходимость задать статические или полустатические параметры по умолчанию. Это могут быть ссылки на элементы справочников (например, организация по умолчанию, основной склад, тип цен), служебные токены или логические флаги. Основная задача при этом — сохранить тиражируемость расширения и избежать внесения правок в метаданные основной конфигурации.
Разберем основные и наиболее надежные способы хранения настроек в расширении конфигурации 1С, их особенности, а также нюансы чтения параметров в модулях HTTP-сервисов.
Проанализируем возможности современных версий платформы «1С:Предприятие 8.3». Начиная с версии платформы 8.3.14 (при соответствующем режиме совместимости конфигурации), разработчикам доступно создание собственных объектов данных прямо в расширении с назначением Адаптация или Дополнение.
Это самый прозрачный и штатный подход. Выполним следующие шаги:
Посмотрим на пример получения значения константы в коде метода HTTP-сервиса:
// Чтение созданной в расширении константы
ЗначениеПоУмолчанию = Константы.расш_ОсновнойСклад.Получить();
Если Не ЗначениеЗаполнено(ЗначениеПоУмолчанию) Тогда
// Обработка ситуации, когда настройка еще не задана
Возврат Новый HTTPСервисОтвет(500, "В системе не настроены параметры по умолчанию");
КонецЕсли;
Если расширение разрабатывается для конфигурации, работающей в устаревшем режиме совместимости (где добавление собственных таблиц данных в расширения запрещено), воспользуемся платформенным механизмом ХранилищеОбщихНастроек. Данный механизм хранит произвольные сериализуемые структуры данных в системных таблицах базы.
Рассмотрим важную особенность: по умолчанию методы Загрузить() и Сохранить() привязываются к имени текущего авторизованного пользователя. Так как HTTP-сервис может вызываться под отдельной служебной учетной записью или вовсе без интерактивного контекста, настройки, сохраненные администратором в пользовательском сеансе, не прочитаются сервисом, если не указать имя пользователя явно.
Чтобы избежать этой проблемы, разберем правильную схему сохранения и чтения системных параметров:
"").Посмотрим на пример кода сохранения настроек в форме администратора:
&НаСервере
Процедура СохранитьНастройкиНаСервере()
СтруктураНастроек = Новый Структура;
// Рекомендуется сохранять не саму ссылку, а ее УникальныйИдентификатор в виде строки
СтруктураНастроек.Вставить("ОрганизацияGUID", Строка(Объект.ОрганизацияПоУмолчанию.УникальныйИдентификатор()));
СтруктураНастроек.Вставить("ТаймаутЗапроса", Объект.Таймаут);
// Сохраняем настройку для пустой строки пользователя (общая для всей базы)
ХранилищеОбщихНастроек.Сохранить("расш_ИнтеграционныйСервис", "ОсновныеПараметры", СтруктураНастроек, , "");
КонецПроцедуры
Теперь разберем, как прочитать эти данные в методе HTTP-сервиса:
// В методе HTTP-сервиса
СтруктураНастроек = ХранилищеОбщихНастроек.Загрузить("расш_ИнтеграционныйСервис", "ОсновныеПараметры", Неопределено, "");
Если СтруктураНастроек = Неопределено Тогда
// Настройки еще не были инициализированы
ОрганизацияПоУмолчанию = Справочники.Организации.ПустаяСсылка();
Иначе
// Восстанавливаем ссылку по сохраненному идентификатору
Идентификатор = Новый УникальныйИдентификатор(СтруктураНастроек.ОрганизацияGUID);
ОрганизацияПоУмолчанию = Справочники.Организации.ПолучитьСсылку(Идентификатор);
КонецЕсли;
Если мы работаем с типовой конфигурацией (на базе «Библиотеки стандартных подсистем» — БСП), в ней уже присутствуют служебные регистры сведений, которые можно задействовать без изменения структуры базы данных.
Рассмотрим доступные варианты:
ОбщегоНазначения: предоставляют типовой интерфейс для чтения и записи общих настроек программы без прямого обращения к низкоуровневым таблицам.Проанализируем риски хранения прямых ссылок СправочникСсылка в хранилищах настроек. При переносе данных, выгрузке/загрузке или удалении элементов прямая ссылка может превратиться в «Объект не найден». Чтобы повысить надежность решения, рекомендуется соблюдать следующие правила:
УникальныйИдентификатор и при вызове восстанавливать ссылку через метод ПолучитьСсылку() соответствующего менеджера.ПредопределенноеЗначение().