Управляемое приложение.
На форме документа в табличной части я выбираю номенклатуру, и открывается стандартная форма выбора, из открывшей формы по кнопке мне нужно будет открыть ещё одному форму, при этом мне необходим реквизит находящийся в первой форме документа. Отключать стандартную обработку выбора не очень хочется. Вопрос, как передать параметр в стандартную форму выбора, прочитать его там и передать дальше?
---
Все вроде разобрался, для особо одарённых как я вылаживаю что получилось в итоге)
Форма Источник (Документ из которого открывается форма выбора)

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

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

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

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

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

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

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

Спасибо всем за помощь
---
burni4, для первой формы выбора создай форму выбора. Добавь реквизит который передаешь из первой формы и в процедуре при создании заполняй его

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

Можно конечно через параметры сеанса заморочится но это по моему не правильно
---
Tigreno, Логику я понимаю, мне интересно как программно из стандартной формы выбора обратиться к владельцу который её вызывает, просто в данном случаем
ЭтаФорма.Владелец он не видит
---
Можно еще через параметры формы.
---
для управляемой формы:
пришлось бы передавать значение через параметры формы при ее открытии/получении,
а в обработчике события ПриСозданииНаСервере() устанавливать соответствующий реквизит формы
по структуре переданных параметров.

Нашёл в этой теме http://forum.infostart.ru/forum26/topic103253/ , но как это программно реализовать?
---
burni4, может эта публикация поможет. У меня там по шагам расписано как передать параметры
---
burni4, зачем делать реквизит формы? Можно просто сделать параметр ключевым, тогда он будет доступен не только в ПриСозданииНаСервере() но и в других обработчиках. Ключевой параметр влияет на уникальность формы, но я думаю использование его таким способом не противоречит общей концепции. Или у реквизита есть какие-то преимущества перед ключевым параметром?
---
spe1c, Передается Реквизит МестоХранения, не думаю что он может быть уникальным, если честно то не совсем понимаю как работают параметры тк обучаюсь 1с самостоятельно и по мере необходимости, с ключевыми параметрами ещё не доводилось сталкиваться. Пример кода помог бы мне разобраться) но гугл не помогает
---
Статья хорошая, но хотелось бы знать ответ без этой

```1c
    СтандартнаяОбработка = Ложь;
```

строчки
---
Да ну очень мне интересно почему при стандартном вызовеформы Выбора не передается владелец
---
burni4, потому что его нужно назначать отдельно. Это не обязательный параметр!
---
Xershi, как это сделать не отменяя стандартную обработку?
---
burni4, никогда не задумывался. А какая вам разница программно вызвать или стандартно? Разницы же нет.
---
Xershi, я так понимаю если отменить её то нужно вручную и динамический список настраивать и выбор на форме выбора и прочие уже написанные мелочи.
---
burni4, стандартная обработка это просто параметр который отменяет стандартные действия при нажатии кнопки выбора. Т.е. вместо выбора можно открыть свою форму или другое действие выполнить или программно открыть форму с нужными параметрами!
---
Xershi, это я понимаю, но если не сложно можно пример кода, показывающий как открыть форму выбора просто передав туда 1 реквизит и не трогая ничего стандартного.
---
```1c
    ОткрытьФорму("ИмяФормы",Параметр,Владелец)
```

Где
Имя формы имя открываемой формы например "справочник.Номенклатура.Форма.ФормаВыбора"
 Параметры, структура с передаваемыми параметрами,
владелец - элемент формы для которого вызывается форма выбора.
В самой структуре передаете параметры нужные
 а вообще синтакс помошник в помощь.
---
bmk74,

```1c
    &НаКлиенте
    Процедура ПоступлениеНаименованиеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка=Ложь;

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

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

Где номенклатура выбранная номенклатура, я к сожалению не знаю откуда вы ее вызываете эту процедуру если из таблицы то номенклатуру передаете как
ИмяТаблицы.ТекущиеДанные.ИмяКолонки
Если это реквизит то просто имя реквизита, ну свой параметр это и есть имя вашего доп реквизита
И я нигде не писал про получить форму...
---
bmk74, круто) а теперь как и в какой процедуре обработать эти параметры?)
---
burni4, а зачем их обрабатывать? У вас вообще форма выбора, то для чего для выбора или она произвольно заполненная чем-то?
---
burni4,
```1c
    ТвояФорма = ОткрытьФорму("ИмяФормы",Параметр,Владелец);
    ТвояФорма.РеквизитФормы = НужноеЗначениеЭтогоРеквизита;
```
---
Справочник.Сырьё.ФормаВыбора
Я так понимаю вот в этой форме ФормаВыбора Справочника сырье В процедуре

```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если ТипЗнч(Параметры) = Тип("Структура") И параметры.Свойство("СвойПараметр") Тогда
    //здесь можно создать динамически реквизит формы и записать в него переданный параметр ну или на самой форме
    // создать реквизит и записать в него переданный параметр
    // например если реквизит создан то просто ИмяРеквизита = Параметры.СвойПараметр;
    КонецЕсли;
    //стандартный код....
    КонецПроцедуры
```

Эх и почитайте что нить по УФ :) нормальное
---
Все вроде разобрался, для особо одарённых как я вылаживаю что получилось в итоге)
Форма Источник (Документ из которого открывается форма выбора)

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

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

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

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

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

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

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

Спасибо всем за помощь
---
Встав те проверку

```1c
    Если ТипЗнч(Параметры) = Тип("Структура")
```

Иначе если форма будет вызвана без параметров у вас ошибку выдаст я не зря вам это написал
---
bmk74, с этим не работает

```1c
    Если ТипЗнч(Параметры) = Тип("Структура")
```

в отладчике ТипЗнч(Параметры) -ДанныеФормыСтруктура
а Тип("Структура") - Структура
---
burni4, все верно. Главное есть проверка:

```1c
    Если Параметры.Свойство("МестоХранения") тогда
```
---
bmk74, Параметры это стандартный реквизит формы. Не надо его проверять. Он всегда есть.
---
spacecraft, тогда как это Если
```1c
    ТипЗнч(Параметры) = Тип("Структура")
```
 записать правильно? Заранее благодарен
---
burni4, советы не всегда бывают верные...
---
Привычка, осталась, от обычных форм, там параметры могут быть неопределено
 И да тип не "структура" а "ДанныеФормыСтруктура"
И таки да сейчас не обязательно проверять на тип...
---
burni4, что-бы указать строку динамического списка, на которую будет установлен курсор после открытия формы, дополнительно передайте параметр "ТекущаяСтрока"
---
&НаКлиенте
Процедура НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
 МассивПараметров = Новый Массив;
 МассивПараметров.Добавить(Новый ПараметрВыбора("НужныйПараметр", ЗначениеПараметра));
 Элемент.ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметров);
КонецПроцедуры

А дальше в форме выбора ПриСозданииНаСервере лови Параметры.НужныйПараметр
---
это гениально. спасибо!
---
Можно здесь посмотреть https://infofront.su/1c-forma-peredacha-vozvrat-parametra/
---
Я делаю так:

Фрагмент кода из модуля формы в котором вызывается подчиненная форма

```1c
    // ************************************************************************************
    // Переносит выбранный день по календарю
    // ************************************************************************************
    &НаКлиенте
    Procedure ПеренестиДень(Команда)

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

    EndProcedure // ПеренестиДень()
```

В подчиненной форме распаковываю параметры таким способом:

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

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