Например, если есть параметр "Период", то заполнив его в одном варианте отчета, при переключении на другой вариант отчета — придется опять заполнять этот параметр.
При работе с вариантами отчета на СКД, по умолчанию пользовательские настройки для каждого варианта отчета заполняются отдельно.
Например, если есть параметр «Период», то заполнив его в одном варианте отчета, при переключении на другой вариант отчета — придется опять заполнять этот параметр.
Это не всегда удобно. Для более комфортной работы, я уже много лет использую описанный ниже механизм.
1. Добавляется (обновляется) общий модуль «МодульОтчетов» (сервер) с кодом:
//******************************************************************************************
// Передача параметров и отборов между вариантами
//******************************************************************************************
Функция ПолучитьПользовательскуюНастройкуОтбора(Отчет,ИмяПараметра)
Для каждого Отбор из Отчет.КомпоновщикНастроек.Настройки.Отбор.Элементы цикл
Если ТипЗнч(Отбор)<>Тип("ЭлементОтбораКомпоновкиДанных") тогда
продолжить;
КонецЕсли;
Если СокрЛП(Отбор.ЛевоеЗначение)<>ИмяПараметра тогда
продолжить;
КонецЕсли;
ОтборПольз = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Отбор.ИдентификаторПользовательскойНастройки);
Возврат ОтборПольз;
КонецЦикла;
Возврат неопределено;
КонецФункции
Функция НайтиИмяПараметраОтбора(ПоследниеНастройкиВарианта,ИдентификаторПользовательскойНастройки)
Для каждого Элемент из ПоследниеНастройкиВарианта.Отбор.Элементы цикл
Если Элемент.ИдентификаторПользовательскойНастройки = ИдентификаторПользовательскойНастройки тогда
Возврат(СокрЛП(Элемент.ЛевоеЗначение));
КонецЕсли;
КонецЦикла;
Возврат неопределено;
КонецФункции
Процедура ЗапихнутьВПользовательскиеНастройки(Отчет,ТекущиеНастройки,ПрошлыеНастройки,ПоследниеНастройкиВарианта)
Если ПрошлыеНастройки=неопределено тогда
Возврат;
КонецЕсли;
Для каждого ЭлементНастройки из ПрошлыеНастройки.Элементы цикл
Если ТипЗнч(ЭлементНастройки)=Тип("ЗначениеПараметраНастроекКомпоновкиДанных") тогда
Для каждого ЭлементТекущейНастройки из ТекущиеНастройки.Элементы цикл
Если ТипЗнч(ЭлементТекущейНастройки)=Тип("ЗначениеПараметраНастроекКомпоновкиДанных") тогда
Если СокрЛП(ЭлементНастройки.Параметр)=СокрЛП(ЭлементТекущейНастройки.Параметр) тогда
ЭлементТекущейНастройки.Использование = ЭлементНастройки.Использование;
ЭлементТекущейНастройки.Значение = ЭлементНастройки.Значение;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ПоследниеНастройкиВарианта=неопределено тогда
Возврат;
КонецЕсли;
Если ТипЗнч(ЭлементНастройки)=Тип("ЭлементОтбораКомпоновкиДанных") тогда
ИмяПараметра = НайтиИмяПараметраОтбора(ПоследниеНастройкиВарианта,ЭлементНастройки.ИдентификаторПользовательскойНастройки);
ПользовательскийОтбор = ПолучитьПользовательскуюНастройкуОтбора(Отчет,ИмяПараметра);
Если ПользовательскийОтбор=неопределено тогда
продолжить;
КонецЕсли;
ПользовательскийОтбор.Использование = ЭлементНастройки.Использование;
ПользовательскийОтбор.ВидСравнения = ЭлементНастройки.ВидСравнения;
ПользовательскийОтбор.ПравоеЗначение = ЭлементНастройки.ПравоеЗначение;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ДействияПриЗагрузкеПользовательскихНастроекНаСервере(Отчет,ИмяОтчета) Экспорт
ПоследниеПользовательскиеНастройки = ХранилищеСистемныхНастроек.Загрузить("Отчет."+ИмяОтчета+"/ПоследниеПользовательскиеНастройки","");
ПоследниеНастройкиВарианта = ХранилищеСистемныхНастроек.Загрузить("Отчет."+ИмяОтчета+"","ПоследниеНастройкиВарианта");
ЗапихнутьВПользовательскиеНастройки(Отчет,Отчет.КомпоновщикНастроек.ПользовательскиеНастройки,ПоследниеПользовательскиеНастройки,ПоследниеНастройкиВарианта);
КонецПроцедуры
Процедура ДействияПриСохраненииПользовательскихНастроекНаСервере(Отчет,ИмяОтчета,Настройки) Экспорт
ХранилищеСистемныхНастроек.Сохранить("Отчет."+ИмяОтчета+"/ПоследниеПользовательскиеНастройки","",Настройки);
ХранилищеСистемныхНастроек.Сохранить("Отчет."+ИмяОтчета+"","ПоследниеНастройкиВарианта",Отчет.КомпоновщикНастроек.Настройки);
КонецПроцедуры
Процедура ДействияПриЗагрузкеВариантаНаСервере(Отчет,ИмяОтчета,КлючТекущегоВарианта) Экспорт
ПользовательскиеНастройкиТекущегоВарианта = ХранилищеСистемныхНастроек.Загрузить("Отчет."+ИмяОтчета+"/"+КлючТекущегоВарианта+"/ТекущиеПользовательскиеНастройки","");
Если ПользовательскиеНастройкиТекущегоВарианта=неопределено тогда
ПоследниеПользовательскиеНастройки = ХранилищеСистемныхНастроек.Загрузить("Отчет."+ИмяОтчета+"/ПоследниеПользовательскиеНастройки","");
ПоследниеНастройкиВарианта = ХранилищеСистемныхНастроек.Загрузить("Отчет."+ИмяОтчета+"","ПоследниеНастройкиВарианта");
ЗапихнутьВПользовательскиеНастройки(Отчет,Отчет.КомпоновщикНастроек.ПользовательскиеНастройки,ПоследниеПользовательскиеНастройки,ПоследниеНастройкиВарианта);
КонецЕсли;
КонецПроцедуры
//******************************************************************************************
//******************************************************************************************
//******************************************************************************************
2. У отчета создается форма Действия с формой отчета:
а) добавляется параметр «Расшифровка» (булево)
б) добавляется реквизит формы «ЗаменитьПользовательскиеНастройки» (булево)
в) прописываются процедуры «ПриЗагрузкеВариантаНаСервере»,»ПриСохраненииПользовательскихНастроекНаСервере»,»ПриЗагрузкеПользовательскихНастроекНаСервере». Их код представлен ниже.
&НаСервере
Процедура ПриЗагрузкеПользовательскихНастроекНаСервере(Настройки)
Если НЕ ЭтаФорма.Параметры.ЭтоРасшифровка тогда
Если ЭтаФорма.ЗаменитьПользовательскиеНастройки тогда
МодульОтчетов.ДействияПриЗагрузкеПользовательскихНастроекНаСервере(Отчет,РеквизитФормыВЗначение("Отчет").ЭтотОбъект.Метаданные().Имя);
ЭтаФорма.ЗаменитьПользовательскиеНастройки = ложь;
иначе // иначе эти настройки не загрузятся при следующем изменеии варианта
МодульОтчетов.ДействияПриСохраненииПользовательскихНастроекНаСервере(Отчет,РеквизитФормыВЗначение("Отчет").ЭтотОбъект.Метаданные().Имя,Настройки);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриСохраненииПользовательскихНастроекНаСервере(Настройки)
МодульОтчетов.ДействияПриСохраненииПользовательскихНастроекНаСервере(Отчет,РеквизитФормыВЗначение("Отчет").ЭтотОбъект.Метаданные().Имя,Настройки);
КонецПроцедуры
&НаСервере
Процедура ПриЗагрузкеВариантаНаСервере(Настройки)
Если НЕ ЭтаФорма.Параметры.ЭтоРасшифровка тогда
МодульОтчетов.ДействияПриЗагрузкеВариантаНаСервере(Отчет,РеквизитФормыВЗначение("Отчет").ЭтотОбъект.Метаданные().Имя,ЭтаФорма.КлючТекущегоВарианта);
ЭтаФорма.ЗаменитьПользовательскиеНастройки = истина;
КонецЕсли;
КонецПроцедуры
После этих действий, пользовательские настройки отчета «переходят» из одного варианта в другой PS Представленный алгоритм работает только в случае, если у отчета не установлено свойство: «Хранилище вариантов» и «Хранилище настроек» (то есть используется системное).
ЗапихнутьВПользовательскиеНастройки — это пять 🙂
Я бы не стал из-за такой мелочи вносить изменения в общий модуль
При выборе варианта на форме, в процедуре ПриЗагрузкеВариантаНаСервере вылазит ошибка:
«Поле объекта не обнаружено (ЭтоРасшифровка)».
При этом при открытии отчета эта процедура тоже вызывается и там ошибки не возникает.
Сам разобрался, надо поставить галку «Ключевой параметр»
Не совсем понял, в каком случае в процедуре ПриЗагрузкеПользовательскихНастроекНаСервере выполнится это самое «// иначе эти настройки не загрузятся при следующем изменеии варианта».
Молодцом : спасибо +1
Спасибо. Может быть эта публикация не очень новая, но она мне помогла.
При смене варианта можно использовать конструкцию:
// 1. сохраняем текущие настройки варианта отчета
ПредыдущиеНастройки = КомпоновщикНастроек.Настройки;
// 2. загружаем новый вариант отчета
КомпоновщикНастроек.ЗагрузитьНастройки(Настройка.Настройки);
// 3. оставляем старые параметры при изменении варианта отчета
ТекущиеНастройки = КомпоновщикНастроек.Настройки;
Для Каждого текЭлемент Из ПредыдущиеНастройки.ПараметрыДанных.Элементы Цикл
текПараметр = ТекущиеНастройки.ПараметрыДанных.Элементы.Найти(текЭлемент.Параметр);
Если НЕ текПараметр = Неопределено Тогда
ЗаполнитьЗначенияСвойств(текПараметр, текЭлемент);
КонецЕсли;
КонецЦикла;
// 4. оставляем старый отбор
текОтбор = КомпоновщикНастроек.Настройки.Отбор.Элементы;
текОтбор.Очистить();
Для Каждого ЭлементОтбора Из ПредыдущиеНастройки.Отбор.Элементы Цикл
нЭлемент = текОтбор.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
ЗаполнитьЗначенияСвойств(нЭлемент, ЭлементОтбора);
КонецЦикла;
И все