diff --git a/.github/workflows/perfomance.yml b/.github/workflows/perfomance.yml
index 0edc8b8..d35cd3c 100644
--- a/.github/workflows/perfomance.yml
+++ b/.github/workflows/perfomance.yml
@@ -10,7 +10,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- oscript_version: ['dev', 'lts', 'default']
+ oscript_version: ['dev', 'default']
uses: autumn-library/workflows/.github/workflows/test.yml@main
with:
oscript_version: ${{ matrix.oscript_version }}
diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml
index 1efcd54..e237c3b 100644
--- a/.github/workflows/testing.yml
+++ b/.github/workflows/testing.yml
@@ -10,7 +10,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- oscript_version: ['dev', 'lts', 'default']
+ oscript_version: ['dev', 'default']
uses: autumn-library/workflows/.github/workflows/test.yml@main
with:
oscript_version: ${{ matrix.oscript_version }}
diff --git "a/docs/api/050-\320\232\320\273\320\260\321\201\321\201\321\213/20-\320\241\320\276\320\262\320\265\321\202\320\224\321\200\321\203\320\263\320\276\320\263\320\276\320\234\320\260\321\201\321\202\320\265\321\200\320\260.md" "b/docs/api/050-\320\232\320\273\320\260\321\201\321\201\321\213/20-\320\241\320\276\320\262\320\265\321\202\320\224\321\200\321\203\320\263\320\276\320\263\320\276\320\234\320\260\321\201\321\202\320\265\321\200\320\260.md"
index 484c883..1ac9d49 100644
--- "a/docs/api/050-\320\232\320\273\320\260\321\201\321\201\321\213/20-\320\241\320\276\320\262\320\265\321\202\320\224\321\200\321\203\320\263\320\276\320\263\320\276\320\234\320\260\321\201\321\202\320\265\321\200\320\260.md"
+++ "b/docs/api/050-\320\232\320\273\320\260\321\201\321\201\321\213/20-\320\241\320\276\320\262\320\265\321\202\320\224\321\200\321\203\320\263\320\276\320\263\320\276\320\234\320\260\321\201\321\202\320\265\321\200\320\260.md"
@@ -4,6 +4,22 @@ title: СоветДругогоМастера
# СоветДругогоМастера
+Объект-носитель пользовательских настроек, передаваемый в [`Поделка`](../../../api/050-Классы/) при её создании.
+
+С версии 4.4 рекомендуется использовать [`СтроительМенеджераПараметров`](25-СтроительМенеджераПараметров.md), доступный через метод `ПолучитьСтроительМенеджераПараметров()`. Старые методы (`ЗначенияДеталек`, `ПрефиксПеременныхСреды`, `ИмяФайлаСоЗначениямиДеталек`, `ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек`) объявлены **устаревшими**: при их вызове в лог пишется предупреждение, под капотом они модифицируют тот же строитель.
+
+## ПолучитьСтроительМенеджераПараметров
+
+```bsl
+// Возвращает строитель с применёнными значениями устаревших полей.
+// Используется Поделкой при инициализации МенеджерПараметров.
+//
+// Возвращаемое значение:
+// СтроительМенеджераПараметров - готовый к использованию строитель
+//
+Функция ПолучитьСтроительМенеджераПараметров() Экспорт
+```
+
## ПриСозданииОбъекта
```bsl
@@ -12,58 +28,34 @@ title: СоветДругогоМастера
Процедура ПриСозданииОбъекта()
```
-## ЗначенияДеталек
+## ЗначенияДеталек
+
+Используйте `ПолучитьСтроительМенеджераПараметров().ДобавитьПровайдерСоответствие(...)`.
```bsl
-// Установить/получить значения деталек.
-//
-// Параметры:
-// НовоеЗначение - Соответствие - устанавливаемые значения деталек.
-//
-// Возвращаемое значение:
-// Соответствие, СоветДругогоМастера - Текущее установленное значение для гетера, ЭтотОбъект для сеттера.
-//
Функция ЗначенияДеталек(НовоеЗначение = Неопределено) Экспорт
```
-## ПрефиксПеременныхСреды
+## ПрефиксПеременныхСреды
+
+Используйте `ПолучитьСтроительМенеджераПараметров().Провайдер("env").Настройки().УстановитьПрефикс(...)`.
```bsl
-// Установить/получить префикс переменных среды, хранящих значения деталек.
-//
-// Параметры:
-// НовоеЗначение - Строка - устанавливаемый префикс переменных среды.
-//
-// Возвращаемое значение:
-// Строка, СоветДругогоМастера - Текущее установленное значение для гетера, ЭтотОбъект для сеттера.
-//
Функция ПрефиксПеременныхСреды(НовоеЗначение = Неопределено) Экспорт
```
-## ИмяФайлаСоЗначениямиДеталек
+## ИмяФайлаСоЗначениямиДеталек
+
+Используйте `ПолучитьСтроительМенеджераПараметров().ПровайдерФайлов("default").УстановитьИмяФайла(...)`.
```bsl
-// Установить/получить имя файла (без расширения), в котором хранятся значения деталек.
-//
-// Параметры:
-// НовоеЗначение - Строка - устанавливаемое имя файла.
-//
-// Возвращаемое значение:
-// Строка, СоветДругогоМастера - Текущее установленное значение для гетера, ЭтотОбъект для сеттера.
-//
Функция ИмяФайлаСоЗначениямиДеталек(НовоеЗначение = Неопределено) Экспорт
```
-## ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек
+## ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек
+
+Используйте `ПолучитьСтроительМенеджераПараметров().ПровайдерФайлов("default").УстановитьСтандартныеКаталогиПоиска(...)`.
```bsl
-// Установить/получить относительный путь к каталогу, где хранятся файл со значениями деталек.
-//
-// Параметры:
-// НовоеЗначение - Строка - устанавливаемый путь к каталогу.
-//
-// Возвращаемое значение:
-// Строка, СоветДругогоМастера - Текущее установленное значение для гетера, ЭтотОбъект для сеттера.
-//
Функция ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек(НовоеЗначение = Неопределено) Экспорт
```
diff --git "a/docs/api/050-\320\232\320\273\320\260\321\201\321\201\321\213/25-\320\241\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.md" "b/docs/api/050-\320\232\320\273\320\260\321\201\321\201\321\213/25-\320\241\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.md"
new file mode 100644
index 0000000..62eb7e0
--- /dev/null
+++ "b/docs/api/050-\320\232\320\273\320\260\321\201\321\201\321\213/25-\320\241\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.md"
@@ -0,0 +1,236 @@
+---
+title: СтроительМенеджераПараметров
+---
+
+# СтроительМенеджераПараметров
+
+Инкапсулирует создание и настройку `МенеджерПараметров` (`configor`) с заранее заданным дефолтным составом провайдеров.
+
+Создаётся лениво при первом обращении к [`СоветДругогоМастера.ПолучитьСтроительМенеджераПараметров()`](20-СоветДругогоМастера.md#получитьстроительменеджерапараметров) и кэшируется в `СоветДругогоМастера`: повторные вызовы возвращают тот же экземпляр, поэтому правки строителя, сделанные клиентским кодом, доходят до `Поделки`. Все настройки выполняются **до** передачи `СоветДругогоМастера` в [`Поделка`](../../../api/050-Классы/).
+
+## Дефолтный состав провайдеров
+
+| Идентификатор | Тип | Приоритет |
+| --- | --- | --- |
+| `env` | `ПровайдерПараметровENV` | 1 |
+| `default` | Файловый метапровайдер (`yaml` + `json` + `ini`)
имя файла `autumn-properties`, поиск с подкаталогом `src` | 2 |
+| `inline` | `ПровайдерПараметровСоответствие` | 3 |
+
+Файловый метапровайдер регистрирует три физических провайдера в менеджере под идентификаторами `<база>-yaml`, `<база>-json`, `<база>-ini` с одинаковым приоритетом. Настройки, заданные через метапровайдер (имя файла, каталоги поиска и т.п.), транслируются во все три физических провайдера.
+
+## Канонический нейминг
+
+Методы добавления провайдеров следуют единой схеме `ДобавитьПровайдер<Тип>`:
+
+| Метод | Назначение |
+| --- | --- |
+| `ДобавитьПровайдер` | универсальный — для произвольного класса-провайдера |
+| `ДобавитьПровайдерСоответствие` | inline-значения через `Соответствие` |
+| `ДобавитьПровайдерENV` | переменные среды |
+| `ДобавитьПровайдерФайлов` | мета-обёртка над несколькими форматами (`yaml`/`json`/`ini`) |
+| `ДобавитьПровайдерФайлНастроек` | один файл с автоопределением формата по расширению |
+
+## Пример
+
+```bsl
+Совет = Новый СоветДругогоМастера();
+Строитель = Совет.ПолучитьСтроительМенеджераПараметров();
+
+// Заменить дефолтный inline-провайдер своим набором значений
+Значения = Новый Соответствие();
+Значения.Вставить("моя.настройка", "значение");
+Строитель.УдалитьПровайдер("inline");
+Строитель.ДобавитьПровайдерСоответствие(Значения, 3, "inline");
+
+// Добавить ещё один файловый метапровайдер
+ДопФайлы = Строитель.ДобавитьПровайдерФайлов("dev", 1);
+ДопФайлы.УстановитьИмяФайла("autumn-properties.dev");
+
+// Подключить конкретный файл (формат — по расширению)
+Строитель.ДобавитьПровайдерФайлНастроек("./config/local.yaml", 0, "local");
+
+// Полностью пересобрать состав с нуля
+Строитель.ОчиститьПровайдеры();
+Строитель.ДобавитьПровайдерENV("MYAPP_", 1, "env");
+Строитель.ДобавитьПровайдерСоответствие(Значения, 2, "inline");
+
+Поделка = Новый Поделка(Совет);
+```
+
+## МенеджерПараметров
+
+```bsl
+// Возвращает внутренний МенеджерПараметров configor.
+//
+// Возвращаемое значение:
+// МенеджерПараметров
+//
+Функция МенеджерПараметров() Экспорт
+```
+
+## ДобавитьПровайдер
+
+```bsl
+// Регистрирует произвольный класс-провайдер в менеджере.
+//
+// Параметры:
+// КлассПровайдера - Объект - класс, реализующий интерфейс провайдера configor
+// Приоритет - Число - приоритет
+// Идентификатор - Строка - явный идентификатор; при коллизии configor добавит #2, #3, ...
+//
+// Возвращаемое значение:
+// Объект - переданный КлассПровайдера
+//
+Функция ДобавитьПровайдер(Знач КлассПровайдера, Знач Приоритет = Неопределено, Знач Идентификатор = Неопределено) Экспорт
+```
+
+## ДобавитьПровайдерСоответствие
+
+```bsl
+// Регистрирует ПровайдерПараметровСоответствие с заданными значениями.
+//
+// Параметры:
+// Значения - Соответствие - значения параметров (по умолчанию пустое)
+// Приоритет - Число
+// Идентификатор - Строка
+//
+// Возвращаемое значение:
+// ПровайдерПараметровСоответствие
+//
+Функция ДобавитьПровайдерСоответствие(Знач Значения = Неопределено, Знач Приоритет = Неопределено, Знач Идентификатор = Неопределено) Экспорт
+```
+
+## ДобавитьПровайдерENV
+
+```bsl
+// Регистрирует ПровайдерПараметровENV.
+//
+// Параметры:
+// Префикс - Строка - префикс переменных среды
+// Приоритет - Число
+// Идентификатор - Строка
+//
+// Возвращаемое значение:
+// ПровайдерПараметровENV
+//
+Функция ДобавитьПровайдерENV(Знач Префикс = "", Знач Приоритет = Неопределено, Знач Идентификатор = Неопределено) Экспорт
+```
+
+## ДобавитьПровайдерФайлов
+
+```bsl
+// Регистрирует файловый метапровайдер — обёртку над несколькими физическими
+// файловыми провайдерами (yaml/json/ini) с одинаковым приоритетом.
+//
+// Параметры:
+// Идентификатор - Строка - базовый идентификатор метапровайдера
+// Приоритет - Число
+// Форматы - Строка - список форматов через пробел (по умолчанию "yaml json ini")
+//
+// Возвращаемое значение:
+// ФайловыйМетапровайдер
+//
+Функция ДобавитьПровайдерФайлов(Знач Идентификатор, Знач Приоритет, Знач Форматы = "yaml json ini") Экспорт
+```
+
+## ДобавитьПровайдерФайлНастроек
+
+```bsl
+// Регистрирует один файловый провайдер по конкретному пути к файлу.
+// Формат определяется по расширению (.yaml/.yml — yaml, .json — json, .ini — ini).
+//
+// Параметры:
+// ПутьКФайлу - Строка - полный или относительный путь к файлу настроек
+// Приоритет - Число
+// Идентификатор - Строка
+//
+// Возвращаемое значение:
+// Объект - класс-провайдер (ПровайдерПараметровYAML/JSON/INI)
+//
+Функция ДобавитьПровайдерФайлНастроек(Знач ПутьКФайлу, Знач Приоритет = Неопределено, Знач Идентификатор = Неопределено) Экспорт
+```
+
+## УдалитьПровайдер
+
+```bsl
+// Удаляет (отключает) провайдер по идентификатору.
+//
+// Если идентификатор соответствует файловому метапровайдеру —
+// отключает все его физические провайдеры и удаляет метапровайдер из реестра.
+//
+// Параметры:
+// Идентификатор - Строка
+//
+Процедура УдалитьПровайдер(Знач Идентификатор) Экспорт
+```
+
+## ОчиститьПровайдеры
+
+```bsl
+// Полностью очищает состав провайдеров: пересоздаёт МенеджерПараметров
+// и сбрасывает реестр файловых метапровайдеров.
+//
+// Полезно когда нужно собрать собственную композицию с нуля,
+// не наследуя дефолтный состав (env / default / inline).
+//
+Процедура ОчиститьПровайдеры() Экспорт
+```
+
+## Провайдер
+
+```bsl
+// Возвращает обёртку ПровайдерПараметров (configor) по идентификатору.
+//
+// Параметры:
+// Идентификатор - Строка
+//
+// Возвращаемое значение:
+// ПровайдерПараметров (обёртка configor) или Неопределено
+//
+Функция Провайдер(Знач Идентификатор) Экспорт
+```
+
+## ПровайдерФайлов
+
+```bsl
+// Возвращает зарегистрированный файловый метапровайдер.
+//
+// Параметры:
+// Идентификатор - Строка
+//
+// Возвращаемое значение:
+// ФайловыйМетапровайдер
+//
+Функция ПровайдерФайлов(Знач Идентификатор) Экспорт
+```
+
+## НастройкаПоискаФайла
+
+```bsl
+// Возвращает глобальный объект настроек поиска файлов МенеджерПараметров
+// (общий fallback для всех файловых провайдеров).
+//
+// Возвращаемое значение:
+// НастройкиФайловогоПровайдера
+//
+Функция НастройкаПоискаФайла() Экспорт
+```
+
+## Файловый метапровайдер
+
+Возвращается методами `ДобавитьПровайдерФайлов` / `ПровайдерФайлов`. Проксирует настройки сразу в физические провайдеры (`<база>-yaml`, `<база>-json`, `<база>-ini`).
+
+Доступные методы:
+
+- `Идентификатор()` — базовый идентификатор
+- `ИдентификаторыФизическихПровайдеров()` — фиксированный массив идентификаторов
+- `Форматы()` — фиксированный массив форматов
+- `Настройки(Формат)` — `НастройкиФайловогоПровайдера` конкретного физического провайдера
+- `УстановитьПриоритет(Приоритет)`
+- `УстановитьИмяФайла(Имя)`
+- `УстановитьФайлПараметров(Путь)`
+- `УстановитьСтандартныеКаталогиПоиска(ВложенныйКаталог = "")`
+- `ДобавитьКаталогПоиска(Каталог)`
+- `ОчиститьПутиПоиска()`
+- `УстановитьВложенныйКаталогПоиска(ВложенныйКаталог)`
+- `Отключить()` / `Включить()`
diff --git a/docs/api/index.md b/docs/api/index.md
index adbe76c..b8336ef 100644
--- a/docs/api/index.md
+++ b/docs/api/index.md
@@ -52,6 +52,7 @@
## Классы
* [СоветДругогоМастера](Классы/СоветДругогоМастера)
+* [СтроительМенеджераПараметров](Классы/СтроительМенеджераПараметров.md)
* [Завязь](Классы/Завязь.md)
* [Табакерка](Классы/Табакерка.md)
* [ОпределениеЖелудя](Классы/ОпределениеЖелудя.md)
diff --git a/packagedef b/packagedef
index 9e697e6..f82449d 100644
--- a/packagedef
+++ b/packagedef
@@ -5,18 +5,18 @@
Описание.Имя("autumn")
- .Версия("4.3.13")
+ .Версия("5.0.0")
.Автор("Nikita Fedkin")
.АдресАвтора("nixel2007@gmail.com")
.Описание("Dependency injection framework для OneScript")
- .ВерсияСреды("1.9.2")
+ .ВерсияСреды("2.0.0")
.ВключитьФайл("src")
.ВключитьФайл("tests")
.ВключитьФайл("LICENSE.md")
.ВключитьФайл("README.md")
.ЗависитОт("annotations", "1.6.0")
.ЗависитОт("asserts", "1.4.0")
- .ЗависитОт("configor", "0.9.1")
+ .ЗависитОт("configor", "0.12.0")
.ЗависитОт("logos", "1.7.1")
.ЗависитОт("fluent", "0.6.1")
.ЗависитОт("reflector", "0.7.1")
diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os"
new file mode 100644
index 0000000..2271355
--- /dev/null
+++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os"
@@ -0,0 +1,295 @@
+// Строитель МенеджерПараметров для autumn.
+//
+// Инкапсулирует создание и настройку МенеджерПараметров (configor)
+// с заранее заданным дефолтным составом провайдеров.
+//
+// Дефолтный состав:
+// * env — ПровайдерПараметровENV, приоритет 1
+// * default — ФайловыйМетапровайдер (yaml + json + ini), приоритет 2,
+// имя файла "autumn-properties", стандартные каталоги поиска с подкаталогом "src"
+// * inline — ПровайдерПараметровСоответствие, приоритет 3
+//
+// Создается и настраивается ДО передачи СоветДругогоМастера в Поделку.
+// Поделка забирает уже сконфигурированный МенеджерПараметров через метод МенеджерПараметров().
+//
+// Канонический нейминг методов добавления:
+// ДобавитьПровайдер — общий, для произвольного класса-провайдера
+// ДобавитьПровайдерСоответствие — inline-значения через Соответствие
+// ДобавитьПровайдерENV — переменные среды
+// ДобавитьПровайдерФайлов — мета-обёртка над несколькими форматами (yaml/json/ini)
+// ДобавитьПровайдерФайлНастроек — один файл с автоопределением формата по расширению
+//
+
+#Использовать configor
+
+Перем _МенеджерПараметров; // МенеджерПараметров (configor)
+Перем _ФайловыеМетапровайдеры; // Соответствие: идентификатор -> ФайловыйМетапровайдер
+
+#Область ПрограммныйИнтерфейс
+
+// Считывает значения из всех зарегистрированных провайдеров.
+//
+Процедура Прочитать() Экспорт
+ _МенеджерПараметров.Прочитать();
+КонецПроцедуры
+
+// Возвращает значение параметра по имени.
+//
+// Параметры:
+// Имя - Строка
+// ЗначениеПоУмолчанию - Произвольный
+//
+// Возвращаемое значение:
+// Произвольный
+//
+Функция Параметр(Знач Имя, Знач ЗначениеПоУмолчанию = Неопределено) Экспорт
+ Возврат _МенеджерПараметров.Параметр(Имя, ЗначениеПоУмолчанию);
+КонецФункции
+
+Функция МенеджерПараметров()
+ Возврат _МенеджерПараметров;
+КонецФункции
+
+// Регистрирует произвольный класс-провайдер в менеджере.
+//
+// Параметры:
+// КлассПровайдера - Объект - класс, реализующий интерфейс провайдера configor
+// Приоритет - Число - приоритет (по умолчанию берётся из самого провайдера)
+// Идентификатор - Строка - явный идентификатор; при коллизии configor сам добавит #2, #3, ...
+//
+// Возвращаемое значение:
+// Объект - переданный КлассПровайдера (для chain-настроек через .Настройки())
+//
+Функция ДобавитьПровайдер(Знач КлассПровайдера,
+ Знач Приоритет = Неопределено,
+ Знач Идентификатор = Неопределено) Экспорт
+
+ _МенеджерПараметров.ДобавитьПровайдерПараметров(КлассПровайдера, Приоритет, Идентификатор);
+ Возврат КлассПровайдера;
+
+КонецФункции
+
+// Регистрирует ПровайдерПараметровСоответствие с заданными значениями.
+//
+// Параметры:
+// Значения - Соответствие - значения параметров
+// Приоритет - Число
+// Идентификатор - Строка
+//
+// Возвращаемое значение:
+// ПровайдерПараметровСоответствие
+//
+Функция ДобавитьПровайдерСоответствие(Знач Значения,
+ Знач Приоритет = Неопределено,
+ Знач Идентификатор = Неопределено) Экспорт
+
+ Провайдер = Новый ПровайдерПараметровСоответствие(Значения);
+ Возврат ДобавитьПровайдер(Провайдер, Приоритет, Идентификатор);
+
+КонецФункции
+
+// Регистрирует ПровайдерПараметровENV.
+//
+// Параметры:
+// Префикс - Строка - префикс переменных среды
+// Приоритет - Число
+// Идентификатор - Строка
+//
+// Возвращаемое значение:
+// ПровайдерПараметровENV
+//
+Функция ДобавитьПровайдерENV(Знач Префикс = "",
+ Знач Приоритет = Неопределено,
+ Знач Идентификатор = Неопределено) Экспорт
+
+ Провайдер = Новый ПровайдерПараметровENV(Префикс);
+ Возврат ДобавитьПровайдер(Провайдер, Приоритет, Идентификатор);
+
+КонецФункции
+
+// Регистрирует файловый метапровайдер — обёртку над несколькими физическими
+// файловыми провайдерами (yaml/json/ini) с одинаковым приоритетом.
+//
+// Каждый физический провайдер получает идентификатор вида "<база>-<формат>".
+// Через возвращаемую обёртку можно настраивать имя файла, каталоги поиска
+// и т.п. сразу для всех физических провайдеров.
+//
+// Параметры:
+// Идентификатор - Строка - базовый идентификатор метапровайдера
+// Приоритет - Число - общий приоритет
+// Форматы - Строка - список форматов через пробел (по умолчанию "yaml json ini")
+//
+// Возвращаемое значение:
+// ФайловыйМетапровайдер
+//
+Функция ДобавитьПровайдерФайлов(Знач Идентификатор,
+ Знач Приоритет = Неопределено,
+ Знач Форматы = "yaml json ini") Экспорт
+
+ Если _ФайловыеМетапровайдеры.Получить(Идентификатор) <> Неопределено Тогда
+ ВызватьИсключение СтрШаблон("Файловый метапровайдер с идентификатором <%1> уже зарегистрирован", Идентификатор);
+ КонецЕсли;
+
+ Метапровайдер = Новый ФайловыйМетапровайдер(_МенеджерПараметров, Идентификатор, Приоритет, Форматы);
+ _ФайловыеМетапровайдеры.Вставить(Идентификатор, Метапровайдер);
+ Возврат Метапровайдер;
+
+КонецФункции
+
+// Регистрирует один файловый провайдер по конкретному пути к файлу.
+// Формат определяется по расширению (.yaml/.yml — yaml, .json — json, .ini — ini).
+//
+// Параметры:
+// ПутьКФайлу - Строка - полный или относительный путь к файлу настроек
+// Приоритет - Число
+// Идентификатор - Строка
+//
+// Возвращаемое значение:
+// Объект - класс-провайдер (ПровайдерПараметровYAML/JSON/INI)
+//
+Функция ДобавитьПровайдерФайлНастроек(Знач ПутьКФайлу,
+ Знач Приоритет = Неопределено,
+ Знач Идентификатор = Неопределено) Экспорт
+
+ Формат = ОпределитьФорматПоРасширению(ПутьКФайлу);
+ Провайдер = СоздатьФизическийПровайдерПоФормату(Формат);
+ ДобавитьПровайдер(Провайдер, Приоритет, Идентификатор);
+ Провайдер.Настройки().УстановитьФайлПараметров(ПутьКФайлу);
+ Возврат Провайдер;
+
+КонецФункции
+
+// Удаляет (отключает) провайдер по идентификатору.
+//
+// Если идентификатор соответствует файловому метапровайдеру —
+// отключает все его физические провайдеры и удаляет метапровайдер из реестра.
+//
+// Параметры:
+// Идентификатор - Строка - идентификатор провайдера или базовый идентификатор метапровайдера
+//
+Процедура УдалитьПровайдер(Знач Идентификатор) Экспорт
+
+ Метапровайдер = _ФайловыеМетапровайдеры.Получить(Идентификатор);
+
+ Если Метапровайдер <> Неопределено Тогда
+ Для Каждого ИдФизического Из Метапровайдер.ИдентификаторыФизическихПровайдеров() Цикл
+ _МенеджерПараметров.ОтключитьПровайдер(ИдФизического);
+ КонецЦикла;
+ _ФайловыеМетапровайдеры.Удалить(Идентификатор);
+ Возврат;
+ КонецЕсли;
+
+ _МенеджерПараметров.ОтключитьПровайдер(Идентификатор);
+
+КонецПроцедуры
+
+// Полностью очищает состав провайдеров: пересоздаёт МенеджерПараметров
+// и сбрасывает реестр файловых метапровайдеров.
+//
+// Полезно когда нужно собрать собственную композицию с нуля,
+// не наследуя дефолтный состав (env / default / inline).
+//
+Процедура ОчиститьПровайдеры() Экспорт
+
+ _МенеджерПараметров = Новый МенеджерПараметров;
+ _ФайловыеМетапровайдеры = Новый Соответствие;
+
+КонецПроцедуры
+
+// Возвращает обёртку ПровайдерПараметров (configor) по идентификатору.
+//
+// Через возвращаемый объект можно изменить приоритет, идентификатор,
+// получить настройки конкретного провайдера через .Настройки().
+//
+// Параметры:
+// Идентификатор - Строка - идентификатор физического провайдера
+//
+// Возвращаемое значение:
+// ПровайдерПараметров (обёртка configor) или Неопределено
+//
+Функция Провайдер(Знач Идентификатор) Экспорт
+ Возврат _МенеджерПараметров.ПровайдерПоИдентификатору(Идентификатор);
+КонецФункции
+
+// Возвращает зарегистрированный файловый метапровайдер.
+//
+// Параметры:
+// Идентификатор - Строка - базовый идентификатор метапровайдера
+//
+// Возвращаемое значение:
+// ФайловыйМетапровайдер
+//
+Функция ПровайдерФайлов(Знач Идентификатор) Экспорт
+
+ Метапровайдер = _ФайловыеМетапровайдеры.Получить(Идентификатор);
+ Если Метапровайдер = Неопределено Тогда
+ ВызватьИсключение СтрШаблон("Файловый метапровайдер с идентификатором <%1> не найден", Идентификатор);
+ КонецЕсли;
+ Возврат Метапровайдер;
+
+КонецФункции
+
+// Возвращает глобальный объект настроек поиска файлов МенеджерПараметров
+// (общий fallback для всех файловых провайдеров).
+//
+// Возвращаемое значение:
+// НастройкиФайловогоПровайдера
+//
+Функция НастройкаПоискаФайла() Экспорт
+ Возврат _МенеджерПараметров.НастройкаПоискаФайла();
+КонецФункции
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ОпределитьФорматПоРасширению(Знач ПутьКФайлу)
+
+ Файл = Новый Файл(ПутьКФайлу);
+ Расширение = НРег(Файл.Расширение);
+
+ Если Расширение = ".yaml" ИЛИ Расширение = ".yml" Тогда
+ Возврат "yaml";
+ ИначеЕсли Расширение = ".json" Тогда
+ Возврат "json";
+ ИначеЕсли Расширение = ".ini" Тогда
+ Возврат "ini";
+ КонецЕсли;
+
+ ВызватьИсключение СтрШаблон(
+ "Не удалось определить формат файла настроек по расширению <%1>."
+ " Поддерживаются: .yaml, .yml, .json, .ini.",
+ Расширение
+ );
+
+КонецФункции
+
+Функция СоздатьФизическийПровайдерПоФормату(Знач Формат)
+
+ Если Формат = "yaml" Тогда
+ Возврат Новый ПровайдерПараметровYAML;
+ ИначеЕсли Формат = "json" Тогда
+ Возврат Новый ПровайдерПараметровJSON;
+ ИначеЕсли Формат = "ini" Тогда
+ Возврат Новый ПровайдерПараметровINI;
+ КонецЕсли;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область Инициализация
+
+Процедура ПриСозданииОбъекта()
+
+ ОчиститьПровайдеры();
+
+ ДобавитьПровайдерENV("", 1, "env");
+
+ ФайловыйПровайдерПоУмолчанию = ДобавитьПровайдерФайлов("default", 2);
+ ФайловыйПровайдерПоУмолчанию.УстановитьИмяФайла("autumn-properties");
+ ФайловыйПровайдерПоУмолчанию.УстановитьСтандартныеКаталогиПоиска("src");
+
+КонецПроцедуры
+
+#КонецОбласти
diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\226\320\265\320\273\321\203\320\264\320\265\320\271.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\226\320\265\320\273\321\203\320\264\320\265\320\271.os"
index 32c49b5..664c414 100644
--- "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\226\320\265\320\273\321\203\320\264\320\265\320\271.os"
+++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\226\320\265\320\273\321\203\320\264\320\265\320\271.os"
@@ -4,7 +4,7 @@
#Использовать reflector
#Область ОписаниеПеременных
-
+
// Поделка - Управляющий ioc-контейнер.
Перем Поделка;
// РазворачивательАннотаций - разворачиватель аннотаций свойств и методов желудей.
@@ -500,36 +500,36 @@
КонецФункции
-Функция ПрочитатьТипЖелудя(Метод, Аннотации, Родитель)
-
- Аннотация = РаботаСАннотациями.НайтиАннотацию(Аннотации, "Завязь");
- ТипЖелудя = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(
- Аннотация,
- "Тип"
- );
-
- Если ТипЖелудя = Неопределено Тогда
- ТипЖелудя = Метод.Имя;
- КонецЕсли;
-
- Попытка
- РеальныйТип = Тип(ТипЖелудя);
- Исключение
- Если ТипЗнч(Родитель) = Тип("Сценарий") Тогда
- ВызватьИсключение СтрШаблон(
- "Тип желудя в лямбда-завязи не известен. Укажите тип желудя в аннотации &Завязь. Лямбда: %1",
- Родитель
- );
- Иначе
- ВызватьИсключение СтрШаблон(
- "Тип желудя в Завязи %1 класса %2 не известен. Укажите тип желудя в аннотации или переименуйте метод завязи.",
- Метод.Имя,
- Родитель
- );
- КонецЕсли;
- КонецПопытки;
-
- Возврат РеальныйТип;
+Функция ПрочитатьТипЖелудя(Метод, Аннотации, Родитель)
+
+ Аннотация = РаботаСАннотациями.НайтиАннотацию(Аннотации, "Завязь");
+ ТипЖелудя = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(
+ Аннотация,
+ "Тип"
+ );
+
+ Если ТипЖелудя = Неопределено Тогда
+ ТипЖелудя = Метод.Имя;
+ КонецЕсли;
+
+ Попытка
+ РеальныйТип = Тип(ТипЖелудя);
+ Исключение
+ Если ТипЗнч(Родитель) = Тип("Сценарий") Тогда
+ ВызватьИсключение СтрШаблон(
+ "Тип желудя в лямбда-завязи не известен. Укажите тип желудя в аннотации &Завязь. Лямбда: %1",
+ Родитель
+ );
+ Иначе
+ ВызватьИсключение СтрШаблон(
+ "Тип желудя в Завязи %1 класса %2 не известен. Укажите тип желудя в аннотации или переименуйте метод завязи.",
+ Метод.Имя,
+ Родитель
+ );
+ КонецЕсли;
+ КонецПопытки;
+
+ Возврат РеальныйТип;
КонецФункции
Функция ПрочитатьПрилепляемыеЧастицыВМетоде(Метод, ВладелецСвойств)
diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\271\320\234\320\265\321\202\320\260\320\277\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\271\320\234\320\265\321\202\320\260\320\277\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200.os"
new file mode 100644
index 0000000..e1c1a25
--- /dev/null
+++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\271\320\234\320\265\321\202\320\260\320\277\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200.os"
@@ -0,0 +1,294 @@
+// Метапровайдер, объединяющий несколько физических файловых провайдеров
+// (yaml/json/ini) configor под одним базовым идентификатором.
+//
+// Регистрирует каждый физический провайдер в МенеджерПараметров с идентификатором
+// вида "<база>-<формат>" (например "default-yaml", "default-json", "default-ini")
+// и общим приоритетом. Проксирует операции настройки на per-provider .Настройки().
+//
+// Создается через СтроительМенеджераПараметров.ДобавитьПровайдерФайлов.
+//
+
+#Использовать configor
+
+Перем БазовыйИдентификатор; // Строка
+Перем Провайдеры; // Соответствие: формат -> ПровайдерПараметров (обёртка configor)
+
+#Область ПрограммныйИнтерфейс
+
+// Возвращает базовый идентификатор метапровайдера
+//
+// Возвращаемое значение:
+// Строка - базовый идентификатор
+//
+Функция Идентификатор() Экспорт
+ Возврат БазовыйИдентификатор;
+КонецФункции
+
+// Возвращает массив идентификаторов физических провайдеров, зарегистрированных в менеджере
+//
+// Возвращаемое значение:
+// ФиксированныйМассив - массив строк-идентификаторов
+//
+Функция ИдентификаторыФизическихПровайдеров() Экспорт
+
+ Результат = Новый Массив;
+ Для Каждого КлючЗначение Из Провайдеры Цикл
+ Результат.Добавить(КлючЗначение.Значение.Идентификатор);
+ КонецЦикла;
+ Возврат Новый ФиксированныйМассив(Результат);
+
+КонецФункции
+
+// Возвращает массив форматов, которые покрывает метапровайдер
+//
+// Возвращаемое значение:
+// ФиксированныйМассив - массив строк-форматов
+//
+Функция Форматы() Экспорт
+
+ Результат = Новый Массив;
+ Для Каждого КлючЗначение Из Провайдеры Цикл
+ Результат.Добавить(КлючЗначение.Ключ);
+ КонецЦикла;
+ Возврат Новый ФиксированныйМассив(Результат);
+
+КонецФункции
+
+// Возвращает per-provider настройки физического провайдера для конкретного формата
+//
+// Параметры:
+// Формат - Строка - один из "yaml", "json", "ini"
+//
+// Возвращаемое значение:
+// НастройкиФайловогоПровайдера
+//
+Функция Настройки(Знач Формат) Экспорт
+ Возврат ПолучитьПровайдер(Формат).Настройки();
+КонецФункции
+
+// Устанавливает приоритет всем физическим провайдерам метапровайдера
+//
+// Параметры:
+// НовыйПриоритет - Число - приоритет
+//
+// Возвращаемое значение:
+// ФайловыйМетапровайдер - ЭтотОбъект для chain
+//
+Функция УстановитьПриоритет(Знач НовыйПриоритет) Экспорт
+
+ Для Каждого КлючЗначение Из Провайдеры Цикл
+ КлючЗначение.Значение.УстановитьПриоритет(НовыйПриоритет);
+ КонецЦикла;
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+// Прокси: установить имя файла для всех физических провайдеров
+//
+// Параметры:
+// ИмяФайла - Строка - имя файла без расширения
+//
+// Возвращаемое значение:
+// ФайловыйМетапровайдер
+//
+Функция УстановитьИмяФайла(Знач ИмяФайла) Экспорт
+
+ Для Каждого КлючЗначение Из Провайдеры Цикл
+ КлючЗначение.Значение.Настройки().УстановитьИмяФайла(ИмяФайла);
+ КонецЦикла;
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+// Прокси: установить путь к конкретному файлу параметров.
+//
+// Запрещён, если метапровайдер собран более чем из одного формата:
+// прокидывание одного и того же пути во все форматы (yaml/json/ini)
+// заведомо некорректно — формат файла однозначен. Для регистрации
+// конкретного файла используйте СтроительМенеджераПараметров.ДобавитьПровайдерФайлНастроек(...),
+// который определяет формат по расширению.
+//
+// Параметры:
+// ПутьКФайлу - Строка - полный путь к файлу
+//
+// Возвращаемое значение:
+// ФайловыйМетапровайдер
+//
+Функция УстановитьФайлПараметров(Знач ПутьКФайлу) Экспорт
+
+ Если Провайдеры.Количество() > 1 Тогда
+ ВызватьИсключение СтрШаблон(
+ "Метод УстановитьФайлПараметров неприменим к файловому метапровайдеру <%1>,"
+ " объединяющему более одного формата (форматов: %2)."
+ " Используйте СтроительМенеджераПараметров.ДобавитьПровайдерФайлНастроек(...).",
+ БазовыйИдентификатор, Провайдеры.Количество()
+ );
+ КонецЕсли;
+
+ Для Каждого КлючЗначение Из Провайдеры Цикл
+ КлючЗначение.Значение.Настройки().УстановитьФайлПараметров(ПутьКФайлу);
+ КонецЦикла;
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+// Прокси: установить стандартные каталоги поиска для всех физических провайдеров
+//
+// Параметры:
+// ВложенныйПодкаталог - Строка - дополнительный подкаталог в стандартных каталогах
+//
+// Возвращаемое значение:
+// ФайловыйМетапровайдер
+//
+Функция УстановитьСтандартныеКаталогиПоиска(Знач ВложенныйПодкаталог = "") Экспорт
+
+ Для Каждого КлючЗначение Из Провайдеры Цикл
+ КлючЗначение.Значение.Настройки().УстановитьСтандартныеКаталогиПоиска(ВложенныйПодкаталог);
+ КонецЦикла;
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+// Прокси: добавить дополнительный каталог поиска
+//
+// Параметры:
+// ПутьПоискаФайлов - Строка - полный путь к каталогу
+//
+// Возвращаемое значение:
+// ФайловыйМетапровайдер
+//
+Функция ДобавитьКаталогПоиска(Знач ПутьПоискаФайлов) Экспорт
+
+ Для Каждого КлючЗначение Из Провайдеры Цикл
+ КлючЗначение.Значение.Настройки().ДобавитьКаталогПоиска(ПутьПоискаФайлов);
+ КонецЦикла;
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+// Прокси: очистить все пути поиска
+//
+// Возвращаемое значение:
+// ФайловыйМетапровайдер
+//
+Функция ОчиститьПутиПоиска() Экспорт
+
+ Для Каждого КлючЗначение Из Провайдеры Цикл
+ КлючЗначение.Значение.Настройки().ОчиститьПутиПоиска();
+ КонецЦикла;
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+// Прокси: установить вложенный каталог поиска для всех физических провайдеров
+//
+// Параметры:
+// ИмяВложенногоКаталогаПоиска - Строка - вложенный каталог
+//
+// Возвращаемое значение:
+// ФайловыйМетапровайдер
+//
+Функция УстановитьВложенныйКаталогПоиска(Знач ИмяВложенногоКаталогаПоиска) Экспорт
+
+ Для Каждого КлючЗначение Из Провайдеры Цикл
+ КлючЗначение.Значение.Настройки().УстановитьВложенныйКаталогПоиска(ИмяВложенногоКаталогаПоиска);
+ КонецЦикла;
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+// Отключает все физические провайдеры метапровайдера
+//
+Процедура Отключить() Экспорт
+
+ Для Каждого КлючЗначение Из Провайдеры Цикл
+ КлючЗначение.Значение.Отключить();
+ КонецЦикла;
+
+КонецПроцедуры
+
+// Включает все физические провайдеры метапровайдера
+//
+Процедура Включить() Экспорт
+
+ Для Каждого КлючЗначение Из Провайдеры Цикл
+ КлючЗначение.Значение.Включить();
+ КонецЦикла;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ПолучитьПровайдер(Знач Формат)
+
+ Провайдер = Провайдеры.Получить(НРег(Формат));
+ Если Провайдер = Неопределено Тогда
+ ВызватьИсключение СтрШаблон(
+ "Формат <%1> не зарегистрирован в файловом метапровайдере <%2>",
+ Формат, БазовыйИдентификатор
+ );
+ КонецЕсли;
+ Возврат Провайдер;
+
+КонецФункции
+
+Функция СоздатьФизическийПровайдер(Знач Формат)
+
+ Если Формат = "yaml" Тогда
+ Возврат Новый ПровайдерПараметровYAML;
+ ИначеЕсли Формат = "json" Тогда
+ Возврат Новый ПровайдерПараметровJSON;
+ ИначеЕсли Формат = "ini" Тогда
+ Возврат Новый ПровайдерПараметровINI;
+ КонецЕсли;
+
+ ВызватьИсключение СтрШаблон(
+ "Неизвестный формат файлового провайдера: <%1>. Поддерживаются: yaml, json, ini.",
+ Формат
+ );
+
+КонецФункции
+
+#КонецОбласти
+
+#Область Инициализация
+
+// Параметры:
+// МенеджерПараметровРодитель - МенеджерПараметров - менеджер configor, в который регистрировать
+// ИдентификаторБазовый - Строка - базовый идентификатор метапровайдера
+// Приоритет - Число - общий приоритет для всех физических провайдеров
+// Форматы - Строка - список форматов через пробел (по умолчанию "yaml json ini")
+//
+Процедура ПриСозданииОбъекта(Знач МенеджерПараметровРодитель,
+ Знач ИдентификаторБазовый,
+ Знач Приоритет,
+ Знач Форматы = "yaml json ini")
+
+ БазовыйИдентификатор = ИдентификаторБазовый;
+ Провайдеры = Новый Соответствие;
+
+ МассивФорматов = СтрРазделить(НРег(Форматы), " ", Ложь);
+
+ Для Каждого Формат Из МассивФорматов Цикл
+
+ Если ПустаяСтрока(Формат) Тогда
+ Продолжить;
+ КонецЕсли;
+
+ ИдентификаторФизический = БазовыйИдентификатор + "-" + Формат;
+ КлассПровайдера = СоздатьФизическийПровайдер(Формат);
+ МенеджерПараметровРодитель.ДобавитьПровайдерПараметров(
+ КлассПровайдера, Приоритет, ИдентификаторФизический
+ );
+ Провайдеры.Вставить(
+ Формат,
+ МенеджерПараметровРодитель.ПровайдерПоИдентификатору(ИдентификаторФизический)
+ );
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+#КонецОбласти
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\265\320\273\320\272\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\265\320\273\320\272\320\260.os"
index d7c4726..8d238cc 100644
--- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\265\320\273\320\272\320\260.os"
+++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\265\320\273\320\272\320\260.os"
@@ -369,33 +369,7 @@
Процедура ИнициализироватьМенеджерПараметров(СоветДругогоМастера)
- МенеджерПараметров = Новый МенеджерПараметров();
-
- // TODO: Добавить провайдер аргументов командной строки
- ПровайдерПараметровINI = Новый ПровайдерПараметровINI();
- ПровайдерПараметровENV = Новый ПровайдерПараметровENV(
- СоветДругогоМастера.ПрефиксПеременныхСреды()
- );
- ПровайдерПараметровСоответствие = Новый ПровайдерПараметровСоответствие(
- СоветДругогоМастера.ЗначенияДеталек()
- );
-
- МенеджерПараметров.ДобавитьПровайдерПараметров(ПровайдерПараметровENV, 1);
- МенеджерПараметров.ИспользоватьПровайдерJSON(2);
- МенеджерПараметров.ИспользоватьПровайдерYAML(2);
- МенеджерПараметров.ДобавитьПровайдерПараметров(ПровайдерПараметровINI, 2);
- МенеджерПараметров.ДобавитьПровайдерПараметров(ПровайдерПараметровСоответствие, 3);
-
- НастройкаФайловогоПровайдера = МенеджерПараметров.НастройкаПоискаФайла();
-
- НастройкаФайловогоПровайдера.УстановитьСтандартныеКаталогиПоиска(
- СоветДругогоМастера.ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек()
- );
-
- НастройкаФайловогоПровайдера.УстановитьИмяФайла(
- СоветДругогоМастера.ИмяФайлаСоЗначениямиДеталек()
- );
-
+ МенеджерПараметров = СоветДругогоМастера.ПолучитьСтроительМенеджераПараметров();
МенеджерПараметров.Прочитать();
КонецПроцедуры
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\276\320\262\320\265\321\202\320\224\321\200\321\203\320\263\320\276\320\263\320\276\320\234\320\260\321\201\321\202\320\265\321\200\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\276\320\262\320\265\321\202\320\224\321\200\321\203\320\263\320\276\320\263\320\276\320\234\320\260\321\201\321\202\320\265\321\200\320\260.os"
index a80b7b1..ce45dcd 100644
--- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\276\320\262\320\265\321\202\320\224\321\200\321\203\320\263\320\276\320\263\320\276\320\234\320\260\321\201\321\202\320\265\321\200\320\260.os"
+++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\276\320\262\320\265\321\202\320\224\321\200\321\203\320\263\320\276\320\263\320\276\320\234\320\260\321\201\321\202\320\265\321\200\320\260.os"
@@ -1,3 +1,6 @@
+#Использовать "../internal"
+#Использовать logos
+
#Область ОписаниеПеременных
// Соответствие - Значения деталек в виде соответствия
@@ -17,22 +20,92 @@
//
Перем ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек;
+// Соответствие: имя поля -> Истина, если поле явно установлено через сеттер.
+// Используется для условного применения настроек к строителю.
+//
+Перем _Установлено;
+
+// СтроительМенеджераПараметров - закэшированный экземпляр строителя.
+// Создаётся лениво при первом обращении к ПолучитьСтроительМенеджераПараметров()
+// и переиспользуется при повторных вызовах, чтобы пользовательские правки строителя
+// (через ОчиститьПровайдеры/ДобавитьПровайдер*/УдалитьПровайдер) дошли до Поделки.
+//
+Перем _Строитель;
+
+Перем Лог;
+
#КонецОбласти
#Область ПрограммныйИнтерфейс
-// Установить/получить значения деталек.
+// Возвращает строитель менеджера параметров с применёнными значениями
+// устаревших полей совета, явно установленных через сеттеры
+// (ЗначенияДеталек, ПрефиксПеременныхСреды, ИмяФайлаСоЗначениямиДеталек,
+// ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек).
+//
+// Если поле не было явно установлено, дефолт строителя сохраняется.
+//
+// Строитель кэшируется при первом вызове и возвращается тем же экземпляром
+// при последующих вызовах. Это позволяет внешнему коду получить строитель,
+// сконфигурировать его (добавить/удалить провайдеры, очистить состав)
+// и затем передать СоветДругогоМастера в Поделку - Поделка получит тот же
+// строитель со всеми внесёнными правками.
//
-// Параметры:
-// НовоеЗначение - Соответствие - устанавливаемые значения деталек.
+// Возвращаемое значение:
+// СтроительМенеджераПараметров
+//
+Функция ПолучитьСтроительМенеджераПараметров() Экспорт
+
+ Если _Строитель <> Неопределено Тогда
+ Возврат _Строитель;
+ КонецЕсли;
+
+ Строитель = Новый СтроительМенеджераПараметров();
+
+ Если Установлено("ПрефиксПеременныхСреды") Тогда
+ Строитель.Провайдер("env").Настройки().УстановитьПрефикс(ПрефиксПеременныхСреды);
+ КонецЕсли;
+
+ Если Установлено("ИмяФайлаСоЗначениямиДеталек")
+ Или Установлено("ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек") Тогда
+
+ Метапровайдер = Строитель.ПровайдерФайлов("default");
+
+ Если Установлено("ИмяФайлаСоЗначениямиДеталек") Тогда
+ Метапровайдер.УстановитьИмяФайла(ИмяФайлаСоЗначениямиДеталек);
+ КонецЕсли;
+
+ Если Установлено("ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек") Тогда
+ Метапровайдер.УстановитьСтандартныеКаталогиПоиска(
+ ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек
+ );
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Если Установлено("ЗначенияДеталек") Тогда
+ Строитель.ДобавитьПровайдерСоответствие(ЗначенияДеталек, 3, "inline");
+ КонецЕсли;
+
+ _Строитель = Строитель;
+ Возврат _Строитель;
+
+КонецФункции
+
+// Устарела.
+// Установить/получить значения деталек.
//
-// Возвращаемое значение:
-// Соответствие, СоветДругогоМастера - Текущее установленное значение для гетера, ЭтотОбъект для сеттера.
+// Устаревшее API. Рекомендуется использовать
+// ПолучитьСтроительМенеджераПараметров().ДобавитьПровайдерСоответствие(...).
//
Функция ЗначенияДеталек(НовоеЗначение = Неопределено) Экспорт
Если НовоеЗначение <> Неопределено Тогда
+ ПредупредитьОбУстаревшемМетоде(
+ "ЗначенияДеталек", "ДобавитьПровайдерСоответствие(...)"
+ );
ЗначенияДеталек = НовоеЗначение;
+ ОтметитьУстановленным("ЗначенияДеталек");
Возврат ЭтотОбъект;
КонецЕсли;
@@ -40,37 +113,41 @@
КонецФункции
+// Устарела.
// Установить/получить префикс переменных среды, хранящих значения деталек.
//
-// Параметры:
-// НовоеЗначение - Строка - устанавливаемый префикс переменных среды.
-//
-// Возвращаемое значение:
-// Строка, СоветДругогоМастера - Текущее установленное значение для гетера, ЭтотОбъект для сеттера.
+// Устаревшее API. Рекомендуется использовать
+// ПолучитьСтроительМенеджераПараметров().Провайдер("env").Настройки().УстановитьПрефикс(...).
//
Функция ПрефиксПеременныхСреды(НовоеЗначение = Неопределено) Экспорт
-
+
Если НовоеЗначение <> Неопределено Тогда
+ ПредупредитьОбУстаревшемМетоде(
+ "ПрефиксПеременныхСреды", "Провайдер(""env"").Настройки().УстановитьПрефикс(...)"
+ );
ПрефиксПеременныхСреды = НовоеЗначение;
+ ОтметитьУстановленным("ПрефиксПеременныхСреды");
Возврат ЭтотОбъект;
КонецЕсли;
-
+
Возврат ПрефиксПеременныхСреды;
КонецФункции
+// Устарела.
// Установить/получить имя файла (без расширения), в котором хранятся значения деталек.
//
-// Параметры:
-// НовоеЗначение - Строка - устанавливаемое имя файла.
-//
-// Возвращаемое значение:
-// Строка, СоветДругогоМастера - Текущее установленное значение для гетера, ЭтотОбъект для сеттера.
+// Устаревшее API. Рекомендуется использовать
+// ПолучитьСтроительМенеджераПараметров().ПровайдерФайлов("default").УстановитьИмяФайла(...).
//
Функция ИмяФайлаСоЗначениямиДеталек(НовоеЗначение = Неопределено) Экспорт
Если НовоеЗначение <> Неопределено Тогда
+ ПредупредитьОбУстаревшемМетоде(
+ "ИмяФайлаСоЗначениямиДеталек", "ПровайдерФайлов(""default"").УстановитьИмяФайла(...)"
+ );
ИмяФайлаСоЗначениямиДеталек = НовоеЗначение;
+ ОтметитьУстановленным("ИмяФайлаСоЗначениямиДеталек");
Возврат ЭтотОбъект;
КонецЕсли;
@@ -78,18 +155,21 @@
КонецФункции
+// Устарела.
// Установить/получить относительный путь к каталогу, где хранятся файл со значениями деталек.
//
-// Параметры:
-// НовоеЗначение - Строка - устанавливаемый путь к каталогу.
-//
-// Возвращаемое значение:
-// Строка, СоветДругогоМастера - Текущее установленное значение для гетера, ЭтотОбъект для сеттера.
+// Устаревшее API. Рекомендуется использовать
+// ПолучитьСтроительМенеджераПараметров().ПровайдерФайлов("default").УстановитьСтандартныеКаталогиПоиска(...).
//
Функция ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек(НовоеЗначение = Неопределено) Экспорт
Если НовоеЗначение <> Неопределено Тогда
+ ПредупредитьОбУстаревшемМетоде(
+ "ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек",
+ "ПровайдерФайлов(""default"").УстановитьСтандартныеКаталогиПоиска(...)"
+ );
ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек = НовоеЗначение;
+ ОтметитьУстановленным("ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек");
Возврат ЭтотОбъект;
КонецЕсли;
@@ -99,6 +179,24 @@
#КонецОбласти
+#Область СлужебныеПроцедурыИФункции
+
+Процедура ПредупредитьОбУстаревшемМетоде(Знач ИмяМетода, Знач РекомендуемаяЗамена)
+
+ Лог.Предупреждение("Метод СоветДругогоМастера.%1(...) устарел. Используйте ПолучитьСтроительМенеджераПараметров().%2, настроив строитель до передачи СоветДругогоМастера в Поделку.", ИмяМетода, РекомендуемаяЗамена);
+
+КонецПроцедуры
+
+Процедура ОтметитьУстановленным(Знач ИмяПоля)
+ _Установлено.Вставить(ИмяПоля, Истина);
+КонецПроцедуры
+
+Функция Установлено(Знач ИмяПоля)
+ Возврат _Установлено.Получить(ИмяПоля) = Истина;
+КонецФункции
+
+#КонецОбласти
+
#Область Инициализация
// Советы по созданию поделки, упакованные в объект.
@@ -110,6 +208,10 @@
ИмяФайлаСоЗначениямиДеталек = "autumn-properties";
ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек = "src";
+ _Установлено = Новый Соответствие;
+
+ Лог = Логирование.ПолучитьЛог("oscript.lib.autumn.application.context");
+
КонецПроцедуры
#КонецОбласти
diff --git "a/tests/\320\241\320\276\320\262\320\265\321\202\320\224\321\200\321\203\320\263\320\276\320\263\320\276\320\234\320\260\321\201\321\202\320\265\321\200\320\260.os" "b/tests/\320\241\320\276\320\262\320\265\321\202\320\224\321\200\321\203\320\263\320\276\320\263\320\276\320\234\320\260\321\201\321\202\320\265\321\200\320\260.os"
index 7f61afa..294a566 100644
--- "a/tests/\320\241\320\276\320\262\320\265\321\202\320\224\321\200\321\203\320\263\320\276\320\263\320\276\320\234\320\260\321\201\321\202\320\265\321\200\320\260.os"
+++ "b/tests/\320\241\320\276\320\262\320\265\321\202\320\224\321\200\321\203\320\263\320\276\320\263\320\276\320\234\320\260\321\201\321\202\320\265\321\200\320\260.os"
@@ -177,4 +177,94 @@
КонецПроцедуры
+&Тест
+Процедура ПрименитьУстаревшиеНастройкиПрефиксENV() Экспорт
+
+ // Дано
+ Совет = Новый СоветДругогоМастера();
+ Совет.ПрефиксПеременныхСреды("MYAPP");
+
+ // Когда
+ Строитель = Совет.ПолучитьСтроительМенеджераПараметров();
+
+ // Тогда
+ Ожидаем.Что(Строитель.Провайдер("env").Настройки().ПолучитьПрефикс())
+ .Равно("MYAPP");
+
+КонецПроцедуры
+
+&Тест
+Процедура ПрименитьУстаревшиеНастройкиИмяФайла() Экспорт
+
+ // Дано
+ Совет = Новый СоветДругогоМастера();
+ Совет.ИмяФайлаСоЗначениямиДеталек("my-config");
+
+ // Когда
+ Строитель = Совет.ПолучитьСтроительМенеджераПараметров();
+
+ // Тогда
+ НастройкиJSON = Строитель.Провайдер("default-json").Настройки().ПолучитьНастройки();
+ Ожидаем.Что(НастройкиJSON.НаименованияФайлаПараметров.Найти("my-config"))
+ .Не_().Равно(Неопределено);
+
+КонецПроцедуры
+
+&Тест
+Процедура ПрименитьУстаревшиеНастройкиЗначенияДеталек() Экспорт
+
+ // Дано
+ Совет = Новый СоветДругогоМастера();
+ Значения = Новый Соответствие;
+ Значения.Вставить("ключ", "значение");
+ Совет.ЗначенияДеталек(Значения);
+
+ // Когда
+ Строитель = Совет.ПолучитьСтроительМенеджераПараметров();
+
+ // Тогда
+ Строитель.Прочитать();
+ Ожидаем.Что(Строитель.Параметр("ключ")).Равно("значение");
+
+КонецПроцедуры
+
+&Тест
+Процедура СтроительКэшируетсяИВозвращаетсяТемЖеЭкземпляром() Экспорт
+
+ // Дано
+ Совет = Новый СоветДругогоМастера();
+
+ // Когда
+ ПервыйСтроитель = Совет.ПолучитьСтроительМенеджераПараметров();
+ ВторойСтроитель = Совет.ПолучитьСтроительМенеджераПараметров();
+
+ // Тогда
+ Ожидаем.Что(ВторойСтроитель).Равно(ПервыйСтроитель);
+
+КонецПроцедуры
+
+&Тест
+Процедура ПравкиСтроителяВидныПриПовторномПолучении() Экспорт
+
+ // Дано
+ Совет = Новый СоветДругогоМастера();
+ Строитель = Совет.ПолучитьСтроительМенеджераПараметров();
+
+ // Когда
+ Строитель.ОчиститьПровайдеры();
+ Значения = Новый Соответствие;
+ Значения.Вставить("ключ", "из-кэша");
+ Строитель.ДобавитьПровайдерСоответствие(Значения, 1, "только-inline");
+
+ СтроительИзПоделки = Совет.ПолучитьСтроительМенеджераПараметров();
+
+ // Тогда
+ Ожидаем.Что(СтроительИзПоделки.Провайдер("env")).Равно(Неопределено);
+ Ожидаем.Что(СтроительИзПоделки.Провайдер("только-inline")).Не_().Равно(Неопределено);
+
+ СтроительИзПоделки.Прочитать();
+ Ожидаем.Что(СтроительИзПоделки.Параметр("ключ")).Равно("из-кэша");
+
+КонецПроцедуры
+
Рефлектор = Новый Рефлектор();
diff --git "a/tests/\320\241\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" "b/tests/\320\241\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os"
new file mode 100644
index 0000000..c612b5c
--- /dev/null
+++ "b/tests/\320\241\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os"
@@ -0,0 +1,299 @@
+#Использовать asserts
+#Использовать configor
+#Использовать ".."
+
+// BSLLS-off: DuplicateStringLiteral, MagicNumber
+
+&Тест
+Процедура ДефолтныйСоставПровайдеровСоздан() Экспорт
+
+ // Когда
+ Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров();
+
+ // Тогда
+ Ожидаем.Что(Строитель.Провайдер("env")).Не_().Равно(Неопределено);
+ Ожидаем.Что(Строитель.Провайдер("env").Приоритет).Равно(1);
+
+ Ожидаем.Что(Строитель.ПровайдерФайлов("default")).Не_().Равно(Неопределено);
+ Ожидаем.Что(Строитель.Провайдер("default-yaml")).Не_().Равно(Неопределено);
+ Ожидаем.Что(Строитель.Провайдер("default-yaml").Приоритет).Равно(2);
+ Ожидаем.Что(Строитель.Провайдер("default-json")).Не_().Равно(Неопределено);
+ Ожидаем.Что(Строитель.Провайдер("default-ini")).Не_().Равно(Неопределено);
+
+
+КонецПроцедуры
+
+&Тест
+Процедура МенеджерПараметровДоступенИЕдинственный() Экспорт
+
+ // Дано
+ Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров();
+ ДобавитьЗначения = Новый Соответствие;
+ ДобавитьЗначения.Вставить("проверка", "OK");
+ Строитель.ДобавитьПровайдерСоответствие(ДобавитьЗначения, 10, "check-inline");
+
+ // Когда
+ Строитель.Прочитать();
+
+ // Тогда
+ Ожидаем.Что(Строитель.Параметр("проверка")).Равно("OK");
+
+КонецПроцедуры
+
+&Тест
+Процедура ДобавитьПровайдерРегистрируетПроизвольныйПровайдер() Экспорт
+
+ // Дано
+ Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров();
+
+ // Когда
+ Строитель.ДобавитьПровайдер(Новый ПровайдерПараметровСоответствие, 5, "extra");
+
+ // Тогда
+ Ожидаем.Что(Строитель.Провайдер("extra")).Не_().Равно(Неопределено);
+ Ожидаем.Что(Строитель.Провайдер("extra").Приоритет).Равно(5);
+
+КонецПроцедуры
+
+&Тест
+Процедура ДобавитьПровайдерСоответствиеРегистрируетInlineПровайдер() Экспорт
+
+ // Дано
+ Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров();
+ Значения = Новый Соответствие;
+ Значения.Вставить("ключ", "значение");
+
+ // Когда
+ Строитель.ДобавитьПровайдерСоответствие(Значения, 5, "my-inline");
+
+ // Тогда
+ Ожидаем.Что(Строитель.Провайдер("my-inline")).Не_().Равно(Неопределено);
+ Ожидаем.Что(Строитель.Провайдер("my-inline").Приоритет).Равно(5);
+ Строитель.Прочитать();
+ Ожидаем.Что(Строитель.Параметр("ключ")).Равно("значение");
+
+КонецПроцедуры
+
+&Тест
+Процедура ДобавитьПровайдерENVРегистрируетENVПровайдер() Экспорт
+
+ // Дано
+ Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров();
+
+ // Когда
+ Строитель.ДобавитьПровайдерENV("MYAPP_", 5, "my-env");
+
+ // Тогда
+ Ожидаем.Что(Строитель.Провайдер("my-env")).Не_().Равно(Неопределено);
+ Ожидаем.Что(Строитель.Провайдер("my-env").Настройки().ПолучитьПрефикс()).Равно("MYAPP_");
+
+КонецПроцедуры
+
+&Тест
+Процедура ДобавитьПровайдерФайловРегистрируетТриФизическихПровайдера() Экспорт
+
+ // Дано
+ Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров();
+
+ // Когда
+ Метапровайдер = Строитель.ДобавитьПровайдерФайлов("custom", 7);
+
+ // Тогда
+ Ожидаем.Что(Метапровайдер.Идентификатор()).Равно("custom");
+ Ожидаем.Что(Строитель.Провайдер("custom-yaml").Приоритет).Равно(7);
+ Ожидаем.Что(Строитель.Провайдер("custom-json").Приоритет).Равно(7);
+ Ожидаем.Что(Строитель.Провайдер("custom-ini").Приоритет).Равно(7);
+
+КонецПроцедуры
+
+&Тест
+Процедура ДобавитьПровайдерФайловСНестандартнымНаборомФорматов() Экспорт
+
+ // Дано
+ Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров();
+
+ // Когда
+ Метапровайдер = Строитель.ДобавитьПровайдерФайлов("only", 4, "yaml json");
+
+ // Тогда
+ Ожидаем.Что(Метапровайдер.Форматы().Количество()).Равно(2);
+ Ожидаем.Что(Строитель.Провайдер("only-yaml")).Не_().Равно(Неопределено);
+ Ожидаем.Что(Строитель.Провайдер("only-json")).Не_().Равно(Неопределено);
+ Ожидаем.Что(Строитель.Провайдер("only-ini")).Равно(Неопределено);
+
+КонецПроцедуры
+
+&Тест
+Процедура ДобавитьПровайдерФайлНастроекОпределяетФорматПоРасширению() Экспорт
+
+ // Дано
+ Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров();
+
+ // Когда
+ Строитель.ДобавитьПровайдерФайлНастроек("/path/to/settings.yaml", 1, "y");
+ Строитель.ДобавитьПровайдерФайлНастроек("/path/to/settings.json", 1, "j");
+ Строитель.ДобавитьПровайдерФайлНастроек("/path/to/settings.ini", 1, "i");
+
+ // Тогда
+ Ожидаем.Что(Строитель.Провайдер("y")).Не_().Равно(Неопределено);
+ Ожидаем.Что(Строитель.Провайдер("j")).Не_().Равно(Неопределено);
+ Ожидаем.Что(Строитель.Провайдер("i")).Не_().Равно(Неопределено);
+
+ НастройкиY = Строитель.Провайдер("y").Настройки().ПолучитьНастройки();
+ Ожидаем.Что(НастройкиY.ПутьКФайлуПараметров).Равно("/path/to/settings.yaml");
+
+КонецПроцедуры
+
+&Тест
+Процедура ДобавитьПровайдерФайлНастроекНеподдерживаемыйФорматБросаетИсключение() Экспорт
+
+ // Дано
+ Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров();
+
+ // Тогда
+ Попытка
+ Строитель.ДобавитьПровайдерФайлНастроек("/path/to/settings.txt", 1, "x");
+ Ожидаем.Что(Истина, "Ожидалось исключение").Равно(Ложь);
+ Исключение
+ Сообщение = ОписаниеОшибки();
+ Ожидаем.Что(СтрНайти(Сообщение, "Не удалось определить формат")).Не_().Равно(0);
+ КонецПопытки;
+
+КонецПроцедуры
+
+&Тест
+Процедура УдалитьПровайдерОтключаетПровайдер() Экспорт
+
+ // Дано
+ Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров();
+ Строитель.ДобавитьПровайдерСоответствие(Новый Соответствие, 5, "my-inline");
+
+ // Когда
+ Строитель.УдалитьПровайдер("my-inline");
+
+ // Тогда
+ Ожидаем.Что(Строитель.Провайдер("my-inline").Включен).Равно(Ложь);
+
+КонецПроцедуры
+
+&Тест
+Процедура УдалитьПровайдерФайловОтключаетВсеФизическиеПровайдеры() Экспорт
+
+ // Дано
+ Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров();
+
+ // Когда
+ Строитель.УдалитьПровайдер("default");
+
+ // Тогда
+ Ожидаем.Что(Строитель.Провайдер("default-yaml").Включен).Равно(Ложь);
+ Ожидаем.Что(Строитель.Провайдер("default-json").Включен).Равно(Ложь);
+ Ожидаем.Что(Строитель.Провайдер("default-ini").Включен).Равно(Ложь);
+
+КонецПроцедуры
+
+&Тест
+Процедура ОчиститьПровайдерыСбрасываетВсеПровайдеры() Экспорт
+
+ // Дано
+ Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров();
+
+ // Когда
+ Строитель.ОчиститьПровайдеры();
+
+ // Тогда
+ Ожидаем.Что(Строитель.Провайдер("env")).Равно(Неопределено);
+ Ожидаем.Что(Строитель.Провайдер("default-yaml")).Равно(Неопределено);
+
+КонецПроцедуры
+
+&Тест
+Процедура ОчиститьПровайдерыПозволяетПереиспользоватьИдентификаторыБезКоллизий() Экспорт
+
+ // Дано
+ Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров();
+ Строитель.ОчиститьПровайдеры();
+
+ // Когда
+ Строитель.ДобавитьПровайдерENV("X_", 1, "env");
+
+ // Тогда
+ Ожидаем.Что(Строитель.Провайдер("env")).Не_().Равно(Неопределено);
+ Ожидаем.Что(Строитель.Провайдер("env#2")).Равно(Неопределено);
+
+КонецПроцедуры
+
+&Тест
+Процедура УстановитьИмяФайлаПрименяетсяКоВсемФизическимПровайдерам() Экспорт
+
+ // Дано
+ Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров();
+ Метапровайдер = Строитель.ПровайдерФайлов("default");
+
+ // Когда
+ Метапровайдер.УстановитьИмяФайла("custom-config");
+
+ // Тогда
+ НастройкиYAML = Строитель.Провайдер("default-yaml").Настройки().ПолучитьНастройки();
+ НастройкиJSON = Строитель.Провайдер("default-json").Настройки().ПолучитьНастройки();
+ НастройкиINI = Строитель.Провайдер("default-ini").Настройки().ПолучитьНастройки();
+
+ Ожидаем.Что(НастройкиYAML.НаименованияФайлаПараметров.Найти("custom-config"))
+ .Не_().Равно(Неопределено);
+ Ожидаем.Что(НастройкиJSON.НаименованияФайлаПараметров.Найти("custom-config"))
+ .Не_().Равно(Неопределено);
+ Ожидаем.Что(НастройкиINI.НаименованияФайлаПараметров.Найти("custom-config"))
+ .Не_().Равно(Неопределено);
+
+КонецПроцедуры
+
+&Тест
+Процедура УстановитьПриоритетМетапровайдераМеняетПриоритетВсехФизических() Экспорт
+
+ // Дано
+ Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров();
+ Метапровайдер = Строитель.ПровайдерФайлов("default");
+
+ // Когда
+ Метапровайдер.УстановитьПриоритет(99);
+
+ // Тогда
+ Ожидаем.Что(Строитель.Провайдер("default-yaml").Приоритет).Равно(99);
+ Ожидаем.Что(Строитель.Провайдер("default-json").Приоритет).Равно(99);
+ Ожидаем.Что(Строитель.Провайдер("default-ini").Приоритет).Равно(99);
+
+КонецПроцедуры
+
+&Тест
+Процедура УстановитьФайлПараметровЗапрещёнДляМультиформатногоМетапровайдера() Экспорт
+
+ // Дано
+ Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров();
+ Метапровайдер = Строитель.ПровайдерФайлов("default"); // yaml + json + ini
+
+ // Когда / Тогда
+ Попытка
+ Метапровайдер.УстановитьФайлПараметров("/path/to/settings.yaml");
+ Ожидаем.Что(Истина, "Ожидалось исключение").Равно(Ложь);
+ Исключение
+ Сообщение = ОписаниеОшибки();
+ Ожидаем.Что(СтрНайти(Сообщение, "УстановитьФайлПараметров неприменим")).Не_().Равно(0);
+ КонецПопытки;
+
+КонецПроцедуры
+
+&Тест
+Процедура УстановитьФайлПараметровРаботаетДляОдноформатногоМетапровайдера() Экспорт
+
+ // Дано
+ Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров();
+ Метапровайдер = Строитель.ДобавитьПровайдерФайлов("only-yaml-meta", 7, "yaml");
+
+ // Когда
+ Метапровайдер.УстановитьФайлПараметров("/path/to/settings.yaml");
+
+ // Тогда
+ Настройки = Строитель.Провайдер("only-yaml-meta-yaml").Настройки().ПолучитьНастройки();
+ Ожидаем.Что(Настройки.ПутьКФайлуПараметров).Равно("/path/to/settings.yaml");
+
+КонецПроцедуры