Вариант организации хранения настроек подсистем

22.10.21

Разработка - Универсальные функции

В статье опишу вариант хранения настроек используемый мной при реализации функциональных блоков

Вводные

  • При создании функционального блока нужно зафиксировать его настройки
  • Доработки производятся в расширении

 

Вариант решения

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

 

Структура РС НастройкиПодсистемы

  • Измерения
    • Настройка - Строка(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" + АдресРесурса, СтрокаДанные, ДополнительныеПараметры);
	

Итог

Без изменения структуры (если РС уже создан) возможно добавлять необходимые настройки.

Как сделать универсальную валидацию не придумал, проверяю на уровне модуля подсистемы.

 

Благодарю за внимание.

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    5534    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    46708    dimanich70    83    

165

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    6896    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    57929    atdonya    31    

68

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    8674    ke.92@mail.ru    17    

68

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

28.08.2023    22906    YA_418728146    8    

174
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. artbear 1583 22.10.21 11:59 Сейчас в теме
(0) Наверное, что-то интересное, но без примера пока непонятно )

>для нормализации использовать обработки.

Расшифруй эту фразу

вижу, что обработка используется, ее форма, заполняются реквиизиты.

но как в дальнейшем эта обработка используется, не показано.
2. malikov_pro 1353 22.10.21 12:24 Сейчас в теме
(1) В моем понимании нормализация это приведение необходимым типам, если в обработке сменился тип, то после загрузки из РС будет "ПустаяСсылка", сайдэффектом может быть преобразованное к строке значение по ссылке.
"но как в дальнейшем эта обработка используется, не показано." - обновил статью.

Так же нормально не решен вопрос по безопасности - буду рад варианту решения.
3. pm74 203 22.10.21 13:25 Сейчас в теме
что понимается под подсистемой? если речь про расширение , то есть такое решениие,
правда для добавления/изменения настройки нужно добавить ее описание в коде расширения
4. malikov_pro 1353 22.10.21 13:30 Сейчас в теме
(3) Функциональный блок, пример из проекта на скриншоте во вложении
Прикрепленные файлы:
5. malikov_pro 1353 22.10.21 13:45 Сейчас в теме
Вариант решения подобной задачи с использованием БСП https://infostart.ru/1c/articles/1243789/
Для отправки сообщения требуется регистрация/авторизация