diff --git a/docs/README.md b/docs/README.md
index cac5f06..af5f262 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -6,10 +6,12 @@
- [Класс МенеджерПараметров:](#класс-менеджерпараметров)
- [Параметр](#параметр)
- [ЧтениеВыполнено](#чтениевыполнено)
+ - [ПрочитанныеПараметры](#прочитанныепараметры)
- [Прочитать](#прочитать)
- [УстановитьФайлПараметров](#установитьфайлпараметров)
- [ДобавитьПровайдерПараметров](#добавитьпровайдерпараметров)
- [ОтключитьПровайдер](#отключитьпровайдер)
+ - [ПровайдерПоИдентификатору](#провайдерпоидентификатору)
- [НастройкаПоискаФайла](#настройкапоискафайла)
- [ИспользоватьПровайдерJSON](#использоватьпровайдерjson)
- [ИспользоватьПровайдерYAML](#использоватьпровайдерyaml)
@@ -79,6 +81,16 @@
//
```
+
+#### ПрочитанныеПараметры
+```bsl
+// Возвращает соответствие прочитанных параметров (сырой результат без обработки конструктором)
+//
+// Возвращаемое значение:
+// Соответствие - прочитанные параметры
+//
+```
+
#### Прочитать
```bsl
@@ -102,9 +114,21 @@
// Добавляет в таблицу провайдеров произвольный класс-провайдер
//
// Параметры:
-// КлассОбъект - Объект - класс провайдера или имя класса
-// Приоритет - Число - Числовой приоритет выполнения провайдеры (по умолчанию 99)
+// КлассОбъект - Объект - класс провайдера
+// Приоритет - Число - числовой приоритет выполнения провайдера;
+// меньшее значение читается первым (по умолчанию берётся из провайдера)
+// ИдентификаторПровайдера - Строка - явный идентификатор; если не задан — берётся из Идентификатор() провайдера;
+// при коллизии автоматически добавляется суффикс #2, #3 и т.д.
//
+// Возвращаемое значение:
+// Объект - переданный КлассОбъект (для цепочки настроек через .Настройки())
+//
+```
+
+Пример использования с цепочкой настроек:
+```bsl
+МП.ДобавитьПровайдерПараметров(Новый ПровайдерПараметровENV, 2).Настройки()
+ .УстановитьПрефикс("APP_");
```
@@ -117,6 +141,24 @@
//
```
+
+#### ПровайдерПоИдентификатору
+```bsl
+// Возвращает класс провайдера по идентификатору для прямой настройки
+//
+// Параметры:
+// ИдентификаторПровайдера - Строка - идентификатор провайдера (например, "json", "yaml#2")
+//
+// Возвращаемое значение:
+// Произвольный - класс провайдера или Неопределено если не найден
+//
+```
+
+Пример:
+```bsl
+МП.ПровайдерПоИдентификатору("env").Настройки().УстановитьПрефикс("APP_");
+```
+
#### НастройкаПоискаФайла
```bsl
diff --git a/packagedef b/packagedef
index ac53ca7..8613d52 100644
--- a/packagedef
+++ b/packagedef
@@ -4,7 +4,7 @@
//
Описание.Имя("configor")
- .Версия("0.11.1")
+ .Версия("0.12.0")
.Автор("Khorev Aleksey")
.АдресАвтора("Khorevaa@gmail.com")
.Описание("Библиотека для работы с конфигурационными файлами в формате json, yaml")
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\260ENV.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\260ENV.os"
new file mode 100644
index 0000000..c6d540c
--- /dev/null
+++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\260ENV.os"
@@ -0,0 +1,32 @@
+
+Перем Префикс; // Строка - префикс фильтрации переменных среды
+
+#Область Публичное_API
+
+// Устанавливает префикс фильтрации переменных среды
+//
+// Параметры:
+// ПрефиксФильтра - Строка - префикс
+//
+// Возвращаемое значение:
+// НастройкиПровайдераENV - ссылка на текущий объект
+//
+Функция УстановитьПрефикс(Знач ПрефиксФильтра) Экспорт
+ Префикс = ПрефиксФильтра;
+ Возврат ЭтотОбъект;
+КонецФункции
+
+// Возвращает установленный префикс
+//
+// Возвращаемое значение:
+// Строка - текущий префикс
+//
+Функция ПолучитьПрефикс() Экспорт
+ Возврат Префикс;
+КонецФункции
+
+#КонецОбласти
+
+Процедура ПриСозданииОбъекта(НачальныйПрефикс = "")
+ Префикс = НачальныйПрефикс;
+КонецПроцедуры
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\260\320\241\320\276\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\320\270\320\265.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\260\320\241\320\276\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\320\270\320\265.os"
new file mode 100644
index 0000000..880c2d7
--- /dev/null
+++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\260\320\241\320\276\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\320\270\320\265.os"
@@ -0,0 +1,45 @@
+
+Перем мПараметры; // Соответствие
+
+#Область Публичное_API
+
+// Устанавливает источник параметров
+//
+// Параметры:
+// ИсточникПараметров - Соответствие - источник параметров
+//
+// Возвращаемое значение:
+// НастройкиПровайдераСоответствие - ссылка на текущий объект
+//
+Функция УстановитьПараметры(Знач ИсточникПараметров) Экспорт
+
+ Если ТипЗнч(ИсточникПараметров) <> Тип("Соответствие") Тогда
+ ВызватьИсключение
+ "Для провайдера параметров Соответствие, источником параметров может быть только соответствие";
+ КонецЕсли;
+
+ мПараметры = ИсточникПараметров;
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+// Возвращает установленный источник параметров
+//
+// Возвращаемое значение:
+// Соответствие - текущий источник параметров
+//
+Функция ПолучитьПараметры() Экспорт
+ Возврат мПараметры;
+КонецФункции
+
+#КонецОбласти
+
+Процедура ПриСозданииОбъекта(НачальныеПараметры = Неопределено)
+
+ Если НачальныеПараметры <> Неопределено Тогда
+ УстановитьПараметры(НачальныеПараметры);
+ Иначе
+ мПараметры = Новый Соответствие;
+ КонецЕсли;
+
+КонецПроцедуры
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os"
index 35b8b40..169c7e0 100644
--- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os"
+++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os"
@@ -12,12 +12,12 @@
// Выполняет чтение параметров для провайдера
//
// Параметры:
-// НастройкиПровайдера - Структура - структура настроек провайдера
+// НастройкиПровайдера - Структура - (устарело) передаётся провайдеру как fallback
//
// Возвращаемое значение:
// Соответствие - результат чтения провайдера
//
-Функция ПрочитатьПараметры(Знач НастройкиПровайдера) Экспорт
+Функция ПрочитатьПараметры(Знач НастройкиПровайдера = Неопределено) Экспорт
Если Не Включен Тогда
Возврат Новый Соответствие;
@@ -52,6 +52,24 @@
Приоритет = НовыйПриоритет;
КонецПроцедуры
+// Устанавливает идентификатор провайдера
+//
+// Параметры:
+// НовыйИдентификатор - Строка - новый идентификатор провайдера
+//
+Процедура УстановитьИдентификатор(Знач НовыйИдентификатор) Экспорт
+ Идентификатор = НовыйИдентификатор;
+КонецПроцедуры
+
+// Возвращает объект настроек провайдера
+//
+// Возвращаемое значение:
+// Произвольный - объект настроек или Неопределено если провайдер не поддерживает метод Настройки()
+//
+Функция Настройки() Экспорт
+ Возврат КлассПровайдера.Настройки();
+КонецФункции
+
// Выполняет запись данных провайдера
//
// Параметры:
@@ -111,17 +129,11 @@
ИЛИ РеализованИнтерфейсЗаписи);
Если НЕ ПроверкаПровайдера Тогда
- // TODO: Добавить описание того что реализовано а что нет
ВызватьИсключение "Не реализован необходимый интерфейс провайдера";
КонецЕсли;
ТипПровайдера = ВходящийКлассПровайдера.ТипПровайдера();
-
- Если ЭтоФайловыйПровайдер() Тогда
- КлассПровайдера = Новый ФайловыйПровайдерПараметров(ВходящийКлассПровайдера);
- Иначе
- КлассПровайдера = ВходящийКлассПровайдера;
- КонецЕсли;
+ КлассПровайдера = ВходящийКлассПровайдера;
Приоритет = КлассПровайдера.Приоритет();
Идентификатор = КлассПровайдера.Идентификатор();
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262ENV.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262ENV.os"
index 89be6e5..35339b7 100644
--- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262ENV.os"
+++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262ENV.os"
@@ -1,10 +1,15 @@
#Использовать logos
Перем Лог;
-Перем Префикс;
+
+Перем _Приоритет; // Число
+Перем _Идентификатор; // Строка
+Перем _Настройки; // НастройкиПровайдераENV
Процедура ПриСозданииОбъекта(ПрефиксПеременныхСреды = "")
- Префикс = ПрефиксПеременныхСреды;
+ _Приоритет = 2;
+ _Идентификатор = "env";
+ _Настройки = Новый НастройкиПровайдераENV(ПрефиксПеременныхСреды);
Лог = Логирование.ПолучитьЛог("oscript.lib.configor.env");
КонецПроцедуры
@@ -16,7 +21,20 @@
// Число - текущий приоритет провайдера
//
Функция Приоритет() Экспорт
- Возврат 2;
+ Возврат _Приоритет;
+КонецФункции
+
+// Устанавливает приоритет провайдера
+//
+// Параметры:
+// НовыйПриоритет - Число - приоритет
+//
+// Возвращаемое значение:
+// Объект.ПровайдерПараметровENV - ссылка на текущий объект
+//
+Функция УстановитьПриоритет(Знач НовыйПриоритет) Экспорт
+ _Приоритет = НовыйПриоритет;
+ Возврат ЭтотОбъект;
КонецФункции
// Возвращает идентификатор провайдера
@@ -25,7 +43,20 @@
// Строка - текущий идентификатор провайдера
//
Функция Идентификатор() Экспорт
- Возврат "env";
+ Возврат _Идентификатор;
+КонецФункции
+
+// Устанавливает идентификатор провайдера
+//
+// Параметры:
+// НовыйИдентификатор - Строка - идентификатор
+//
+// Возвращаемое значение:
+// Объект.ПровайдерПараметровENV - ссылка на текущий объект
+//
+Функция УстановитьИдентификатор(Знач НовыйИдентификатор) Экспорт
+ _Идентификатор = НовыйИдентификатор;
+ Возврат ЭтотОбъект;
КонецФункции
// Возвращает тип провайдера
@@ -37,17 +68,29 @@
Возврат "env";
КонецФункции
+// Возвращает объект настроек провайдера
+//
+// Возвращаемое значение:
+// НастройкиПровайдераENV - настройки
+//
+Функция Настройки() Экспорт
+ Возврат _Настройки;
+КонецФункции
+
// Выполняет чтение параметров для провайдера
//
// Параметры:
-// НастройкиПровайдера - Структура - структура настроек провайдера
+// НастройкиПровайдера - Структура - (устарело) игнорируется; для указания префикса
+// использовать метод Настройки().УстановитьПрефикс(...)
//
// Возвращаемое значение:
// Соответствие - результат чтения провайдера
//
-Функция ПрочитатьПараметры(НастройкиПровайдера) Экспорт
+Функция ПрочитатьПараметры(НастройкиПровайдера = Неопределено) Экспорт
+
+ ЭффективныйПрефикс = _Настройки.ПолучитьПрефикс();
- Лог.Отладка("Выполняю чтение параметров переменных среды для префикса <%1>", Префикс);
+ Лог.Отладка("Выполняю чтение параметров переменных среды для префикса <%1>", ЭффективныйПрефикс);
ПеременныеСреды = ПеременныеСреды();
ПрочитанныеПараметры = Новый Соответствие;
@@ -63,16 +106,16 @@
Результат = Новый Соответствие;
- Если ПустаяСтрока(Префикс) Тогда
+ Если ПустаяСтрока(ЭффективныйПрефикс) Тогда
Результат = ПрочитанныеПараметры;
Иначе
Для каждого ПеременнаяСреды Из ПрочитанныеПараметры Цикл
- Если СтрНачинаетсяС(НРег(ПеременнаяСреды.Ключ), НРег(Префикс)) Тогда
+ Если СтрНачинаетсяС(НРег(ПеременнаяСреды.Ключ), НРег(ЭффективныйПрефикс)) Тогда
Результат.Вставить(
- Прав(ПеременнаяСреды.Ключ, СтрДлина(ПеременнаяСреды.Ключ) - (СтрДлина(Префикс) + 1)),
+ Прав(ПеременнаяСреды.Ключ, СтрДлина(ПеременнаяСреды.Ключ) - (СтрДлина(ЭффективныйПрефикс) + 1)),
ПеременнаяСреды.Значение
);
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262INI.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262INI.os"
index 3e14e84..fd00415 100644
--- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262INI.os"
+++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262INI.os"
@@ -2,6 +2,10 @@
Перем Лог;
+Перем _Приоритет; // Число
+Перем _Идентификатор; // Строка
+Перем _Настройки; // НастройкиФайловогоПровайдера
+
#Область ПрограммныйИнтерфейс
// Возвращает приоритет провайдера
@@ -10,7 +14,20 @@
// Число - текущий приоритет провайдера
//
Функция Приоритет() Экспорт
- Возврат 1;
+ Возврат _Приоритет;
+КонецФункции
+
+// Устанавливает приоритет провайдера
+//
+// Параметры:
+// НовыйПриоритет - Число - приоритет
+//
+// Возвращаемое значение:
+// Объект.ПровайдерПараметровINI - ссылка на текущий объект
+//
+Функция УстановитьПриоритет(Знач НовыйПриоритет) Экспорт
+ _Приоритет = НовыйПриоритет;
+ Возврат ЭтотОбъект;
КонецФункции
// Возвращает идентификатор провайдера
@@ -19,7 +36,20 @@
// Строка - текущий идентификатор провайдера
//
Функция Идентификатор() Экспорт
- Возврат "ini";
+ Возврат _Идентификатор;
+КонецФункции
+
+// Устанавливает идентификатор провайдера
+//
+// Параметры:
+// НовыйИдентификатор - Строка - идентификатор
+//
+// Возвращаемое значение:
+// Объект.ПровайдерПараметровINI - ссылка на текущий объект
+//
+Функция УстановитьИдентификатор(Знач НовыйИдентификатор) Экспорт
+ _Идентификатор = НовыйИдентификатор;
+ Возврат ЭтотОбъект;
КонецФункции
// Возвращает тип провайдера
@@ -40,29 +70,35 @@
Возврат "ini";
КонецФункции
+// Возвращает объект настроек провайдера
+//
+// Возвращаемое значение:
+// НастройкиФайловогоПровайдера - настройки
+//
+Функция Настройки() Экспорт
+ Возврат _Настройки;
+КонецФункции
+
// Выполняет чтение параметров для провайдера
//
// Параметры:
-// НастройкиПровайдера - Структура - структура настроек провайдера
+// НастройкиПровайдера - Структура - (устарело) внешние настройки
//
// Возвращаемое значение:
// Соответствие - результат чтения провайдера
//
-Функция ПрочитатьПараметры(НастройкиПровайдера) Экспорт
-
- ПрочитанныеПараметры = Новый Соответствие;
-
- ФайлПараметров = Новый Файл(НастройкиПровайдера.ФайлПараметров);
-
- Если Не ФайлПараметров.Существует() Тогда
- Лог.Отладка("Не найден файл параметров <%1>", ФайлПараметров.ПолноеИмя);
- Возврат ПрочитанныеПараметры;
+Функция ПрочитатьПараметры(НастройкиПровайдера = Неопределено) Экспорт
+
+ // Вызов напрямую — делегируем в ФайловыйПровайдерПараметров
+ ЭффективныеНастройки = _Настройки.ПолучитьНастройки();
+ Если НастройкиПровайдера <> Неопределено
+ И НЕ ЗначениеЗаполнено(ЭффективныеНастройки.ПутьКФайлуПараметров)
+ И ЭффективныеНастройки.КаталогиПоиска.Количество() = 0 Тогда
+ ЭффективныеНастройки = НастройкиПровайдера;
КонецЕсли;
- Лог.Отладка("Выполняю чтение файла параметров <%1>", ФайлПараметров.ПолноеИмя);
- ПрочитанныеПараметры = Прочитать(ФайлПараметров.ПолноеИмя);
-
- Возврат ПрочитанныеПараметры;
+ ФайловыйПровайдер = Новый ФайловыйПровайдерПараметров(ЭтотОбъект);
+ Возврат ФайловыйПровайдер.ПрочитатьПараметры(ЭффективныеНастройки);
КонецФункции
@@ -75,7 +111,7 @@
// Возвращаемое значение:
// Соответствие - итоговые параметры
//
-Функция Прочитать(Знач ПутьКФайлу)
+Функция Прочитать(Знач ПутьКфайлу) Экспорт
НастройкиИзФайла = Новый Соответствие;
@@ -109,3 +145,7 @@
КонецФункции // Прочитать
Лог = Логирование.ПолучитьЛог("oscript.lib.configor.ini");
+
+_Приоритет = 1;
+_Идентификатор = "ini";
+_Настройки = Новый НастройкиФайловогоПровайдера;
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262JSON.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262JSON.os"
index 60287a3..4c1fdd4 100644
--- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262JSON.os"
+++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262JSON.os"
@@ -4,6 +4,10 @@
Перем Лог;
Перем ПрефиксКлючаДляЧтенияВложенногоФайлаНастроек;
+Перем _Приоритет; // Число
+Перем _Идентификатор; // Строка
+Перем _Настройки; // НастройкиФайловогоПровайдера
+
#Область ПрограммныйИнтерфейс
// Возвращает приоритет провайдера
@@ -12,7 +16,20 @@
// Число - текущий приоритет провайдера
//
Функция Приоритет() Экспорт
- Возврат 1;
+ Возврат _Приоритет;
+КонецФункции
+
+// Устанавливает приоритет провайдера
+//
+// Параметры:
+// НовыйПриоритет - Число - приоритет
+//
+// Возвращаемое значение:
+// Объект.ПровайдерПараметровJSON - ссылка на текущий объект
+//
+Функция УстановитьПриоритет(Знач НовыйПриоритет) Экспорт
+ _Приоритет = НовыйПриоритет;
+ Возврат ЭтотОбъект;
КонецФункции
// Возвращает идентификатор провайдера
@@ -21,7 +38,20 @@
// Строка - текущий идентификатор провайдера
//
Функция Идентификатор() Экспорт
- Возврат "json";
+ Возврат _Идентификатор;
+КонецФункции
+
+// Устанавливает идентификатор провайдера
+//
+// Параметры:
+// НовыйИдентификатор - Строка - идентификатор
+//
+// Возвращаемое значение:
+// Объект.ПровайдерПараметровJSON - ссылка на текущий объект
+//
+Функция УстановитьИдентификатор(Знач НовыйИдентификатор) Экспорт
+ _Идентификатор = НовыйИдентификатор;
+ Возврат ЭтотОбъект;
КонецФункции
// Возвращает тип провайдера
@@ -36,35 +66,43 @@
// Возвращает расширения файлов по умолчанию
//
// Возвращаемое значение:
-// Строка - расширения файлов по умолчанию (yaml yml)
+// Строка - расширения файлов по умолчанию
//
Функция РасширенияФайлов() Экспорт
Возврат "json";
КонецФункции
+// Возвращает объект настроек провайдера
+//
+// Возвращаемое значение:
+// НастройкиФайловогоПровайдера - настройки
+//
+Функция Настройки() Экспорт
+ Возврат _Настройки;
+КонецФункции
+
// Выполняет чтение параметров для провайдера
//
// Параметры:
-// НастройкиПровайдера - Структура - структура настроек провайдера
+// НастройкиПровайдера - Структура - (устарело) внешние настройки; если заданы
+// собственные настройки провайдера, используются они
//
// Возвращаемое значение:
// Соответствие - результат чтения провайдера
//
-Функция ПрочитатьПараметры(НастройкиПровайдера) Экспорт
-
- ПрочитанныеПараметры = Новый Соответствие;
-
- ФайлПараметров = Новый Файл(НастройкиПровайдера.ФайлПараметров);
-
- Если Не ФайлПараметров.Существует() Тогда
- Лог.Отладка("Не найден файл параметров <%1>", ФайлПараметров.ПолноеИмя);
- Возврат ПрочитанныеПараметры;
+Функция ПрочитатьПараметры(НастройкиПровайдера = Неопределено) Экспорт
+
+ // Вызов напрямую — делегируем в ФайловыйПровайдерПараметров
+ ЭффективныеНастройки = _Настройки.ПолучитьНастройки();
+ Если НастройкиПровайдера <> Неопределено
+ И НЕ ЗначениеЗаполнено(ЭффективныеНастройки.ПутьКФайлуПараметров)
+ И ЭффективныеНастройки.КаталогиПоиска.Количество() = 0 Тогда
+ // Fallback: настройки переданы снаружи (обратная совместимость)
+ ЭффективныеНастройки = НастройкиПровайдера;
КонецЕсли;
- Лог.Отладка("Выполняю чтение файла параметров <%1>", ФайлПараметров.ПолноеИмя);
- ПрочитанныеПараметры = Прочитать(ФайлПараметров.ПолноеИмя);
-
- Возврат ПрочитанныеПараметры;
+ ФайловыйПровайдер = Новый ФайловыйПровайдерПараметров(ЭтотОбъект);
+ Возврат ФайловыйПровайдер.ПрочитатьПараметры(ЭффективныеНастройки);
КонецФункции
@@ -77,7 +115,7 @@
// Возвращаемое значение:
// Соответствие - итоговые параметры
//
-Функция Прочитать(Знач ПутьКФайлуНастройки)
+Функция Прочитать(Знач ПутьКФайлуНастройки) Экспорт
НастройкиИзФайла = Новый Соответствие;
@@ -152,3 +190,7 @@
КонецПроцедуры
Лог = Логирование.ПолучитьЛог("oscript.lib.configor.json");
+
+_Приоритет = 1;
+_Идентификатор = "json";
+_Настройки = Новый НастройкиФайловогоПровайдера;
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262VAULT.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262VAULT.os"
index e30fb8f..98862be 100644
--- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262VAULT.os"
+++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262VAULT.os"
@@ -4,6 +4,10 @@
Перем Лог;
+Перем _Приоритет; // Число
+Перем _Идентификатор; // Строка
+Перем _Настройки; // НастройкиПровайдераVault
+
#Область ПрограммныйИнтерфейс
// Возвращает приоритет провайдера
@@ -12,7 +16,20 @@
// Число - текущий приоритет провайдера
//
Функция Приоритет() Экспорт
- Возврат 1;
+ Возврат _Приоритет;
+КонецФункции
+
+// Устанавливает приоритет провайдера
+//
+// Параметры:
+// НовыйПриоритет - Число - приоритет
+//
+// Возвращаемое значение:
+// Объект.ПровайдерПараметровVAULT - ссылка на текущий объект
+//
+Функция УстановитьПриоритет(Знач НовыйПриоритет) Экспорт
+ _Приоритет = НовыйПриоритет;
+ Возврат ЭтотОбъект;
КонецФункции
// Возвращает идентификатор провайдера
@@ -21,7 +38,20 @@
// Строка - текущий идентификатор провайдера
//
Функция Идентификатор() Экспорт
- Возврат "vault";
+ Возврат _Идентификатор;
+КонецФункции
+
+// Устанавливает идентификатор провайдера
+//
+// Параметры:
+// НовыйИдентификатор - Строка - идентификатор
+//
+// Возвращаемое значение:
+// Объект.ПровайдерПараметровVAULT - ссылка на текущий объект
+//
+Функция УстановитьИдентификатор(Знач НовыйИдентификатор) Экспорт
+ _Идентификатор = НовыйИдентификатор;
+ Возврат ЭтотОбъект;
КонецФункции
// Возвращает тип провайдера
@@ -33,21 +63,38 @@
Возврат "vault";
КонецФункции
+// Возвращает объект настроек провайдера
+//
+// Возвращаемое значение:
+// НастройкиПровайдераVault - настройки
+//
+Функция Настройки() Экспорт
+ Возврат _Настройки;
+КонецФункции
+
// Выполняет чтение параметров для провайдера
//
// Параметры:
-// НастройкиПровайдера - Структура - структура настроек провайдера
+// НастройкиПровайдера - Структура - (устарело) внешние настройки; если заданы
+// собственные настройки провайдера, используются они
//
// Возвращаемое значение:
// Соответствие - результат чтения провайдера
//
-Функция ПрочитатьПараметры(Знач НастройкиПровайдера) Экспорт
+Функция ПрочитатьПараметры(Знач НастройкиПровайдера = Неопределено) Экспорт
ПрочитанныеПараметры = Новый Соответствие;
- Адрес = НастройкиПровайдера.Адрес;
- Токен = НастройкиПровайдера.Токен;
- Запрос = НастройкиПровайдера.Запрос;
+ // Приоритет у собственных настроек
+ Н = _Настройки.ПолучитьНастройки();
+ Если НастройкиПровайдера <> Неопределено
+ И НЕ ЗначениеЗаполнено(Н.Адрес) Тогда
+ Н = НастройкиПровайдера;
+ КонецЕсли;
+
+ Адрес = Н.Адрес;
+ Токен = Н.Токен;
+ Запрос = Н.Запрос;
Если Не ЗначениеЗаполнено(Адрес) Тогда
Лог.Отладка("Не указан адрес сервера. Чтение невозможно");
@@ -139,3 +186,7 @@
КонецФункции
Лог = Логирование.ПолучитьЛог("oscript.lib.configor.vault");
+
+_Приоритет = 1;
+_Идентификатор = "vault";
+_Настройки = Новый НастройкиПровайдераVault;
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262YAML.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262YAML.os"
index 79ba9aa..a91a03e 100644
--- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262YAML.os"
+++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262YAML.os"
@@ -3,6 +3,10 @@
Перем Лог;
+Перем _Приоритет; // Число
+Перем _Идентификатор; // Строка
+Перем _Настройки; // НастройкиФайловогоПровайдера
+
#Область ПрограммныйИнтерфейс
// Возвращает приоритет провайдера
@@ -11,7 +15,20 @@
// Число - текущий приоритет провайдера
//
Функция Приоритет() Экспорт
- Возврат 1;
+ Возврат _Приоритет;
+КонецФункции
+
+// Устанавливает приоритет провайдера
+//
+// Параметры:
+// НовыйПриоритет - Число - приоритет
+//
+// Возвращаемое значение:
+// Объект.ПровайдерПараметровYAML - ссылка на текущий объект
+//
+Функция УстановитьПриоритет(Знач НовыйПриоритет) Экспорт
+ _Приоритет = НовыйПриоритет;
+ Возврат ЭтотОбъект;
КонецФункции
// Возвращает идентификатор провайдера
@@ -20,7 +37,20 @@
// Строка - текущий идентификатор провайдера
//
Функция Идентификатор() Экспорт
- Возврат "yaml";
+ Возврат _Идентификатор;
+КонецФункции
+
+// Устанавливает идентификатор провайдера
+//
+// Параметры:
+// НовыйИдентификатор - Строка - идентификатор
+//
+// Возвращаемое значение:
+// Объект.ПровайдерПараметровYAML - ссылка на текущий объект
+//
+Функция УстановитьИдентификатор(Знач НовыйИдентификатор) Экспорт
+ _Идентификатор = НовыйИдентификатор;
+ Возврат ЭтотОбъект;
КонецФункции
// Возвращает тип провайдера
@@ -41,52 +71,61 @@
Возврат "yaml yml";
КонецФункции
+// Возвращает объект настроек провайдера
+//
+// Возвращаемое значение:
+// НастройкиФайловогоПровайдера - настройки
+//
+Функция Настройки() Экспорт
+ Возврат _Настройки;
+КонецФункции
+
// Выполняет чтение параметров для провайдера
//
// Параметры:
-// НастройкиПровайдера - Структура - структура настроек провайдера
+// НастройкиПровайдера - Структура - (устарело) внешние настройки; если заданы
+// собственные настройки провайдера, используются они
//
// Возвращаемое значение:
// Соответствие - результат чтения провайдера
//
-Функция ПрочитатьПараметры(Знач НастройкиПровайдера) Экспорт
+Функция ПрочитатьПараметры(НастройкиПровайдера = Неопределено) Экспорт
+
+ // Вызов напрямую — делегируем в ФайловыйПровайдерПараметров
+ ЭффективныеНастройки = _Настройки.ПолучитьНастройки();
+ Если НастройкиПровайдера <> Неопределено
+ И НЕ ЗначениеЗаполнено(ЭффективныеНастройки.ПутьКФайлуПараметров)
+ И ЭффективныеНастройки.КаталогиПоиска.Количество() = 0 Тогда
+ ЭффективныеНастройки = НастройкиПровайдера;
+ КонецЕсли;
- ПрочитанныеПараметры = Новый Соответствие;
+ ФайловыйПровайдер = Новый ФайловыйПровайдерПараметров(ЭтотОбъект);
+ Возврат ФайловыйПровайдер.ПрочитатьПараметры(ЭффективныеНастройки);
- ФайлПараметров = Новый Файл(НастройкиПровайдера.ФайлПараметров);
+КонецФункции
- ПутьКФайлуПараметров = ФайлПараметров.ПолноеИмя;
+#КонецОбласти
- Если Не ФайлПараметров.Существует() Тогда
- Лог.Отладка("Не найден файл параметров <%1>", ПутьКФайлуПараметров);
- Возврат ПрочитанныеПараметры;
- КонецЕсли;
-
- Попытка
+#Область Вспомогательные_процедуры_и_функции
+
+Функция Прочитать(Знач ПутьКФайлуНастройки) Экспорт
- Лог.Отладка("ПутьКФайлуПараметров <%1>", ПутьКФайлуПараметров);
+ ПрочитанныеПараметры = Новый Соответствие;
- ПрочитанныеПараметры = ПрочитатьНастройкиИзПараметраФайл(ПутьКФайлуПараметров);
-
+ Попытка
+ Лог.Отладка("ПутьКФайлуПараметров <%1>", ПутьКФайлуНастройки);
+ ПрочитанныеПараметры = ПрочитатьНастройкиИзПараметраФайл(ПутьКФайлуНастройки);
Лог.Отладка("Итоговые параметры:");
ПоказатьПараметрыВРежимеОтладки(ПрочитанныеПараметры);
-
Исключение
-
Лог.Ошибка("Ошибка чтения настроек
|%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
-
ВызватьИсключение;
-
КонецПопытки;
Возврат ПрочитанныеПараметры;
-КонецФункции
-
-#КонецОбласти
-
-#Область Вспомогательные_процедуры_и_функции
+КонецФункции // Прочитать()
Функция ПрочитатьНастройкиИзПараметраФайл(ПутьКФайлуНастройки)
@@ -136,4 +175,8 @@
#КонецОбласти
-Лог = Логирование.ПолучитьЛог("oscript.lib.configor.yaml");
\ No newline at end of file
+Лог = Логирование.ПолучитьЛог("oscript.lib.configor.yaml");
+
+_Приоритет = 1;
+_Идентификатор = "yaml";
+_Настройки = Новый НастройкиФайловогоПровайдера;
\ No newline at end of file
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262\320\241\320\276\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\320\270\320\265.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262\320\241\320\276\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\320\270\320\265.os"
index 6952324..e04b711 100644
--- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262\320\241\320\276\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\320\270\320\265.os"
+++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262\320\241\320\276\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\320\270\320\265.os"
@@ -1,18 +1,29 @@
#Использовать logos
Перем Лог;
-Перем мПараметры;
-Процедура ПриСозданииОбъекта(Параметры)
+Перем _Приоритет; // Число
+Перем _Идентификатор; // Строка
+Перем _Настройки; // НастройкиПровайдераСоответствие
- Если ТипЗнч(Параметры) <> Тип("Соответствие") Тогда
- ВызватьИсключение
- "Для провайдера параметров Соответствие, источником параметров может быть только соответствие";
- КонецЕсли;
+Процедура ПриСозданииОбъекта(Параметры = Неопределено)
- мПараметры = Параметры;
+ _Приоритет = 3;
+ _Идентификатор = "map";
Лог = Логирование.ПолучитьЛог("oscript.lib.configor.map");
+ Если Параметры = Неопределено Тогда
+ _Настройки = Новый НастройкиПровайдераСоответствие;
+ Иначе
+
+ Если ТипЗнч(Параметры) <> Тип("Соответствие") Тогда
+ ВызватьИсключение
+ "Для провайдера параметров Соответствие, источником параметров может быть только соответствие";
+ КонецЕсли;
+
+ _Настройки = Новый НастройкиПровайдераСоответствие(Параметры);
+ КонецЕсли;
+
КонецПроцедуры
#Область ПрограммныйИнтерфейс
@@ -23,7 +34,20 @@
// Число - текущий приоритет провайдера
//
Функция Приоритет() Экспорт
- Возврат 3;
+ Возврат _Приоритет;
+КонецФункции
+
+// Устанавливает приоритет провайдера
+//
+// Параметры:
+// НовыйПриоритет - Число - приоритет
+//
+// Возвращаемое значение:
+// Объект.ПровайдерПараметровСоответствие - ссылка на текущий объект
+//
+Функция УстановитьПриоритет(Знач НовыйПриоритет) Экспорт
+ _Приоритет = НовыйПриоритет;
+ Возврат ЭтотОбъект;
КонецФункции
// Возвращает идентификатор провайдера
@@ -32,7 +56,20 @@
// Строка - текущий идентификатор провайдера
//
Функция Идентификатор() Экспорт
- Возврат "map";
+ Возврат _Идентификатор;
+КонецФункции
+
+// Устанавливает идентификатор провайдера
+//
+// Параметры:
+// НовыйИдентификатор - Строка - идентификатор
+//
+// Возвращаемое значение:
+// Объект.ПровайдерПараметровСоответствие - ссылка на текущий объект
+//
+Функция УстановитьИдентификатор(Знач НовыйИдентификатор) Экспорт
+ _Идентификатор = НовыйИдентификатор;
+ Возврат ЭтотОбъект;
КонецФункции
// Возвращает тип провайдера
@@ -44,20 +81,39 @@
Возврат "memory";
КонецФункции
+// Устанавливает источник параметров
+//
+// Параметры:
+// ИсточникПараметров - Соответствие - источник параметров
+//
+// Возвращаемое значение:
+// Объект.ПровайдерПараметровСоответствие - ссылка на текущий объект
+//
+Функция УстановитьПараметры(Знач ИсточникПараметров) Экспорт
+
+ _Настройки.УстановитьПараметры(ИсточникПараметров);
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
// Выполняет чтение параметров для провайдера
//
// Параметры:
-// НастройкиПровайдера - Структура - структура настроек провайдера
+// НастройкиПровайдера - Структура - игнорируется
//
// Возвращаемое значение:
// Соответствие - результат чтения провайдера
//
-Функция ПрочитатьПараметры(НастройкиПровайдера) Экспорт
+Функция ПрочитатьПараметры(НастройкиПровайдера = Неопределено) Экспорт
Лог.Отладка("Считываю параметры из соответствия");
- Возврат мПараметры;
+ Возврат _Настройки.ПолучитьПараметры();
+
+КонецФункции
+Функция Настройки() Экспорт
+ Возврат _Настройки;
КонецФункции
#КонецОбласти
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/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\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/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\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os"
index 7d0e690..7a68ec1 100644
--- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/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\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os"
+++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/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\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os"
@@ -242,13 +242,16 @@
КонецПроцедуры
Функция ВыполнитьЧтениеПровайдера(Знач ИмяФайлаПараметров)
-
- НастройкаПровайдераДляТекущегоЧтения = СкопироватьСтруктуру(НастройкиПровайдера);
- НастройкаПровайдераДляТекущегоЧтения.Вставить("ФайлПараметров", ИмяФайлаПараметров);
- РезультатЧтенияФайла = КлассПровайдера.ПрочитатьПараметры(НастройкаПровайдераДляТекущегоЧтения);
+ ФайлПараметров = Новый Файл(ИмяФайлаПараметров);
+
+ Если Не ФайлПараметров.Существует() Тогда
+ Лог.Отладка("Не найден файл параметров <%1>", ФайлПараметров.ПолноеИмя);
+ Возврат Новый Соответствие;
+ КонецЕсли;
- Возврат РезультатЧтенияФайла;
+ Лог.Отладка("Выполняю чтение файла параметров <%1>", ФайлПараметров.ПолноеИмя);
+ Возврат КлассПровайдера.Прочитать(ИмяФайлаПараметров);
КонецФункции
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os"
index 7ee8028..07f50a6 100644
--- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os"
+++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os"
@@ -14,8 +14,8 @@
Перем ПровайдерыПараметров; // Соответствие
-Перем НастройкаФайловогоПровайдера; // Класс НастройкиФайловогоПровайдера
-Перем НастройкаПровайдераVault; // Класс НастройкиПровайдераVault
+Перем НастройкаФайловогоПровайдера; // Класс НастройкиФайловогоПровайдера - для обратной совместимости
+Перем НастройкаПровайдераVault; // Класс НастройкиПровайдераVault - для обратной совместимости
Перем ИнтерфейсПриемника; // Класс ИнтерфейсОбъекта
@@ -130,11 +130,17 @@
// Добавляет в таблицу провайдеров произвольный класс-провайдер
//
// Параметры:
-// КлассОбъект - Объект - класс провайдера или имя класса
-// Приоритет - Число - Числовой приоритет выполнения провайдеры (по умолчанию 99)
+// КлассОбъект - Объект - класс провайдера
+// Приоритет - Число - числовой приоритет выполнения провайдера
+// ИдентификаторПровайдера - Строка - явный идентификатор; если не задан — берётся из Идентификатор() провайдера
+// при коллизии добавляется суффикс #2, #3 и т.д.
//
-Процедура ДобавитьПровайдерПараметров(Знач КлассОбъект,
- Знач Приоритет = Неопределено) Экспорт
+// Возвращаемое значение:
+// Объект - переданный КлассОбъект (для chaining настроек через Настройки())
+//
+Функция ДобавитьПровайдерПараметров(Знач КлассОбъект,
+ Знач Приоритет = Неопределено,
+ Знач ИдентификаторПровайдера = Неопределено) Экспорт
ДобавляемыйПровайдерПараметров = Новый ПровайдерПараметров(КлассОбъект);
@@ -142,9 +148,18 @@
ДобавляемыйПровайдерПараметров.УстановитьПриоритет(Приоритет);
КонецЕсли;
- ПровайдерыПараметров.Вставить(ДобавляемыйПровайдерПараметров.Идентификатор, ДобавляемыйПровайдерПараметров);
+ Если ЗначениеЗаполнено(ИдентификаторПровайдера) Тогда
+ ДобавляемыйПровайдерПараметров.УстановитьИдентификатор(ИдентификаторПровайдера);
+ КонецЕсли;
-КонецПроцедуры
+ ФинальныйИдентификатор = ПолучитьСвободныйИдентификатор(ДобавляемыйПровайдерПараметров.Идентификатор);
+ ДобавляемыйПровайдерПараметров.УстановитьИдентификатор(ФинальныйИдентификатор);
+
+ ПровайдерыПараметров.Вставить(ФинальныйИдентификатор, ДобавляемыйПровайдерПараметров);
+
+ Возврат ДобавляемыйПровайдерПараметров;
+
+КонецФункции
// Отключает провайдера из таблицы провайдеров
//
@@ -164,6 +179,27 @@
КонецПроцедуры
+// Возвращает класс-провайдер по идентификатору для прямой настройки
+//
+// Параметры:
+// ИдентификаторПровайдера - Строка - идентификатор провайдера (например, "json", "yaml#2")
+//
+// Возвращаемое значение:
+// Произвольный - класс провайдера или Неопределено если не найден
+//
+Функция ПровайдерПоИдентификатору(Знач ИдентификаторПровайдера) Экспорт
+
+ Провайдер = ПровайдерыПараметров[ИдентификаторПровайдера];
+
+ Если Провайдер = Неопределено Тогда
+ Лог.Отладка("Провайдер с идентификатором <%1> не найден", ИдентификаторПровайдера);
+ Возврат Неопределено;
+ КонецЕсли;
+
+ Возврат Провайдер;
+
+КонецФункции
+
// Возвращает объект настройки поиска файлов
//
// Возвращаемое значение:
@@ -350,12 +386,14 @@
ИдентификаторПровайдера = КлассПровайдера.Идентификатор;
+ // Передаём глобальные настройки как fallback (обратная совместимость)
+ // Провайдер использует их только если у него нет собственных настроек
Если КлассПровайдера.ЭтоФайловыйПровайдер() Тогда
ПараметрыПровайдера = ПолучитьНастройкуФайловогоПровайдера().ПолучитьНастройки();
ИначеЕсли КлассПровайдера.ЭтоПровайдерVault() Тогда
ПараметрыПровайдера = ПолучитьНастройкуПровайдераVault().ПолучитьНастройки();
Иначе
- ПараметрыПровайдера = Новый Структура;
+ ПараметрыПровайдера = Неопределено;
КонецЕсли;
Попытка
@@ -438,6 +476,24 @@
КонецПроцедуры
+// Возвращает свободный идентификатор, добавляя суффикс #2, #3 при коллизии
+Функция ПолучитьСвободныйИдентификатор(БазовыйИдентификатор)
+
+ Если ПровайдерыПараметров[БазовыйИдентификатор] = Неопределено Тогда
+ Возврат БазовыйИдентификатор;
+ КонецЕсли;
+
+ Счетчик = 2;
+ Пока Истина Цикл
+ Кандидат = БазовыйИдентификатор + "#" + Счетчик;
+ Если ПровайдерыПараметров[Кандидат] = Неопределено Тогда
+ Возврат Кандидат;
+ КонецЕсли;
+ Счетчик = Счетчик + 1;
+ КонецЦикла;
+
+КонецФункции
+
Функция ПолучитьНастройкуФайловогоПровайдера()
Если НастройкаФайловогоПровайдера = Неопределено Тогда
diff --git "a/tests/\320\234\321\203\320\273\321\214\321\202\320\270\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200_test.os" "b/tests/\320\234\321\203\320\273\321\214\321\202\320\270\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200_test.os"
new file mode 100644
index 0000000..f813eb3
--- /dev/null
+++ "b/tests/\320\234\321\203\320\273\321\214\321\202\320\270\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200_test.os"
@@ -0,0 +1,200 @@
+#использовать "../src/"
+#Использовать asserts
+#Использовать tempfiles
+
+// Тесты на регистрацию нескольких провайдеров одного типа,
+// доступ по идентификатору и fluent-настройку каждого независимо.
+
+&Тест
+Процедура ТестДолжен_ДобавитьДваJSONПровайдераИПрочитать() Экспорт
+
+ // Дано: два разных JSON-файла
+ Файл1 = СоздатьВременныйJSON("{""key1"": ""value1""}");
+ Файл2 = СоздатьВременныйJSON("{""key2"": ""value2""}");
+
+ // Когда
+ МенеджерПараметров = Новый МенеджерПараметров();
+
+ Провайдер1 = МенеджерПараметров.ДобавитьПровайдерПараметров(Новый ПровайдерПараметровJSON());
+ Провайдер1.Настройки().УстановитьФайлПараметров(Файл1);
+
+ Провайдер2 = МенеджерПараметров.ДобавитьПровайдерПараметров(Новый ПровайдерПараметровJSON());
+ Провайдер2.Настройки().УстановитьФайлПараметров(Файл2);
+
+ МенеджерПараметров.Прочитать();
+
+ // Тогда
+ Ожидаем.Что(МенеджерПараметров.Параметр("key1")).Равно("value1");
+ Ожидаем.Что(МенеджерПараметров.Параметр("key2")).Равно("value2");
+
+ ВременныеФайлы.Удалить();
+
+КонецПроцедуры
+
+&Тест
+Процедура ТестДолжен_АвтоматическиНазначитьСуффиксДляВторогоПровайдера() Экспорт
+
+ // Дано
+ МенеджерПараметров = Новый МенеджерПараметров();
+
+ // Когда
+ Провайдер1 = МенеджерПараметров.ДобавитьПровайдерПараметров(Новый ПровайдерПараметровJSON());
+ Провайдер2 = МенеджерПараметров.ДобавитьПровайдерПараметров(Новый ПровайдерПараметровJSON());
+ Провайдер3 = МенеджерПараметров.ДобавитьПровайдерПараметров(Новый ПровайдерПараметровJSON());
+
+ // Тогда — идентификаторы уникальны
+ Ожидаем.Что(Провайдер1.Идентификатор).Равно("json");
+ Ожидаем.Что(Провайдер2.Идентификатор).Равно("json#2");
+ Ожидаем.Что(Провайдер3.Идентификатор).Равно("json#3");
+
+КонецПроцедуры
+
+&Тест
+Процедура ТестДолжен_НайтиПровайдерПоИдентификатору() Экспорт
+
+ // Дано
+ МенеджерПараметров = Новый МенеджерПараметров();
+ МенеджерПараметров.ДобавитьПровайдерПараметров(Новый ПровайдерПараметровJSON());
+ МенеджерПараметров.ДобавитьПровайдерПараметров(Новый ПровайдерПараметровJSON());
+
+ // Когда
+ ПровайдерJSON = МенеджерПараметров.ПровайдерПоИдентификатору("json");
+ ПровайдерJSON2 = МенеджерПараметров.ПровайдерПоИдентификатору("json#2");
+ НеСуществует = МенеджерПараметров.ПровайдерПоИдентификатору("нет_такого");
+
+ // Тогда
+ Ожидаем.Что(ПровайдерJSON <> Неопределено).ЭтоИстина();
+ Ожидаем.Что(ПровайдерJSON2 <> Неопределено).ЭтоИстина();
+ Ожидаем.Что(НеСуществует).ЭтоНеопределено();
+
+КонецПроцедуры
+
+&Тест
+Процедура ТестДолжен_ДобавитьПровайдерСЯвнымИдентификатором() Экспорт
+
+ // Дано
+ МенеджерПараметров = Новый МенеджерПараметров();
+
+ // Когда
+ Провайдер = МенеджерПараметров.ДобавитьПровайдерПараметров(Новый ПровайдерПараметровJSON(), Неопределено, "основной");
+
+ // Тогда
+ Ожидаем.Что(Провайдер.Идентификатор).Равно("основной");
+ Ожидаем.Что(МенеджерПараметров.ПровайдерПоИдентификатору("основной") <> Неопределено).ЭтоИстина();
+
+КонецПроцедуры
+
+&Тест
+Процедура ТестДолжен_НастроитьПровайдерСоответствиеЧерезFluent() Экспорт
+
+ // Дано
+ МенеджерПараметров = Новый МенеджерПараметров();
+
+ Соответствие1 = Новый Соответствие;
+ Соответствие1.Вставить("ключ1", "знач1");
+
+ Соответствие2 = Новый Соответствие;
+ Соответствие2.Вставить("ключ2", "знач2");
+
+ // Когда — два провайдера Соответствие, каждый с независимыми данными
+ Провайдер1 = МенеджерПараметров.ДобавитьПровайдерПараметров(Новый ПровайдерПараметровСоответствие());
+ Провайдер1.Настройки().УстановитьПараметры(Соответствие1);
+
+ Провайдер2 = МенеджерПараметров.ДобавитьПровайдерПараметров(Новый ПровайдерПараметровСоответствие());
+ Провайдер2.Настройки().УстановитьПараметры(Соответствие2);
+
+ МенеджерПараметров.Прочитать();
+
+ // Тогда
+ Ожидаем.Что(МенеджерПараметров.Параметр("ключ1")).Равно("знач1");
+ Ожидаем.Что(МенеджерПараметров.Параметр("ключ2")).Равно("знач2");
+
+КонецПроцедуры
+
+&Тест
+Процедура ТестДолжен_НастроитьПрефиксENVЧерезFluent() Экспорт
+
+ // Дано
+ УстановитьПеременнуюСреды("APP_PARAM_NAME", "ТестЗначение", РасположениеПеременнойСреды.Процесс);
+
+ МенеджерПараметров = Новый МенеджерПараметров();
+
+ // Когда
+ Провайдер = МенеджерПараметров.ДобавитьПровайдерПараметров(Новый ПровайдерПараметровENV());
+ Провайдер.Настройки().УстановитьПрефикс("APP");
+
+ МенеджерПараметров.Прочитать();
+
+ // Тогда
+ Ожидаем.Что(МенеджерПараметров.Параметр("Param.Name")).Равно("ТестЗначение");
+
+КонецПроцедуры
+
+&Тест
+Процедура ТестДолжен_ВернутьПравильныйТипИзНастроекПровайдеровJSON_INI_YAML() Экспорт
+
+ // НастройкиФайловогоПровайдера должны возвращаться у JSON / INI / YAML
+ ПровайдерJSON = Новый ПровайдерПараметровJSON();
+ ПровайдерINI = Новый ПровайдерПараметровINI();
+ ПровайдерYAML = Новый ПровайдерПараметровYAML();
+
+ Ожидаем.Что(ПровайдерJSON.Настройки() <> Неопределено).ЭтоИстина();
+ Ожидаем.Что(ПровайдерINI.Настройки() <> Неопределено).ЭтоИстина();
+ Ожидаем.Что(ПровайдерYAML.Настройки() <> Неопределено).ЭтоИстина();
+
+ // НастройкиПровайдераСоответствие у провайдера Соответствие
+ ПровайдерМап = Новый ПровайдерПараметровСоответствие();
+ Ожидаем.Что(ПровайдерМап.Настройки() <> Неопределено).ЭтоИстина();
+
+ // НастройкиПровайдераENV у ENVпровайдера
+ ПровайдерENV = Новый ПровайдерПараметровENV();
+ Ожидаем.Что(ПровайдерENV.Настройки() <> Неопределено).ЭтоИстина();
+
+КонецПроцедуры
+
+&Тест
+Процедура ТестДолжен_ПрочитатьJSONФайлНапрямую() Экспорт
+
+ // Дано
+ Файл = СоздатьВременныйJSON("{""direct"": ""result""}");
+
+ // Когда — вызов Прочитать() напрямую на провайдере (теперь Экспорт)
+ Провайдер = Новый ПровайдерПараметровJSON();
+ Результат = Провайдер.Прочитать(Файл);
+
+ // Тогда
+ Ожидаем.Что(Результат["direct"]).Равно("result");
+
+ ВременныеФайлы.Удалить();
+
+КонецПроцедуры
+
+&Тест
+Процедура ТестДолжен_ПрочитатьINIФайлНапрямую() Экспорт
+
+ // Дано
+ Файл = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "test-config.ini");
+
+ // Когда
+ Провайдер = Новый ПровайдерПараметровINI();
+ Результат = Провайдер.Прочитать(Файл);
+
+ // Тогда
+ Ожидаем.Что(Результат["owner.contact.email"]).Равно("mail.ru");
+
+КонецПроцедуры
+
+// Вспомогательные
+
+Функция СоздатьВременныйJSON(Знач ТекстJSON)
+
+ ПутьКФайлу = ВременныеФайлы.НовоеИмяФайла("json");
+
+ Запись = Новый ЗаписьТекста;
+ Запись.Открыть(ПутьКФайлу);
+ Запись.ЗаписатьСтроку(ТекстJSON);
+ Запись.Закрыть();
+
+ Возврат ПутьКФайлу;
+
+КонецФункции