Передать параметр из формы документа в в форму выбора.

1. burni4 87 31.03.16 17:05 Сейчас в теме
Управляемое приложение.
На форме документа в табличной части я выбираю номенклатуру, и открывается стандартная форма выбора, из открывшей формы по кнопке мне нужно будет открыть ещё одному форму, при этом мне необходим реквизит находящийся в первой форме документа. Отключать стандартную обработку выбора не очень хочется. Вопрос, как передать параметр в стандартную форму выбора, прочитать его там и передать дальше?
По теме из базы знаний
Найденные решения
24. burni4 87 01.04.16 12:28 Сейчас в теме
Все вроде разобрался, для особо одарённых как я вылаживаю что получилось в итоге)
Форма Источник (Документ из которого открывается форма выбора)

ПоступлениеНаименованиеНачалоВыбора - Наименование есть элемент табличной части.

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

Сырьё - соответственно то, что передаю из нашей выбранной строки тч.
МестоХранения - мой реквизит который я передаю в форму выбора.

Форма Приемник(Стандартаня форма выбора)

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Если Параметры.Свойство("МестоХранения") тогда
		МестоХранения=Параметры.МестоХранения;
	КонецЕсли;
	Если Параметры.Свойство("Сырьё") тогда
		НашеСырьё=Параметры.Сырьё;
		КонецЕсли;

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


&НаКлиенте
Процедура ПриОткрытии(Отказ)
	Элементы.Список.ТекущаяСтрока = НашеСырьё; // может и тупо, но этим я добился что бы в динамическом списке подсвечивалась та строчка того сырья, которое мы  выбрали на форме документа
КонецПроцедуры
Показать


Спасибо всем за помощь
userMKA; user1559729; mrChOP93; Lena272; simgo83; config; +6 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Tigreno 31.03.16 22:28 Сейчас в теме
(1) burni4, для первой формы выбора создай форму выбора. Добавь реквизит который передаешь из первой формы и в процедуре при создании заполняй его

При открытии следующей формы передачей его .

Можно конечно через параметры сеанса заморочится но это по моему не правильно
4. burni4 87 01.04.16 09:18 Сейчас в теме
(2) Tigreno, Логику я понимаю, мне интересно как программно из стандартной формы выбора обратиться к владельцу который её вызывает, просто в данном случаем
ЭтаФорма.Владелец он не видит
3. spe1c 5 31.03.16 23:25 Сейчас в теме
Можно еще через параметры формы.
5. burni4 87 01.04.16 09:43 Сейчас в теме
для управляемой формы:
пришлось бы передавать значение через параметры формы при ее открытии/получении,
а в обработчике события ПриСозданииНаСервере() устанавливать соответствующий реквизит формы
по структуре переданных параметров.

Нашёл в этой теме http://forum.infostart.ru/forum26/topic103253/ , но как это программно реализовать?
6. config 187 01.04.16 09:46 Сейчас в теме
(5) burni4, может эта публикация поможет. У меня там по шагам расписано как передать параметры
7. spe1c 5 01.04.16 09:57 Сейчас в теме
(5) burni4, зачем делать реквизит формы? Можно просто сделать параметр ключевым, тогда он будет доступен не только в ПриСозданииНаСервере() но и в других обработчиках. Ключевой параметр влияет на уникальность формы, но я думаю использование его таким способом не противоречит общей концепции. Или у реквизита есть какие-то преимущества перед ключевым параметром?
9. burni4 87 01.04.16 10:06 Сейчас в теме
(7) spe1c, Передается Реквизит МестоХранения, не думаю что он может быть уникальным, если честно то не совсем понимаю как работают параметры тк обучаюсь 1с самостоятельно и по мере необходимости, с ключевыми параметрами ещё не доводилось сталкиваться. Пример кода помог бы мне разобраться) но гугл не помогает
8. burni4 87 01.04.16 09:58 Сейчас в теме
Статья хорошая, но хотелось бы знать ответ без этой
СтандартнаяОбработка = Ложь;

строчки
10. burni4 87 01.04.16 10:20 Сейчас в теме
Да ну очень мне интересно почему при стандартном вызовеформы Выбора не передается владелец
11. Xershi 1484 01.04.16 10:22 Сейчас в теме
(10) burni4, потому что его нужно назначать отдельно. Это не обязательный параметр!
12. burni4 87 01.04.16 10:25 Сейчас в теме
(11) Xershi, как это сделать не отменяя стандартную обработку?
13. Xershi 1484 01.04.16 10:31 Сейчас в теме
(12) burni4, никогда не задумывался. А какая вам разница программно вызвать или стандартно? Разницы же нет.
14. burni4 87 01.04.16 10:33 Сейчас в теме
(13) Xershi, я так понимаю если отменить её то нужно вручную и динамический список настраивать и выбор на форме выбора и прочие уже написанные мелочи.
15. Xershi 1484 01.04.16 10:37 Сейчас в теме
(14) burni4, стандартная обработка это просто параметр который отменяет стандартные действия при нажатии кнопки выбора. Т.е. вместо выбора можно открыть свою форму или другое действие выполнить или программно открыть форму с нужными параметрами!
16. burni4 87 01.04.16 10:45 Сейчас в теме
(15) Xershi, это я понимаю, но если не сложно можно пример кода, показывающий как открыть форму выбора просто передав туда 1 реквизит и не трогая ничего стандартного.
17. bmk74 234 01.04.16 11:02 Сейчас в теме
(16)
ОткрытьФорму("ИмяФормы",Параметр,Владелец)


Где
Имя формы имя открываемой формы например "справочник.Номенклатура.Форма.ФормаВыбора"
Параметры, структура с передаваемыми параметрами,
владелец - элемент формы для которого вызывается форма выбора.
В самой структуре передаете параметры нужные
а вообще синтакс помошник в помощь.
19. burni4 87 01.04.16 11:15 Сейчас в теме
(17) bmk74,
&НаКлиенте
Процедура ПоступлениеНаименованиеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка=Ложь;

	НашаФорма=ПолучитьФорму("Справочник.Сырьё.ФормаВыбора",,ЭтаФорма);
	НашаФорма.Параметры.РежимВыбора = Истина;
	НашаФорма.Открыть();
	КонецПроцедуры

Режим выбора не работает, но ясное дело что реквизит подобным образом передать могу, что не так?
20. bmk74 234 01.04.16 11:27 Сейчас в теме
(19)
&НаКлиенте
Процедура ПоступлениеНаименованиеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка=Ложь;
    ПараметрыФормы = Новый Структура("Номенклатура,СвойПараметр",Номенклатура,СвойПараметр);
    ОткрытьФорму("Справочник.Сырьё.ФормаВыбора",ПараметрыФормы,Элемент);
    //НашаФорма=ПолучитьФорму("Справочник.Сырьё.ФормаВыбора",,ЭтаФорма);
    //НашаФорма.Параметры.РежимВыбора = Истина;
    //НашаФорма.Открыть();
    КонецПроцедуры
Показать

Где номенклатура выбранная номенклатура, я к сожалению не знаю откуда вы ее вызываете эту процедуру если из таблицы то номенклатуру передаете как
ИмяТаблицы.ТекущиеДанные.ИмяКолонки
Если это реквизит то просто имя реквизита, ну свой параметр это и есть имя вашего доп реквизита
И я нигде не писал про получить форму...
21. burni4 87 01.04.16 11:46 Сейчас в теме
(20) bmk74, круто) а теперь как и в какой процедуре обработать эти параметры?)
23. Xershi 1484 01.04.16 12:07 Сейчас в теме
(21) burni4, а зачем их обрабатывать? У вас вообще форма выбора, то для чего для выбора или она произвольно заполненная чем-то?
18. Xershi 1484 01.04.16 11:13 Сейчас в теме
(16) burni4,
ТвояФорма = ОткрытьФорму("ИмяФормы",Параметр,Владелец);
ТвояФорма.РеквизитФормы = НужноеЗначениеЭтогоРеквизита;
22. bmk74 234 01.04.16 11:59 Сейчас в теме
Справочник.Сырьё.ФормаВыбора
Я так понимаю вот в этой форме ФормаВыбора Справочника сырье В процедуре
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   Если ТипЗнч(Параметры) = Тип("Структура") И параметры.Свойство("СвойПараметр") Тогда
        //здесь можно создать динамически реквизит формы и записать в него переданный параметр ну или на самой форме
        // создать реквизит и записать в       него    переданный параметр 
        // например если реквизит создан то просто ИмяРеквизита = Параметры.СвойПараметр;
   КонецЕсли;
   //стандартный код....
КонецПроцедуры
Показать

Эх и почитайте что нить по УФ :) нормальное
gepar1020; burni4; +2 Ответить
24. burni4 87 01.04.16 12:28 Сейчас в теме
Все вроде разобрался, для особо одарённых как я вылаживаю что получилось в итоге)
Форма Источник (Документ из которого открывается форма выбора)

ПоступлениеНаименованиеНачалоВыбора - Наименование есть элемент табличной части.

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

Сырьё - соответственно то, что передаю из нашей выбранной строки тч.
МестоХранения - мой реквизит который я передаю в форму выбора.

Форма Приемник(Стандартаня форма выбора)

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Если Параметры.Свойство("МестоХранения") тогда
		МестоХранения=Параметры.МестоХранения;
	КонецЕсли;
	Если Параметры.Свойство("Сырьё") тогда
		НашеСырьё=Параметры.Сырьё;
		КонецЕсли;

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


&НаКлиенте
Процедура ПриОткрытии(Отказ)
	Элементы.Список.ТекущаяСтрока = НашеСырьё; // может и тупо, но этим я добился что бы в динамическом списке подсвечивалась та строчка того сырья, которое мы  выбрали на форме документа
КонецПроцедуры
Показать


Спасибо всем за помощь
userMKA; user1559729; mrChOP93; Lena272; simgo83; config; +6 Ответить
25. bmk74 234 01.04.16 12:31 Сейчас в теме
(24)
Встав те проверку
Если ТипЗнч(Параметры) = Тип("Структура")

Иначе если форма будет вызвана без параметров у вас ошибку выдаст я не зря вам это написал
26. burni4 87 01.04.16 12:38 Сейчас в теме
(25) bmk74, с этим не работает
Если ТипЗнч(Параметры) = Тип("Структура")

в отладчике ТипЗнч(Параметры) -ДанныеФормыСтруктура
а Тип("Структура") - Структура
29. spacecraft 01.04.16 12:47 Сейчас в теме
(26) burni4, все верно. Главное есть проверка:
Если Параметры.Свойство("МестоХранения") тогда
27. spacecraft 01.04.16 12:43 Сейчас в теме
(25) bmk74, Параметры это стандартный реквизит формы. Не надо его проверять. Он всегда есть.
28. burni4 87 01.04.16 12:46 Сейчас в теме
(27) spacecraft, тогда как это Если
ТипЗнч(Параметры) = Тип("Структура")
записать правильно? Заранее благодарен
30. spacecraft 01.04.16 12:47 Сейчас в теме
(28) burni4, советы не всегда бывают верные...
32. bmk74 234 01.04.16 13:37 Сейчас в теме
(30) Привычка, осталась, от обычных форм, там параметры могут быть неопределено
И да тип не "структура" а "ДанныеФормыСтруктура"
И таки да сейчас не обязательно проверять на тип...
31. Skromnyi 12 01.04.16 13:30 Сейчас в теме
(24) burni4, что-бы указать строку динамического списка, на которую будет установлен курсор после открытия формы, дополнительно передайте параметр "ТекущаяСтрока"
33. HomeInc 26.11.16 18:41 Сейчас в теме
&НаКлиенте
Процедура НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
МассивПараметров = Новый Массив;
МассивПараметров.Добавить(Новый ПараметрВыбора("НужныйПараметр", ЗначениеПараметра));
Элемент.ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметров);
КонецПроцедуры

А дальше в форме выбора ПриСозданииНаСервере лови Параметры.НужныйПараметр
sinops; per4ik; Evgeny.Bogomolnyy; Jeka44; KUAvanesov; simgo83; Stivens; user881571; Pr0glam3r; +9 Ответить
35. user881571 14.04.19 20:11 Сейчас в теме
(33) это гениально. спасибо!
34. Shishkibam 4 07.04.19 10:07 Сейчас в теме
36. harchenko_pavel 41 18.09.21 21:58 Сейчас в теме
Я делаю так:

Фрагмент кода из модуля формы в котором вызывается подчиненная форма
// ************************************************************************************
// Переносит выбранный день по календарю
// ************************************************************************************
&НаКлиенте
Procedure ПеренестиДень(Команда)
	
	// Переносим только рабочие дни
	If (ВыбраннаяСтрока().Тип = РабочийДень) ИЛИ  (ВыбраннаяСтрока().Тип = СокращённыйДень) Then
		Адрес = ПоместитьОформлениеКалендаряВоВременноеХранилище();  
		Форма = "ОбщаяФорма.ФормаВыборДатыИзКалендаря"; 
		CallBack  = New ОписаниеОповещения("ПослеВыбораДаты", ЭтотОбъект, Команда); 
		Реквизиты = New Структура("Год,Адрес,ВыбраннаяДата"); 
		Реквизиты.Год = Объект.Год; 
		Реквизиты.Адрес = Адрес;
		Реквизиты.ВыбраннаяДата = ВыбранныйДень;
		ОткрытьФорму(Форма, Реквизиты,,,,, CallBack, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
	Else
		ПредупреждениеАсинх("Переносить можно только рабочие дни!");
		Return;
	EndIf;
	
EndProcedure // ПеренестиДень() 
Показать


В подчиненной форме распаковываю параметры таким способом:
// ******************************************************************************
// ******************************************************************************
&НаСервере
Procedure ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	// ============================================================­==============  
	// Установка реквизитов формы из значений переданных как параметры формы
	For Each Реквизит In ЭтотОбъект.ПолучитьРеквизиты() Do
		If Параметры.Свойство(Реквизит.Имя) Then
			Execute(Реквизит.Имя + " = Параметры." + Реквизит.Имя); 
		EndIf;
	EndDo;
    // ============================================================­============== 
EndProcedure // ПриСозданииНаСервере()
Показать


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

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