СКД - не могу настроить связь параметров выбора для выбора по нескольким Владельцам

Внимание! Тема закрыта. Добавлять сообщения в закрытую тему запрещено.
1. ikar-nikolay 103 12.02.14 11:40 Сейчас в теме
Предприятие 8.2 УФ.
В СКД передаю запрос с Владельцами и Подчиненными элементами (для примера Контрагентов и договора),
в Наборе данных в поле "Договоры" выбираю Параметры редактирования - Связи параметров выбора
ввожу в Параметры выбора "Отбор.Владелец", и в Поле "Контрагент".

Теперь, когда я выбираю одного Контрагента, то выбирается список его договоров, но когда я открываю 2-х и более Контрагентов, то вываливается весь список договоров, без какого-либо отбора.

Вопрос: Как настроить связь, что бы при выборе нескольких Контрагентов выдавался список Договоров только этих Контрагентов?
+
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Rothschild 12.02.14 12:00 Сейчас в теме
(1) ikar-nikolay,
при выборе в отборе настроек СКД ???
и это наверное действует только в управляемом приложений.
в обычной форме у меня эти настройки ни на что не влияют.
ЗЫ
и не в "оформлении" поля СКД а в его "параметрах редактирования".
+
3. ikar-nikolay 103 12.02.14 12:12 Сейчас в теме
(2) Rothschild, Подправил описание. Формы управляемые.

Как мне казалось - эта функция стандартней не бывает, но...
Ой, как не хочется туда ручками лезть. (((
+
5. Rothschild 12.02.14 12:18 Сейчас в теме
(2)
есть еще кроме "связей параметров выбора"
так называемые "параметры выбора"
можно поиграться с ними - среди типов параметра там есть список значений
...
хотя мне сдается что условия связей "в списке" вряд ли поддерживается
покрайней мере явно нигде про это не говорится.
Прикрепленные файлы:
+
6. ikar-nikolay 103 12.02.14 13:21 Сейчас в теме
(5) Rothschild, тогда получается, то нужно отловить событие изменения настройки, и Договора вносить принудительно в указанные "Параметры выбора" в соответствии с выбором Контрагентов. Постараюсь тогда отписаться о результате, поскольку, как мне кажется, вопрос достаточно интересный.
Будут идеи - отписывайте!
Rothschild; +1
7. Восьмой 88 12.02.14 14:02 Сейчас в теме
(6) ikar-nikolay, отборы вынести через табличную часть а далее перехватывать событие при начале выбора - с передачей параметра в форму выбора - примерно так. Т.е. юзать свою форму настроек а не СКД-шную, и на ней делать перехват с передачей параметров по нужной логике.
+
9. ikar-nikolay 103 12.02.14 14:41 Сейчас в теме
(7) Восьмой, зачем такие сложности?
В КомпоновщикНастроекПользовательскиеНастройки формы СКД событий предостаточно, или они с отборами не дружат?

ПС: у меня это вспомогательный механизм, сейчас основу прописываю, как закончу - возьмусь тогда и за этот.
+
11. Восьмой 88 12.02.14 14:52 Сейчас в теме
(9) ikar-nikolay, ты же это в интерфейсе реализовать хочешь?)
+
13. ikar-nikolay 103 12.02.14 15:04 Сейчас в теме
(11) Восьмой, ну да, поэтому создал Форму СКД и над ней хочу провести шаманство.
Там есть КомпоновщикНастроекПользовательскиеНастройки, который выкидывает все настройки и по умолчанию и пользовательские. Через этот реквизит и буду пытаться закидывать объекты для выбора.
+
14. Восьмой 88 12.02.14 15:11 Сейчас в теме
(13) ikar-nikolay, я имел ввиду вот с этим шаманство:

svican; +1
15. ikar-nikolay 103 12.02.14 15:29 Сейчас в теме
(14) Восьмой, теперь я тебя понял. Этот вариант оставлю как вариант Б, не хочу лишних форм создавать.
Вариантом А попробую поискать решение здесь:
Восьмой; +1
16. Восьмой 88 12.02.14 15:33 Сейчас в теме
(15) ikar-nikolay, Сорь завтыкал - у тя ж УФ. а так у тя вариант +100500.
+
8. Rothschild 12.02.14 14:29 Сейчас в теме
(6) ikar-nikolay,
с практической проверкой идей у меня проблемка.
главная база в УПП-1.2 на 8.1.
бухии правда в УПП-1.3 на 8.2, зато, блин! - в режиме совместимости 8.1
...
в режиме управляемого приложения не запускаются!!!
-)))
+
10. ikar-nikolay 103 12.02.14 14:45 Сейчас в теме
(8) Rothschild, создай новую базу на УФ, в ней создай 2 справочника, один из которых владелец другого, внеси пару элементов Владельцев и по паре закрепленных за владельцем + отчет на СКД. Вот и вся практика. )))))
+
12. Rothschild 12.02.14 15:03 Сейчас в теме
(10) ikar-nikolay, лень же матушка вперед меня родилась!
;)))
+
4. Восьмой 88 12.02.14 12:17 Сейчас в теме
(1) ikar-nikolay, ни катит это в случае если в отборе стоит в списке)
+
17. ikar-nikolay 103 13.02.14 02:48 Сейчас в теме
Для правильной реализации выбрал следующий план действий:
1) Сохранение текущих значений Владельца при изменении и при открытии (во время загрузки настроек)
2) Для вывода списка значений Подчиненного справочника - создаем свою форму (СписокЗначенийПодчиненногоСправочника) и там же добавляем ещё реквизит НаименованиеВладельца. Это улучшит визуализацию и при выборе договоров "Основной" у двух контрагентов будет понятно чей он.
3) При клике на значении Подчиненного справочника (Договора) передаем в параметрах введенных Владельцев в СписокЗначенийПодчиненногоСправочника (п.2) и открываем форму.
4) При клике на значение СписокЗначенийПодчиненногоСправочника открывать ФормуВыбора Подчиненного справочника (Договора) с нужным отбором и после выбора значения помещать в СписокЗначенийПодчиненногоСправочника.
5) При нажатии "Сохранить" в СписокЗначенийПодчиненногоСправочника настройки меняют типовые.

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

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

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


Остальное завтра!
Rothschild; +1
18. Rothschild 13.02.14 07:35 Сейчас в теме
(17) ikar-nikolay,
это все хорошо - отважные герои всегда идут в обход
;)))
есть "небольшой" недостаток у решения - уж слишком оно не универсально:
приходится подгоняться к структуре полей отчета (их именам) и предусматривать специфические формы выбора.
***
но повидимому другого решения задачи нет -
- при нынешней реализации СКД и управляемых форм.

ЗЫ
можно разве что
попытаться сделать предлагаемый механизм чуток универсальней.
+
19. ikar-nikolay 103 14.02.14 01:07 Сейчас в теме
Я пошутил выше по поводу сохранения значений в параметры... )))

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

Форма выбора открывается, когда и у Подчиненного и у Владельца указан тип значения (ВСписке)!!!

Для реализации нам требуется:

1) создать произвольную форму в СКД с названием "ФормаВыбораПодчинения"
и следующими реквизитами (соответственно реквизиты ВладелецВыбор и ПодчиненныйВыбор должны иметь правильную ссылку)



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

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

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

	Если Не Значение = Неопределено Тогда
		Элемент.ТекущиеДанные.ПодчиненныйВыбор 	= Значение;
		Элемент.ТекущиеДанные.ВладелецВыбор		= ПолучитьВладельцаПоПодчиненному(Значение)
	КонецЕсли;

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



2) В КомпоновщикНастроекПользовательскиеНастройки (см. пост выше) на ПередНачаломИзменения вешаем приведенный ниже обработчик.
Все, что нам тут необходимо ввести, это строковое название Реквизита владельца и подчиненного в переменные НазваниеРеквизитаВладельца, НазваниеРеквизитаПодчиненного.

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

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

Показать


В созданной форме выбора можно будет добавить список Владельцев, по которым необходимо делать отборы и после завершения подбора, выбранные значения Владельцев автоматически попадут в настройки.
+
20. ikar-nikolay 103 20.02.14 01:42 Сейчас в теме
Кому интересно, продолжение тут.
+
Внимание! Тема сдана в архив

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