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





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

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

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

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

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

Функция ПолучитьПользовательскуюНастройкуОтбора(Отчет,ИмяПараметра)

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

ОтборПольз = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Отбор.ИдентификаторПользовательскойНастройки);

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


Возврат неопределено;
КонецФункции

Функция НайтиИмяПараметраОтбора(ПоследниеНастройкиВарианта,ИдентификаторПользовательскойНастройки)

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

Возврат неопределено;

КонецФункции

Процедура ЗапихнутьВПользовательскиеНастройки(Отчет,ТекущиеНастройки,ПрошлыеНастройки,ПоследниеНастройкиВарианта)

Если  ПрошлыеНастройки=неопределено тогда
Возврат;
КонецЕсли;

Для каждого ЭлементНастройки из ПрошлыеНастройки.Элементы цикл

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

Если СокрЛП(ЭлементНастройки.Параметр)=СокрЛП(ЭлементТекущейНастройки.Параметр) тогда
ЭлементТекущейНастройки.Использование = ЭлементНастройки.Использование;
ЭлементТекущейНастройки.Значение      = ЭлементНастройки.Значение;
КонецЕсли;

КонецЕсли;
КонецЦикла;
КонецЕсли;

Если  ПоследниеНастройкиВарианта=неопределено тогда
Возврат;
КонецЕсли;

Если ТипЗнч(ЭлементНастройки)=Тип("ЭлементОтбораКомпоновкиДанных") тогда

ИмяПараметра  = НайтиИмяПараметраОтбора(ПоследниеНастройкиВарианта,ЭлементНастройки.ИдентификаторПользовательскойНастройки);
ПользовательскийОтбор = ПолучитьПользовательскуюНастройкуОтбора(Отчет,ИмяПараметра);

Если ПользовательскийОтбор=неопределено тогда
продолжить;
КонецЕсли;

ПользовательскийОтбор.Использование  = ЭлементНастройки.Использование;
ПользовательскийОтбор.ВидСравнения   = ЭлементНастройки.ВидСравнения;
ПользовательскийОтбор.ПравоеЗначение = ЭлементНастройки.ПравоеЗначение;

КонецЕсли;

КонецЦикла;

КонецПроцедуры

Процедура ДействияПриЗагрузкеПользовательскихНастроекНаСервере(Отчет,ИмяОтчета) Экспорт

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

ЗапихнутьВПользовательскиеНастройки(Отчет,Отчет.КомпоновщикНастроек.ПользовательскиеНастройки,ПоследниеПользовательскиеНастройки,ПоследниеНастройкиВарианта);

КонецПроцедуры

Процедура ДействияПриСохраненииПользовательскихНастроекНаСервере(Отчет,ИмяОтчета,Настройки) Экспорт

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

КонецПроцедуры

Процедура ДействияПриЗагрузкеВариантаНаСервере(Отчет,ИмяОтчета,КлючТекущегоВарианта) Экспорт

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

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

КонецПроцедуры

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

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

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

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

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

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

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

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

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

 

6 Comments

  1. echo77

    ЗапихнутьВПользовательскиеНастройки — это пять 🙂

    Я бы не стал из-за такой мелочи вносить изменения в общий модуль

    Reply
  2. allexx

    При выборе варианта на форме, в процедуре ПриЗагрузкеВариантаНаСервере вылазит ошибка:

    «Поле объекта не обнаружено (ЭтоРасшифровка)».

    При этом при открытии отчета эта процедура тоже вызывается и там ошибки не возникает.

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

    Reply
  3. allexx

    Не совсем понял, в каком случае в процедуре ПриЗагрузкеПользовательскихНастроекНаСервере выполнится это самое «// иначе эти настройки не загрузятся при следующем изменеии варианта».

    Reply
  4. Светлый ум

    Молодцом : спасибо +1

    Reply
  5. newborn

    Спасибо. Может быть эта публикация не очень новая, но она мне помогла.

    Reply
  6. emoe

    При смене варианта можно использовать конструкцию:

    // 1. сохраняем текущие настройки варианта отчета

    ПредыдущиеНастройки = КомпоновщикНастроек.Настройки;

    // 2. загружаем новый вариант отчета

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

    // 3. оставляем старые параметры при изменении варианта отчета

    ТекущиеНастройки = КомпоновщикНастроек.Настройки;

    Для Каждого текЭлемент Из ПредыдущиеНастройки.ПараметрыДанных.Элементы Цикл

    текПараметр = ТекущиеНастройки.ПараметрыДанных.Элементы.Найти(текЭлемент.Параметр);

    Если НЕ текПараметр = Неопределено Тогда

    ЗаполнитьЗначенияСвойств(текПараметр, текЭлемент);

    КонецЕсли;

    КонецЦикла;

    // 4. оставляем старый отбор

    текОтбор = КомпоновщикНастроек.Настройки.Отбор.Элементы;

    текОтбор.Очистить();

    Для Каждого ЭлементОтбора Из ПредыдущиеНастройки.Отбор.Элементы Цикл

    нЭлемент = текОтбор.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

    ЗаполнитьЗначенияСвойств(нЭлемент, ЭлементОтбора);

    КонецЦикла;

    И все

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *