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

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

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

В наличии

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

Категория:

Описание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 
has been added to your cart:
Оформление заказа