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

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.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

18.03.2024    2670    0    John_d    8    

54

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

12.02.2024    4608    atdonya    22    

45

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

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

30.11.2023    3961    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    8822    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2071    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16144    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7243    quazare    8    

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

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

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

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

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

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