СКД: как обновить форму после программной установки отбора?

1. inf012 20.07.17 09:12 Сейчас в теме
Здравствуйте.
СКД.
Есть отбор, настроенный руками по умолчанию в конфигураторе:
ВидРасчета НеВСписке ...(пусто)
Отбор включен в быстрые настройки и отображается при входе в отчет

В процедуре ПриКомпоновкеРезультата я программно задаю список значений (правое условие этого отбора)
Далее, при выполнении отчета отбор применяется и самой печ.форме отчета (настройка выводить отбор включена) данный отбор выводиться, все ок.

Но несмотря на то, что к отчету отбор применился, в форме по прежнему, галка не стоит у отбора и список значений пуст
А мне бы хотелось, чтобы он заполнился тем списком, к-й я программно установил и который фактически применился.

То есть, чтобы форма настроек соответствовала фактическому отбору.

Вопрос: как это сделать?
Получить форму отчета и как-то выполнить команду Обновить()?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. sergpogo 2 20.07.17 16:54 Сейчас в теме
(1) см. СоздатьЭлементыФормыПользовательскихНастроек(<ГруппаПользовательскихНастроек>, <Режим>, <КоличествоКолонок>)
tetraren; +1 Ответить
2. tata_1211 63 20.07.17 09:22 Сейчас в теме
(1) А если отбор устанавливать не при компоновке результата, а при открытии формы?
3. inf012 20.07.17 09:47 Сейчас в теме
(2) Не знаю..
Конфа типовая ЗУП.
У отчета вообще нет своей формы.
Есть только общая форма отчета на БСП.
4. burni4 87 20.07.17 16:50 Сейчас в теме
Сталкивался с такой проблемой в БП, я так понимаю это косяк УФ, так что тоже с удовольствием узнал бы решение этой проблемы.
6. andron77777 20.07.17 18:27 Сейчас в теме
Так как отбор включен в пользовательские настройки, то заполнять условие отбора нужно в пользовательских настройках компоновщика настроек, а потом с помощью метода ПолучитьНастройки() получать настройки для передачи в компоновщик макета. Как то так:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	УстановитьПараметрПользовательскойНастройки(КомпоновщикНастроек.ПользовательскиеНастройки, "ДатаНачала", '2016-01-01');
	УстановитьПользовательскуюНастройку(КомпоновщикНастроек, КомпоновщикНастроек.ПользовательскиеНастройки, "Склад", Справочники.Склады.НайтиПоКоду("000000001"));
	НастройкиКомпоновки = КомпоновщикНастроек.ПолучитьНастройки();
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновки);
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	
КонецПроцедуры

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

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

Все равно в самой форме список значений не заполнился, т.е. в отладке видно, что
Элемент.Использование = Истина;
Элемент.ПравоеЗначение   = <Нужный список значений>;


А на форме все равно ничего не поменялось.

И еще: в вашем примере УстановитьПараметрПользовательскойНастройки - лишняя для данной темы, там ведь значение совсем другого параметра устанавливается?

У вас получилось добиться именно обновления самого поля ввода в Форме?
8. andron77777 31.07.17 12:13 Сейчас в теме
(7) Да, пример про параметр лишний, это так скажем, на всякий случай :)
Обновления поля достичь получилось. Вы и сами можете посмотреть, как это работает, так как отчет сделан на примере демонстрационной конфигурации "Управляемое приложение".
Прикрепленные файлы:
9. inf012 31.07.17 13:46 Сейчас в теме
(8) Спасибо.
А не подскажете, почему у меня не работает, вот код:

ПолеКомпоновкиДанных = Новый ПолеКомпоновкиДанных("ВидРасчета");
	ЭлементОтбора = Неопределено;
	Для Каждого Элемент Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
	    Если Элемент.ЛевоеЗначение = ПолеКомпоновкиДанных Тогда
	        ЭлементОтбора = Элемент;
	        Прервать;    
	    КонецЕсли;            
	КонецЦикла;
	Если ЭлементОтбора <> Неопределено Тогда
		
		Элемент = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(ЭлементОтбора.ИдентификаторПользовательскойНастройки);
		Элемент.ВидСравнения   = ВидСравненияКомпоновкиДанных.Равно;
		Элемент.ПравоеЗначение = ПланыВидовРасчета.Начисления.НайтиПоКоду("ОКЛЧС");
		Элемент.Использование  = Истина;
	КонецЕсли;
		
	НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();	
	
	СтандартнаяОбработка = Ложь;
	
	ДокументРезультат.Очистить();
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(ЭтотОбъект.СхемаКомпоновкиДанных, НастройкиОтчета, ДанныеРасшифровки);
	
	// Создадим и инициализируем процессор компоновки.
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	
	// Обозначим начало вывода
	ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
Показать
10. andron77777 31.07.17 13:53 Сейчас в теме
(9)Можете отчет сюда кинуть?
11. inf012 31.07.17 13:55 Сейчас в теме
(10) Наверное, именно этот не получиться, т.к. это модификация типового отчета в ЗУП, там подтягиваются еще из типовой конфы истинные тексты запроса.
Если только мне попробовать упрощенный вариант создать и на нем попробовать.

А по коду выше ничего не подскажете, его не достаточно?
12. inf012 31.07.17 14:16 Сейчас в теме
А вы не можете сбросить тестовый какой, я сам посмотрю, что там.
Возможно, что-то отличается.
если нет, тогда попытаюсь сделать тестовый.
13. andron77777 31.07.17 14:18 Сейчас в теме
14. andron77777 31.07.17 14:20 Сейчас в теме
(12)Конфа, на которой написан он - ТЫК
15. inf012 31.07.17 14:27 Сейчас в теме
(14) Спасибо, получил, посмотрю, по результатам отпишусь
18. inf012 01.08.17 11:04 Сейчас в теме
(14) Посмотрел конфу, вроде, все также делаю.
Как вы думаете, возможно, дело в БСП.
Т.е. конфа типовая и все формирования происходят через длительные операции (или как их там), т.е. в фоне.
Возможно, поэтому не обновляется сама форма?
20. andron77777 01.08.17 12:59 Сейчас в теме
(18) Попробуйте запустить базу с параметром запуска "РежимОтладки" и посмотрите, будет ли заполняться форма отчета.
Прикрепленные файлы:
ilyav; inf012; +2 Ответить
16. fly_men 31.07.17 14:38 Сейчас в теме
НастройкиКомпоновки = КомпоновщикНастроек.ПолучитьНастройки();

ЭлементОтбора = НастройкиКомпоновки .Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.Использование = истина;
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке ;
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("<Ваше поле отбора>");
ЭлементОтбора.ПравоеЗначение = <Ваш список>
17. inf012 01.08.17 10:59 Сейчас в теме
(16) Спасибо, но так тоже не работает (т.е. отбор применяется без обновления формы)
19. inf012 01.08.17 11:46 Сейчас в теме
(16) А не скажете, если программно каждый раз выполнять этот код при формировании отчета, не будет "плодиться" число элементов отбора?
А то 10 раз нажму - вдруг 10 раз добавиться условие, а потом сохраним вариант и так и останется, нет?
22. fixin 4253 12.09.23 14:51 Сейчас в теме
(19) используйте уникальный гуид, если уже по такому добавлено, не добавляйте.
21. fixin 4253 12.09.23 14:51 Сейчас в теме
Если мы говорим за БСП, обнаружил странное - если нажать Настройки и закрыть их, добавленные поля пользовательской настройки появляются.

А вот само по себе не обновляется.

Обнаружил, что нужно вызывать специальный метод БСП ОтчетыСервер.ОбновитьЭлементыФормыНастроек, вот пример расширения типовой формы отчета (не до конца допиленный, но нужное видно):


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

&НаСервере
Процедура пно_ОбновитьПользовательскиеНастройки()
		ОтчетыСервер.ОбновитьЭлементыФормыНастроек(ЭтаФорма, Элементы.КомпоновщикНастроекПользовательскиеНастройки);
КонецПроцедуры


&НаСервереБезКонтекста
Процедура пно_УстановитьЭлементПользовательскогоОтбораСКД(КомпоновщикНастроек, ВидСравнения, ИмяПоля, Значение, GUID = Неопределено)
	

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

Показать




Также рекомендую по добавлению пользовательских полей:

https://geniy1s.ru/kak-dobavit-otbor-v-polzovatelskuyu-nastrojku-otcheta/
Оставьте свое сообщение

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