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

18.02.14

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    2946    Abysswalker    7    

43

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

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

14.05.2025    5796    DeerCven    15    

57

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

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

21.05.2024    47293    dimanich70    83    

167

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

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

1 стартмани

18.03.2024    7067    6    John_d    13    

59

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

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

12.02.2024    58773    atdonya    31    

69

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

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

30.11.2023    8806    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. echo77 1936 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 Ответить
Для отправки сообщения требуется регистрация/авторизация