Как определить владельца формы выбора?

1. vladimir1985 11 13.03.15 00:50 Сейчас в теме
Подскажите пожалуйста, как определить владельца формы выбора справочника, т.е. из какого объекта была вызвана данная форма ?
На обычных формах.
Есть документ, в этом документе поле табличного документа, при нажатие на ячейку открывается форма выбора справочника и мне необходимо в данную форму передать отбор по учреждению, которое указано в данном документе. Т.е. если я определю из какого документа была открыта форма, в отбор я смогу передать значение реквизита Учреждение , данного документа.
интересует способ без использования обработок расшифровки и процедур типа - начало выбора.
Есть у кого-нибудь какие идеи?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. MiniMuk 10 13.03.15 04:37 Сейчас в теме
(1) vladimir1985, ссылка.Владелец?
3. vladimir1985 11 13.03.15 11:29 Сейчас в теме
если все бы было так просто
к ссылке в процедуре при открытии формы выбора, обращаться нельзя поэтому этот вариант не работает
4. GunnyBear 3 13.03.15 11:35 Сейчас в теме
а что ВладелецФормы не заполнено?
5. vladimir1985 11 13.03.15 13:25 Сейчас в теме
6. user942338 16.08.19 14:24 Сейчас в теме
7. VmvLer 16.08.19 14:47 Сейчас в теме
(6) Владелец "видим" только на клиенте, вернее он не видим в обработке создания формы.

Я делаю примерно так

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


Можете делать как я или изобретать свой костыль.
8. lukinsz 19.11.20 07:28 Сейчас в теме
ВладелецФормы.Родитель.Родитель.Родитель.Родитель.Объект.Ссылка

В моем случае открывалась форма выбора справочника "СпецификацииНоменклатуры" из документа "ОтчетПроизводстваЗаСмену" в конфигурации Бухгалтерия (управляемые формы)
9. harchenko_pavel 41 18.09.21 21:31 Сейчас в теме
Я сделал функцию в самописном общем модуле FormClient, для решения этой задачи
// *************************************************************************************************
// Функция ищет владельца заданного типа в переданной форме
//
// Параметры:
//    Форма      - клиентская форма
//    ИскомыйТип - необязательный параметр, тип объекта для поиска, если не задан, 
//                 функция вернет первый найденный объект   
//
// Возвращает: Ссылка на найденный объект / неопределено, если владелец не найден 
//   
// Пример: Ссылка = FormClient.НайтиВладельцаФормыПоТипу(ЭтаФорма, "СправочникСсылка.Контрагенты"); 
//         Ссылка = FormClient.НайтиВладельцаФормыПоТипу(ЭтаФорма);
// *************************************************************************************************
Function НайтиВладельцаФормыПоТипу(Форма, ИскомыйТип = Undefined) Export
	
	ОбъектПоиска = Форма.ВладелецФормы.Родитель;
	While true Do 
		// Ищем ссылку на объект искомого типа
		Try If TypeOf(ОбъектПоиска.Объект.Ссылка) = Type(ИскомыйТип) ИЛИ ИскомыйТип = Undefined Then  
				// Ссылкаа на объект найдена, прерываем цикл
				ОбъектПоиска = ОбъектПоиска.Объект.Ссылка;
				break;
			EndIf;	
		Except
			// В этой итерации ссылка не обнаружена, ищем ссылку на владельца формы
			Try  ОбъектПоиска = ОбъектПоиска.ВладелецФормы; 	
			Except 
				// В этой итерации владелец формы не обнаружен, ищем родителя
				Try ОбъектПоиска = ОбъектПоиска.Родитель; 
				// Не найден ни объект, ни владелец формы, ни родитель, прерываем поиск
				Except
					ОбъектПоиска = Undefined;
					break; 
				EndTry;
			EndTry; 
		EndTry;
	EndDo; 
	return ОбъектПоиска;   
	
EndFunction  // НайтиВладельцаФормыПоТипу()
Показать


В моем случае поиск объекта: "ЭтаФорма.ВладелецФормы.Родитель.ВладелецФормы.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Объект.Ссылка" занял 9 итераций, если же форма открывается из формы списка, то функция возвращает "Неопределено" за 1 итерацию.

P.S. Я использую английские названия для своих общих модулей, с целью исключения конфликта с БСП, а английский синтаксис позволяет сократить код, и упрощает его чтение ИМХО.
albanec61rus; +1 Ответить
10. harchenko_pavel 41 19.09.21 16:32 Сейчас в теме
(9)При определенных условиях, когда форма отрывалась из другой формы с передачей владельца формы как параметр, алгоритм не находил владельца. Вот исправленный вариант, лишенный этих недостатков
// *************************************************************************************************
// Функция ищет владельца переданной клиентской формы
//
// Параметры:
//    Форма      - клиентская форма
//
// Возвращает: Ссылка на найденный объект / неопределено, если владелец не найден ​
//   
// Пример: Ссылка = FormClient.НайтиВладельцаФормыПоТипу(ЭтаФорма);
// *************************************************************************************************
Function НайтиОбъектВладелецФормы(Форма) Export
	
	Try    ОбъектПоиска = Форма.ВладелецФормы; 
	Except Return Undefined; 
	EndTry;
	While true Do 
		// Ищем ссылку на объект владелец формы
		Try ОбъектПоиска = ОбъектПоиска.Объект.Ссылка; 
            Return ОбъектПоиска;	
		Except
			// В этой итерации ссылка не обнаружена, ищем владельца формы
			Try  ОбъектПоиска = ОбъектПоиска.ВладелецФормы; 	
			Except 
				// В этой итерации владелец формы не обнаружен, ищем родителя
				Try ОбъектПоиска = ОбъектПоиска.Родитель; 
				// Не найден ни объект, ни владелец формы, ни родитель, прерываем поиск
				Except Return Undefined;  
				EndTry;
			EndTry;
		EndTry;
	EndDo; 
	
EndFunction  // НайтиВладельцаФормыПоТипу()
Показать
MoshkovEV; Toliban; user712426; Dlylim; +4 Ответить
11. v3rter 25.01.23 14:05 Сейчас в теме
Тем, кто будут искать ответ для 8.1 - в ней она ЭтаФорма
user712426; +1 Ответить
Оставьте свое сообщение

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