Управляемое приложение.
На форме документа в табличной части я выбираю номенклатуру, и открывается стандартная форма выбора, из открывшей формы по кнопке мне нужно будет открыть ещё одному форму, при этом мне необходим реквизит находящийся в первой форме документа. Отключать стандартную обработку выбора не очень хочется. Вопрос, как передать параметр в стандартную форму выбора, прочитать его там и передать дальше?
Сырьё - соответственно то, что передаю из нашей выбранной строки тч.
МестоХранения - мой реквизит который я передаю в форму выбора.
Форма Приемник(Стандартаня форма выбора)
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("МестоХранения") тогда
МестоХранения=Параметры.МестоХранения;
КонецЕсли;
Если Параметры.Свойство("Сырьё") тогда
НашеСырьё=Параметры.Сырьё;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Элементы.Список.ТекущаяСтрока = НашеСырьё; // может и тупо, но этим я добился что бы в динамическом списке подсвечивалась та строчка того сырья, которое мы выбрали на форме документа
КонецПроцедуры
(2) Tigreno, Логику я понимаю, мне интересно как программно из стандартной формы выбора обратиться к владельцу который её вызывает, просто в данном случаем
ЭтаФорма.Владелец он не видит
для управляемой формы:
пришлось бы передавать значение через параметры формы при ее открытии/получении,
а в обработчике события ПриСозданииНаСервере() устанавливать соответствующий реквизит формы
по структуре переданных параметров.
(5) burni4, зачем делать реквизит формы? Можно просто сделать параметр ключевым, тогда он будет доступен не только в ПриСозданииНаСервере() но и в других обработчиках. Ключевой параметр влияет на уникальность формы, но я думаю использование его таким способом не противоречит общей концепции. Или у реквизита есть какие-то преимущества перед ключевым параметром?
(7) spe1c, Передается Реквизит МестоХранения, не думаю что он может быть уникальным, если честно то не совсем понимаю как работают параметры тк обучаюсь 1с самостоятельно и по мере необходимости, с ключевыми параметрами ещё не доводилось сталкиваться. Пример кода помог бы мне разобраться) но гугл не помогает
(14) burni4, стандартная обработка это просто параметр который отменяет стандартные действия при нажатии кнопки выбора. Т.е. вместо выбора можно открыть свою форму или другое действие выполнить или программно открыть форму с нужными параметрами!
(15) Xershi, это я понимаю, но если не сложно можно пример кода, показывающий как открыть форму выбора просто передав туда 1 реквизит и не трогая ничего стандартного.
Где
Имя формы имя открываемой формы например "справочник.Номенклатура.Форма.ФормаВыбора"
Параметры, структура с передаваемыми параметрами,
владелец - элемент формы для которого вызывается форма выбора.
В самой структуре передаете параметры нужные
а вообще синтакс помошник в помощь.
Где номенклатура выбранная номенклатура, я к сожалению не знаю откуда вы ее вызываете эту процедуру если из таблицы то номенклатуру передаете как
ИмяТаблицы.ТекущиеДанные.ИмяКолонки
Если это реквизит то просто имя реквизита, ну свой параметр это и есть имя вашего доп реквизита
И я нигде не писал про получить форму...
Справочник.Сырьё.ФормаВыбора
Я так понимаю вот в этой форме ФормаВыбора Справочника сырье В процедуре
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если ТипЗнч(Параметры) = Тип("Структура") И параметры.Свойство("СвойПараметр") Тогда
//здесь можно создать динамически реквизит формы и записать в него переданный параметр ну или на самой форме
// создать реквизит и записать в него переданный параметр
// например если реквизит создан то просто ИмяРеквизита = Параметры.СвойПараметр;
КонецЕсли;
//стандартный код....
КонецПроцедуры
Сырьё - соответственно то, что передаю из нашей выбранной строки тч.
МестоХранения - мой реквизит который я передаю в форму выбора.
Форма Приемник(Стандартаня форма выбора)
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("МестоХранения") тогда
МестоХранения=Параметры.МестоХранения;
КонецЕсли;
Если Параметры.Свойство("Сырьё") тогда
НашеСырьё=Параметры.Сырьё;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Элементы.Список.ТекущаяСтрока = НашеСырьё; // может и тупо, но этим я добился что бы в динамическом списке подсвечивалась та строчка того сырья, которое мы выбрали на форме документа
КонецПроцедуры
(30) Привычка, осталась, от обычных форм, там параметры могут быть неопределено
И да тип не "структура" а "ДанныеФормыСтруктура"
И таки да сейчас не обязательно проверять на тип...
(24) burni4, что-бы указать строку динамического списка, на которую будет установлен курсор после открытия формы, дополнительно передайте параметр "ТекущаяСтрока"
36.
harchenko_pavel
4118.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 // ПриСозданииНаСервере()
Показать
Плюс такого подхода в том, что код копируется из формы в форму без изменений, нет необходимости кастомизации кода в каждой форме. Единственное, что вам нужно сделать кроме копирования его в процедуру ПриСозданииНаСервере, это повесить на подчиненную форму реквизиты с нужным именем и соответствующим типом.