Вводные
- При создании функционального блока нужно зафиксировать его настройки
- Доработки производятся в расширении
Вариант решения
Хранить настройки в одном служебном регистре, для нормализации использовать обработки.
Структура РС НастройкиПодсистемы
- Измерения
- Настройка - Строка(50)
- Подсистема - Строка(50)
- Ресурсы
- ХранилищеЗначения - ХранилищеЗначения
Общий модуль "НастройкиПодсистемПовтИсп"
// Возвращает обработку с заполненными настройками подсистемы
// Параметры
// Подсистема - Строка
// Результат Обработка, при отсутствии Неопределено
Функция ПолучитьНастройки(ИмяПодсистемы) Экспорт
Результат = Неопределено;
Попытка
Результат = Обработки["НастройкиПодсистемы_" + ИмяПодсистемы].Создать();
Исключение
ОбщегоНазначения.Лог(СтрШаблон("ПолучениеНастроек.СозданиеОбработки.%1", ИмяПодсистемы), ОписаниеОшибки(),, Истина);
Отказ = Истина;
КонецПопытки;
Если Результат <> Неопределено Тогда
НастройкиПодсистем.ПолучитьНастройки(Результат);
КонецЕсли;
Возврат Результат;
КонецФункции
Общий модуль "НастройкиПодсистем"
Процедура ЗаписатьНастройки(обОбработка) Экспорт
НаборЗаписей = РегистрыСведений.НастройкиПодсистемы.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Подсистема.Установить(обОбработка.ПолучитьИмяПодсистемы());
Для Каждого Реквизит Из обОбработка.Метаданные().Реквизиты Цикл
Запись = НаборЗаписей.Добавить();
Запись.Подсистема = обОбработка.ПолучитьИмяПодсистемы();
Запись.Настройка = Реквизит.Имя;
Запись.ХранилищеЗначения = Новый ХранилищеЗначения(обОбработка[Реквизит.Имя]);
КонецЦикла;
Для Каждого ТабличнаяЧасть Из обОбработка.Метаданные().ТабличныеЧасти Цикл
Запись = НаборЗаписей.Добавить();
Запись.Подсистема = обОбработка.ПолучитьИмяПодсистемы();
Запись.Настройка = "ТЧ_" + ТабличнаяЧасть.Имя;
Запись.ХранилищеЗначения = Новый ХранилищеЗначения(обОбработка[ТабличнаяЧасть.Имя].Выгрузить());
КонецЦикла;
НаборЗаписей.Записать(Истина);
ОбновитьПовторноИспользуемыеЗначения();
КонецПроцедуры
Процедура ПолучитьНастройки(обОбработка) Экспорт
Подсистема = обОбработка.ПолучитьИмяПодсистемы();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НастройкиПодсистемы.Настройка КАК Настройка,
| НастройкиПодсистемы.ХранилищеЗначения КАК ХранилищеЗначения
|ИЗ
| РегистрСведений.НастройкиПодсистемы КАК НастройкиПодсистемы
|ГДЕ
| НастройкиПодсистемы.Подсистема = &Подсистема";
Запрос.УстановитьПараметр("Подсистема", Подсистема);
ТЗ = Запрос.Выполнить().Выгрузить();
Для Каждого Реквизит Из обОбработка.Метаданные().Реквизиты Цикл
нСтроки = ТЗ.НайтиСтроки(Новый Структура("Настройка", Реквизит.Имя));
Если нСтроки.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
обОбработка[Реквизит.Имя] = нСтроки[0].ХранилищеЗначения.Получить();
КонецЦикла;
Для Каждого ТабличнаяЧасть Из обОбработка.Метаданные().ТабличныеЧасти Цикл
нСтроки = ТЗ.НайтиСтроки(Новый Структура("Настройка", "ТЧ_" + ТабличнаяЧасть.Имя));
Если нСтроки.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
Значение = нСтроки[0].ХранилищеЗначения.Получить();
Попытка
обОбработка[ТабличнаяЧасть.Имя].Загрузить(Значение);
Исключение
ОбщегоНазначения.Лог(СтрШаблон("НастройкиПодсистемы.ПолучениеИзРС.%1.%2", Подсистема, ТабличнаяЧасть.Имя), ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Модуль Формы обработки настроек
&НаКлиенте
Процедура ЗаписатьНастройки(Команда)
ЗаписатьНастройкиНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаписатьНастройкиНаСервере()
обОбработка = РеквизитФормыВЗначение("Объект");
обобработка.ЗаписатьНастройки();
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
обОбработка = РеквизитФормыВЗначение("Объект");
обобработка.ПолучитьНастройки();
ЗначениеВРеквизитФормы(обОбработка, "Объект");
КонецПроцедуры
Модуль объекта обработки
Функция ПолучитьИмяПодсистемы() Экспорт
Возврат "DataLens";
КонецФункции
Процедура ЗаписатьНастройки() Экспорт
НастройкиПодсистем.ЗаписатьНастройки(ЭтотОбъект);
КонецПроцедуры
Процедура ПолучитьНастройки() Экспорт
НастройкиПодсистем.ПолучитьНастройки(ЭтотОбъект);
КонецПроцедуры
Пример использования
Создаю в расширении обработку "НастройкиПодсистемы_ДаДата", в модуле объекта изменяю
Функция ПолучитьИмяПодсистемы() Экспорт
Возврат "ДаДата";
КонецФункции
В обработку "НастройкиПодсистемы_ДаДата" добавляю реквизиты "ИспользованиеСервиса" - Булево и КлючДоступа - Строка (50), вывожу на форму обработки.
В модуле подсистемы использую
НастройкиПодсистемы = НастройкиПодсистемПовтИсп.ПолучитьНастройки("ДаДата");
СоответствиеОтвет = Новый Соответствие;
Если НЕ НастройкиПодсистемы.ИспользованиеСервиса Тогда
Возврат СоответствиеОтвет;
КонецЕсли;
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Заголовки", Новый Соответствие);
ДополнительныеПараметры.Заголовки.Вставить("Content-type", "application/json");
ДополнительныеПараметры.Заголовки.Вставить("Accept", "application/json");
ДополнительныеПараметры.Заголовки.Вставить("Authorization", "Token " + НастройкиПодсистемы.КлючДоступа);
ДанныеОтвет = КоннекторHTTP.Post("https://suggestions.dadata.ru" + АдресРесурса, СтрокаДанные, ДополнительныеПараметры);
Итог
Без изменения структуры (если РС уже создан) возможно добавлять необходимые настройки.
Как сделать универсальную валидацию не придумал, проверяю на уровне модуля подсистемы.
Благодарю за внимание.