При программном выборе варианта отчета перезатерает отборы

1. user1302499 13.04.21 10:28 Сейчас в теме
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
		
		//Выбор варианта отчета
		Вариант = СхемаКомпоновкиДанных.ВариантыНастроек.СводныйОтчетПоПродажам;
		Для Каждого Элемент ИЗ Вариант.Настройки.Отбор.Элементы Цикл
			Настройки.Отбор.Элементы.
			
		КонецЦикла;	
		Настройки = Вариант.СводныйОтчетПоПродажам;
		
		//---
Показать


Хотел в цикле перебрать элементы как-нибудь. И перекинуть значения отбора до того как затрет. Или может есть способ сделать более правильно?
Найденные решения
12. SlavaKron 13.04.21 13:26 Сейчас в теме
(1)
Хотел в цикле перебрать элементы как-нибудь.
Можно обойти рекурсивно текущие отборы и добавить их в отборы варианта:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	Настройки = КомпоновщикНастроек.ПолучитьНастройки();
	
	НастройкиВарианта = СхемаКомпоновкиДанных.ВариантыНастроек.СводныйОтчетПоПродажам.Настройки;
	СкопироватьОтборыРекурсивно(НастройкиВарианта.Отбор, Настройки.Отбор);
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиВарианта, ДанныеРасшифровки);
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	
КонецПроцедуры

Процедура СкопироватьОтборыРекурсивно(Приемник, Источник)
	
	Для Каждого Элемент Из Источник.Элементы Цикл
		
		Если ТипЗнч(Элемент) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
			ЭлементОтбора = Приемник.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
			ЗаполнитьЗначенияСвойств(ЭлементОтбора, Элемент);
		Иначе
			ГруппаОтборов = Приемник.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
			ЗаполнитьЗначенияСвойств(ГруппаОтборов, Элемент);
			СкопироватьОтборыРекурсивно(ГруппаОтборов, Элемент)
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры
Показать
21. SlavaKron 16.04.21 10:13 Сейчас в теме
(20) Ключ варианта вроде бы можно сразу переопределить в ОпределитьНастройкиФормы, еще до открытия стандартной формы отчета:
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
	
	Если ЭтоГлавныйМенеджер() Тогда
		КлючВарианта = "ВариантДляГлавногоМенеджера";
	Иначе
		КлючВарианта = "ВариантДляМенеджера";
	КонецЕсли;
	
КонецПроцедуры
Показать
Сами же варианты сделать недоступными для всех пользователей. В итоге можно вообще забыть про копирование настроек, параметров и прочее.
Здесь на форуме много специалистов по СКД, возможно они посоветуют более оптимальный вариант.
Прикрепленные файлы:
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
12. SlavaKron 13.04.21 13:26 Сейчас в теме
(1)
Хотел в цикле перебрать элементы как-нибудь.
Можно обойти рекурсивно текущие отборы и добавить их в отборы варианта:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	Настройки = КомпоновщикНастроек.ПолучитьНастройки();
	
	НастройкиВарианта = СхемаКомпоновкиДанных.ВариантыНастроек.СводныйОтчетПоПродажам.Настройки;
	СкопироватьОтборыРекурсивно(НастройкиВарианта.Отбор, Настройки.Отбор);
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиВарианта, ДанныеРасшифровки);
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	
КонецПроцедуры

Процедура СкопироватьОтборыРекурсивно(Приемник, Источник)
	
	Для Каждого Элемент Из Источник.Элементы Цикл
		
		Если ТипЗнч(Элемент) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
			ЭлементОтбора = Приемник.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
			ЗаполнитьЗначенияСвойств(ЭлементОтбора, Элемент);
		Иначе
			ГруппаОтборов = Приемник.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
			ЗаполнитьЗначенияСвойств(ГруппаОтборов, Элемент);
			СкопироватьОтборыРекурсивно(ГруппаОтборов, Элемент)
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры
Показать
13. user1302499 13.04.21 13:58 Сейчас в теме
(12) Спасибо. Решил что просто очистить Вариант.Отбор.Элементы и записать все из Настройки.Отбор - хорошая идея. Жаль сразу не додумался
14. user1302499 15.04.21 15:34 Сейчас в теме
(12) А как можно периоды при формировании отчета так же передавать?
У меня есть 2 периода
1: с 01.01.2020 по текущий день 2020-го
2: с 01.01.2021 по текущий день 2021-го
Сделано чтобы каждый раз отчет подтягивал при открытии текущий день. А вот если пользователь изменил период то при формировании он соответственно не изменяется и формирует до текущего дня. Уже 2 дня мучаюсь)
15. SlavaKron 15.04.21 15:47 Сейчас в теме
(14) Это Параметры СКД? Наверно, так же – обходить параметры в текущих настройках и заполнять их в настройках варианта.
16. user1302499 15.04.21 16:23 Сейчас в теме
(15)Я, если честно не могу понять куда их в настройках варианта заполнять. В этом вся проблема собственно. Я сейчас нашел какую-то статью, надеюсь прочитаю, пойму
17. SlavaKron 15.04.21 17:13 Сейчас в теме
(16)Попробуйте так:
Для Каждого ПараметрДанных Из Настройки.ПараметрыДанных.Элементы Цикл
	Если ПараметрДанных.Использование Тогда
		НастройкиВарианта.ПараметрыДанных.УстановитьЗначениеПараметра(ПараметрДанных.Параметр, ПараметрДанных.Значение);
	КонецЕсли;
КонецЦикла;
18. user1302499 16.04.21 09:07 Сейчас в теме
(17)
Для Каждого ПараметрДанных Из Настройки.ПараметрыДанных.Элементы Цикл
Если ПараметрДанных.Использование Тогда
НастройкиВарианта.ПараметрыДанных.УстановитьЗначениеПараметра(ПараметрДанных.Параметр, ПараметрДанных.Значение);
КонецЕсли;
КонецЦикла;



А как при открытии этой формы задать периоды? Когда делаю форму и в при открытии прописываю. Ломается кнопка настроек. Я уже совсем потерялся в этой задаче. Кручу, верчу и так и эдак и все никак)
19. SlavaKron 16.04.21 09:32 Сейчас в теме
(18) А почему вообще возникла такая задача - программно подменять вариант отчета?
20. user1302499 16.04.21 09:45 Сейчас в теме
(19) Есть менеджеры. Есть главные менеджеры.

Менеджер должен видеть отчет по такой структуре:

Организация --> Контрагент --> Номенклатура + отбор по текущему пользователю(текущему менеджеру)

Главный менеджер должен видеть отчет по немного иной структуре:

Организация --> Контрагент.ОтветственныйМенеджер ---> Контрагент ---> Номенклатура (Без отбора)


Только что нашел такой код для установки периода, сейчас пробую:

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

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


Если знаете как можно избежать создания двух вариантов расскажите пожалуйста) У главных менеджеров если что, полные права
21. SlavaKron 16.04.21 10:13 Сейчас в теме
(20) Ключ варианта вроде бы можно сразу переопределить в ОпределитьНастройкиФормы, еще до открытия стандартной формы отчета:
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
	
	Если ЭтоГлавныйМенеджер() Тогда
		КлючВарианта = "ВариантДляГлавногоМенеджера";
	Иначе
		КлючВарианта = "ВариантДляМенеджера";
	КонецЕсли;
	
КонецПроцедуры
Показать
Сами же варианты сделать недоступными для всех пользователей. В итоге можно вообще забыть про копирование настроек, параметров и прочее.
Здесь на форуме много специалистов по СКД, возможно они посоветуют более оптимальный вариант.
Прикрепленные файлы:
22. user1302499 19.04.21 09:42 Сейчас в теме
(21)
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт

Если ЭтоГлавныйМенеджер() Тогда
КлючВарианта = "ВариантДляГлавногоМенеджера";
Иначе
КлючВарианта = "ВариантДляМенеджера";
КонецЕсли;

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


Я в шоке. Столько гуглил и не мог этого найти! Я Ради этого такой бред писал с перекидыванием параметров. То в одном период не работал в другом варианте отборы не работали.Спасибо!
2. Svetlanka_sv 45 13.04.21 11:42 Сейчас в теме
//сохраняем настройки
Настройки = КомпоновщикНастроек.ПолучитьНастройки();

//выбираем вариант отчета
Вариант = СхемаКомпоновкиДанных.ВариантыНастроек.СводныйОтчетПоПродажам;

//загружаем настройки
КомпоновщикНастроек.ЗагрузитьНастройки(Настройки );
3. UtSpar 134 13.04.21 11:45 Сейчас в теме
(2) Он и отборы и параметры и сортировки и все скопирует?
5. user1302499 13.04.21 12:57 Сейчас в теме
(2)
//сохраняем настройки
Настройки = КомпоновщикНастроек.ПолучитьНастройки();

//выбираем вариант отчета
Вариант = СхемаКомпоновкиДанных.ВариантыНастроек.СводныйОтчетПоПродажам;

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


А где собственно мы указываем вариант отчета для настроек? В данном примере Вы просто выбрали настройки. В переменную записали вариант отчета. И полученные настройки обратно без изменений загрузили.
4. Svetlanka_sv 45 13.04.21 11:53 Сейчас в теме
(3) Если они в варианте описаны. А если вы хотите ещё пользовательские настройки, то их тоже сначала нужно сохранить, например:
ПользовательскиеНастройки = ЭтотОбъект.КомпоновщикНастроек.ПользовательскиеНастройки;
6. user1302499 13.04.21 13:00 Сейчас в теме
(4)
Если они в варианте описаны.


В том то и дело, что они не описаны)
Нужно как-то сохранять отбор при выборе варианта.
7. UtSpar 134 13.04.21 13:04 Сейчас в теме
(4)
А если вы хотите ещё пользовательские настройки


Пользовательские настройки - это настройки которые пользователь например сам установил - через Отбор в расширенных настройках отчета?
9. user1302499 13.04.21 13:06 Сейчас в теме
(7) Которые на форме отчета
10. UtSpar 134 13.04.21 13:08 Сейчас в теме
(9) то что Вам и надо получается?
11. user1302499 13.04.21 13:09 Сейчас в теме
(10) Я не уверен. Но из просто Отбора точно нужны)
8. user1302499 13.04.21 13:04 Сейчас в теме
Нужно из
Вариант.Настройки.Отбор.Элементы
передать всю структуру в
Настройки.Отбор.Элементы
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот