Skip to content

Внедрение настроек приложения ​

Хорошая поделка состоит не только из желудей и пластилина, но и обвешана маленькими приятными глазу детальками. Причем разные поделки, собранные по одному и тому же чертежу, могут только этими детальками и отличаться.

В примере выше мы передавали Обновлятору1С данные авторизации через переменные среды, читающиеся с помощью &Дуба и его &Завязей. Но это не единственный способ работы с настройками приложения.

Осень содержит в себе механизм передачи желудю настроек приложения напрямую из конфигурационного файла или переменных окружения. Для этого служит аннотация &Деталька. &Пластилин помогает связать между собой несколько полноценных &Желудей, тогда как &Деталька налепляется сразу на нужный &Желудь.

Поддержка из аргументов командной строки в ближайших планах разработки. Еще год-два и точно запилим, честно-честно!

Конфигурационный файл может быть в виде json, yaml или ini файла, называется autumn-properties.json/autumn-properties.yml/autumn-properties.ini соответственно и ищется ОСенью в каталоге запуска приложения или в подкаталоге src.

json
{
    "Логин": "user",
    "Пароль": "pass",
    "ПрочиеНастройки": {
        "Настроение": "Хорошее"
    }
}

А вот так их можно использовать в жёлуде:

bsl
&Деталька
Перем Логин;

&Деталька
Перем Пароль;

&Деталька("ПрочиеНастройки.Настроение")
Перем Настроение;

&Деталька(Значение = "ПрочиеНастройки.ОтветНаГлавныйВопросЖизниВселеннойИВсегоОстального", ЗначениеПоУмолчанию = 42)
Перем Ответ;

&Желудь
Процедура ПриСозданииОбъекта()
КонецПроцедуры

Вы можете добавлять к желудю любые детальки вне зависимости от того, есть они в конфигурационном файле или нет.

По умолчанию "ОСень" будет пытаться найти значение настройки по имени параметра конструктора: в json есть параметры "Логин" и "Пароль", в конструкторе есть параметры "Логин" и "Пароль", искра, буря, безумие!

JSON обычно содержит вложенные объекты и массивы. Путь к настройкам в таких вложенных структурах можно указать в параметре аннотации &Деталька в формате библиотеки configor, используя точки для объектов и квадратные скобки для массивов.

Не обязательно заставлять пользователя указывать все настройки в конфигурационном файле, если ему могут подойти значения настроек по умолчанию. Для указания значения по умолчанию в &Детальке есть параметр ЗначениеПоУмолчанию. Поразительно, не правда ли?

Откуда берутся значения деталек ​

Сами значения "ОСень" собирает менеджером параметров configor, и из коробки в нём три источника:

ИдентификаторИсточникПриоритет
envпеременные среды1
defaultфайлы autumn-properties.yaml/.json/.ini в каталоге запуска и подкаталоге src2
inlineзначения, переданные прямо из кода3

Чем больше приоритет, тем важнее источник: значение из inline перебьёт значение из файла, а файл перебьёт переменную среды.

Если такой состав вас не устраивает, его можно пересобрать. За настройку отвечает СоветДругогоМастера, который передаётся в конструктор поделки, а за состав источников - строитель менеджера параметров:

bsl
Совет = Новый СоветДругогоМастера();
Строитель = Совет.ПолучитьСтроительМенеджераПараметров();

// Переменные среды теперь ищутся с префиксом, чтобы не собирать чужое
Строитель.УдалитьПровайдер("env");
Строитель.ДобавитьПровайдерENV("MYAPP_", 1, "env");

// Отдельный файл настроек, формат определится по расширению
Строитель.ДобавитьПровайдерФайлНастроек("./config/local.yaml", 4, "local");

Поделка = Новый Поделка(Совет);
Поделка.ЗапуститьПриложение();

Строитель создаётся лениво при первом обращении и кэшируется в совете, так что настраивать его можно по частям и из разных мест - лишь бы всё это случилось до создания поделки. Полный список методов - в описании класса СтроительМенеджераПараметров в разделе API: можно добавить произвольный класс-провайдер, заменить набор файлов, свалить значения из Соответствия или вообще очистить состав и собрать свой с нуля.

Устаревшее API

Методы СоветДругогоМастера.ЗначенияДеталек(), ПрефиксПеременныхСреды(), ИмяФайлаСоЗначениямиДеталек() и ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек() объявлены устаревшими в версии 5.0.0. Они продолжают работать - под капотом правят тот же строитель, - но пишут предупреждение в лог. Новый код пишите через ПолучитьСтроительМенеджераПараметров().