Перенос пользовательских настроек между вариантами отчета на СКД

18.02.14

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

При работе с вариантами отчета на СКД, по умолчанию пользовательские настройки для каждого варианта отчета заполняются отдельно.
Например, если есть параметр "Период", то заполнив его в одном варианте отчета, при переключении на другой вариант отчета - придется опять заполнять этот параметр.

При работе с вариантами отчета на СКД, по умолчанию пользовательские настройки для каждого варианта отчета заполняются отдельно.
Например, если есть параметр "Период", то заполнив его в одном варианте отчета, при переключении на другой вариант отчета - придется опять заполнять этот параметр.

Это не всегда удобно. Для более комфортной работы, я уже много лет использую описанный ниже механизм.

1. Добавляется (обновляется) общий модуль "МодульОтчетов" (сервер) с кодом:

//******************************************************************************************
// Передача параметров и отборов между вариантами
//******************************************************************************************

Функция ПолучитьПользовательскуюНастройкуОтбора(Отчет,ИмяПараметра)	
	
	Для каждого Отбор из Отчет.КомпоновщикНастроек.Настройки.Отбор.Элементы цикл
		Если ТипЗнч(Отбор)<>Тип("ЭлементОтбораКомпоновкиДанных") тогда
			продолжить;
		КонецЕсли;	
		Если СокрЛП(Отбор.ЛевоеЗначение)<>ИмяПараметра тогда
			продолжить;
		КонецЕсли;	
		
		ОтборПольз = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Отбор.ИдентификаторПользовательскойНастройки);

		Возврат ОтборПольз;
	КонецЦикла;	
	
						   	
	Возврат неопределено;
КонецФункции

Функция НайтиИмяПараметраОтбора(ПоследниеНастройкиВарианта,ИдентификаторПользовательскойНастройки)
	
	Для каждого Элемент из ПоследниеНастройкиВарианта.Отбор.Элементы цикл 
		Если Элемент.ИдентификаторПользовательскойНастройки = ИдентификаторПользовательскойНастройки тогда
			Возврат(СокрЛП(Элемент.ЛевоеЗначение));
		КонецЕсли;	
	КонецЦикла;	
	
	Возврат неопределено;
	
КонецФункции

Процедура ЗапихнутьВПользовательскиеНастройки(Отчет,ТекущиеНастройки,ПрошлыеНастройки,ПоследниеНастройкиВарианта)
	
	Если  ПрошлыеНастройки=неопределено тогда
		Возврат;
	КонецЕсли;	
	
	Для каждого ЭлементНастройки из ПрошлыеНастройки.Элементы цикл
		
		Если ТипЗнч(ЭлементНастройки)=Тип("ЗначениеПараметраНастроекКомпоновкиДанных") тогда
			Для каждого ЭлементТекущейНастройки из ТекущиеНастройки.Элементы цикл
				Если ТипЗнч(ЭлементТекущейНастройки)=Тип("ЗначениеПараметраНастроекКомпоновкиДанных") тогда
					
					Если СокрЛП(ЭлементНастройки.Параметр)=СокрЛП(ЭлементТекущейНастройки.Параметр) тогда
						ЭлементТекущейНастройки.Использование = ЭлементНастройки.Использование;
						ЭлементТекущейНастройки.Значение      = ЭлементНастройки.Значение;
					КонецЕсли;
					
				КонецЕсли;
			КонецЦикла;	
		КонецЕсли;	
		
		Если  ПоследниеНастройкиВарианта=неопределено тогда
			Возврат;
		КонецЕсли;	
		
		Если ТипЗнч(ЭлементНастройки)=Тип("ЭлементОтбораКомпоновкиДанных") тогда
			
			 ИмяПараметра  = НайтиИмяПараметраОтбора(ПоследниеНастройкиВарианта,ЭлементНастройки.ИдентификаторПользовательскойНастройки);
			 ПользовательскийОтбор = ПолучитьПользовательскуюНастройкуОтбора(Отчет,ИмяПараметра);
			 
			 Если ПользовательскийОтбор=неопределено тогда
				 продолжить;
			 КонецЕсли;	 
			 
			ПользовательскийОтбор.Использование  = ЭлементНастройки.Использование;
			ПользовательскийОтбор.ВидСравнения   = ЭлементНастройки.ВидСравнения;
			ПользовательскийОтбор.ПравоеЗначение = ЭлементНастройки.ПравоеЗначение;
			 
		КонецЕсли;	
		
	КонецЦикла;	
	
КонецПроцедуры

Процедура ДействияПриЗагрузкеПользовательскихНастроекНаСервере(Отчет,ИмяОтчета) Экспорт
	
	ПоследниеПользовательскиеНастройки = ХранилищеСистемныхНастроек.Загрузить("Отчет."+ИмяОтчета+"/ПоследниеПользовательскиеНастройки","");
	ПоследниеНастройкиВарианта         = ХранилищеСистемныхНастроек.Загрузить("Отчет."+ИмяОтчета+"","ПоследниеНастройкиВарианта");
	
	ЗапихнутьВПользовательскиеНастройки(Отчет,Отчет.КомпоновщикНастроек.ПользовательскиеНастройки,ПоследниеПользовательскиеНастройки,ПоследниеНастройкиВарианта);
	
КонецПроцедуры

Процедура ДействияПриСохраненииПользовательскихНастроекНаСервере(Отчет,ИмяОтчета,Настройки) Экспорт
	
	ХранилищеСистемныхНастроек.Сохранить("Отчет."+ИмяОтчета+"/ПоследниеПользовательскиеНастройки","",Настройки);
	ХранилищеСистемныхНастроек.Сохранить("Отчет."+ИмяОтчета+"","ПоследниеНастройкиВарианта",Отчет.КомпоновщикНастроек.Настройки);
	
КонецПроцедуры

Процедура ДействияПриЗагрузкеВариантаНаСервере(Отчет,ИмяОтчета,КлючТекущегоВарианта) Экспорт
	
	ПользовательскиеНастройкиТекущегоВарианта = ХранилищеСистемныхНастроек.Загрузить("Отчет."+ИмяОтчета+"/"+КлючТекущегоВарианта+"/ТекущиеПользовательскиеНастройки","");
	
	Если ПользовательскиеНастройкиТекущегоВарианта=неопределено тогда
		ПоследниеПользовательскиеНастройки = ХранилищеСистемныхНастроек.Загрузить("Отчет."+ИмяОтчета+"/ПоследниеПользовательскиеНастройки","");
		ПоследниеНастройкиВарианта         = ХранилищеСистемныхНастроек.Загрузить("Отчет."+ИмяОтчета+"","ПоследниеНастройкиВарианта");
		ЗапихнутьВПользовательскиеНастройки(Отчет,Отчет.КомпоновщикНастроек.ПользовательскиеНастройки,ПоследниеПользовательскиеНастройки,ПоследниеНастройкиВарианта);
	КонецЕсли;
	
КонецПроцедуры

//******************************************************************************************
//******************************************************************************************
//******************************************************************************************

2. У отчета создается форма Действия с формой отчета:

 а) добавляется параметр "Расшифровка" (булево)

 б) добавляется реквизит формы "ЗаменитьПользовательскиеНастройки" (булево)

в) прописываются процедуры "ПриЗагрузкеВариантаНаСервере","ПриСохраненииПользовательскихНастроекНаСервере","ПриЗагрузкеПользовательскихНастроекНаСервере". Их код представлен ниже.

&НаСервере
Процедура ПриЗагрузкеПользовательскихНастроекНаСервере(Настройки)
	Если НЕ ЭтаФорма.Параметры.ЭтоРасшифровка тогда
		Если ЭтаФорма.ЗаменитьПользовательскиеНастройки тогда
			МодульОтчетов.ДействияПриЗагрузкеПользовательскихНастроекНаСервере(Отчет,РеквизитФормыВЗначение("Отчет").ЭтотОбъект.Метаданные().Имя);
			ЭтаФорма.ЗаменитьПользовательскиеНастройки = ложь;
		иначе  // иначе эти настройки не загрузятся при следующем изменеии варианта
			МодульОтчетов.ДействияПриСохраненииПользовательскихНастроекНаСервере(Отчет,РеквизитФормыВЗначение("Отчет").ЭтотОбъект.Метаданные().Имя,Настройки);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПриСохраненииПользовательскихНастроекНаСервере(Настройки)
	МодульОтчетов.ДействияПриСохраненииПользовательскихНастроекНаСервере(Отчет,РеквизитФормыВЗначение("Отчет").ЭтотОбъект.Метаданные().Имя,Настройки);
КонецПроцедуры

&НаСервере
Процедура ПриЗагрузкеВариантаНаСервере(Настройки)
	Если НЕ ЭтаФорма.Параметры.ЭтоРасшифровка тогда
		МодульОтчетов.ДействияПриЗагрузкеВариантаНаСервере(Отчет,РеквизитФормыВЗначение("Отчет").ЭтотОбъект.Метаданные().Имя,ЭтаФорма.КлючТекущегоВарианта);
		ЭтаФорма.ЗаменитьПользовательскиеНастройки = истина;
	КонецЕсли;
КонецПроцедуры
 

После этих действий, пользовательские настройки отчета "переходят" из одного варианта в другой PS Представленный алгоритм работает только в случае, если у отчета не установлено свойство: "Хранилище вариантов" и "Хранилище настроек" (то есть используется системное).

 

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

перенос пользовательские настройки скд

См. также

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

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

14.05.2025    3410    DeerCven    8    

45

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

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

21.05.2024    40876    dimanich70    83    

157

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

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

1 стартмани

18.03.2024    6018    6    John_d    11    

58

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

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

12.02.2024    48987    atdonya    30    

65

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

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

30.11.2023    7781    ke.92@mail.ru    17    

66

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

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

28.08.2023    20970    YA_418728146    8    

174
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. echo77 1928 20.02.14 20:37 Сейчас в теме
ЗапихнутьВПользовательскиеНастройки - это пять :-)
Я бы не стал из-за такой мелочи вносить изменения в общий модуль
2. allexx 43 07.05.14 15:53 Сейчас в теме
При выборе варианта на форме, в процедуре ПриЗагрузкеВариантаНаСервере вылазит ошибка:
"Поле объекта не обнаружено (ЭтоРасшифровка)".
При этом при открытии отчета эта процедура тоже вызывается и там ошибки не возникает.

Сам разобрался, надо поставить галку "Ключевой параметр"
3. allexx 43 07.05.14 17:44 Сейчас в теме
Не совсем понял, в каком случае в процедуре ПриЗагрузкеПользовательскихНастроекНаСервере выполнится это самое "// иначе эти настройки не загрузятся при следующем изменеии варианта".
4. Светлый ум 455 29.01.16 09:03 Сейчас в теме
Молодцом : спасибо +1
serg_gres; +1 Ответить
5. newborn 04.03.16 17:53 Сейчас в теме
Спасибо. Может быть эта публикация не очень новая, но она мне помогла.
serg_gres; +1 Ответить
6. emoe 19.03.19 05:54 Сейчас в теме
При смене варианта можно использовать конструкцию:
// 1. сохраняем текущие настройки варианта отчета
ПредыдущиеНастройки = КомпоновщикНастроек.Настройки;

// 2. загружаем новый вариант отчета
КомпоновщикНастроек.ЗагрузитьНастройки(Настройка.Настройки);

// 3. оставляем старые параметры при изменении варианта отчета
ТекущиеНастройки = КомпоновщикНастроек.Настройки;
Для Каждого текЭлемент Из ПредыдущиеНастройки.ПараметрыДанных.Элементы Цикл
текПараметр = ТекущиеНастройки.ПараметрыДанных.Элементы.Найти(текЭлемент.Параметр);
Если НЕ текПараметр = Неопределено Тогда
ЗаполнитьЗначенияСвойств(текПараметр, текЭлемент);
КонецЕсли;
КонецЦикла;

// 4. оставляем старый отбор
текОтбор = КомпоновщикНастроек.Настройки.Отбор.Элементы;
текОтбор.Очистить();

Для Каждого ЭлементОтбора Из ПредыдущиеНастройки.Отбор.Элементы Цикл
нЭлемент = текОтбор.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЗаполнитьЗначенияСвойств(нЭлемент, ЭлементОтбора);
КонецЦикла;
И все
user712426; BoBaH; slax; testnv0; via; Риф; +6 Ответить
Для отправки сообщения требуется регистрация/авторизация