gifts2017

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

Опубликовал Сергей Начина (serg_gres) в раздел Программирование - Универсальные функции

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

См. также

Подписаться Добавить вознаграждение

Комментарии

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

Сам разобрался, надо поставить галку "Ключевой параметр"
3. Алексей Хлыбов (allexx) 07.05.14 17:44
Не совсем понял, в каком случае в процедуре ПриЗагрузкеПользовательскихНастроекНаСервере выполнится это самое "// иначе эти настройки не загрузятся при следующем изменеии варианта".
4. Константин Куликов (Светлый ум) 29.01.16 09:03
Молодцом : спасибо +1
serg_gres; +1 Ответить
5. NewBorn (newborn) 04.03.16 17:53
Спасибо. Может быть эта публикация не очень новая, но она мне помогла.
serg_gres; +1 Ответить
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа