Имя: Пароль:
1C
1С v8
Как из формы док. открыть форму нового эл.спр. и после записи эл.спр. вернуть ссылку?
0 Birmingem
 
08.05.18
19:00
Такая задача.
Управляемые формы.
В форме документа "Акт приемки" пользователь нажимает кнопочку "Создать новый товар".
Открывается форма нового элемента справочника "Товары". Пользователь заполняет реквизиты справочника и нажимает "Записать и закрыть".
Теперь, этот записанный элемент справочника нужно подставить в соответствующий реквизит документа "Акт приемки".

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

Теперь вопрос. Как в процедуре ВыполнитьПослеЗаписиТовара() получить ссылку на созданный товар?
Или как передать туда ссылку на этот товар?

&НаКлиенте
Процедура ВыполнитьПослеЗаписиТовара(Результат, ДополнительныеПараметры) Экспорт
КонецПроцедуры

Весь инет перерыл, так и не нашел подобного примера.
1 Мимохожий Однако
 
08.05.18
21:03
Зачем это велосипед. При добавлении  в табличную часть Номенклатуры, есть стандартная кнопка создания нового элемента.
2 Birmingem
 
10.05.18
14:05
(1)После создания и выбора элемента, еще надо кое-какие расчеты произвести.

Так как получить ссылку на только-что интерактивно созданный элемент справочника?
3 DrShad
 
10.05.18
14:07
через оповещения
4 Defender aka LINN
 
10.05.18
14:24
(0) ВыполнитьПослеЗаписиТовара(*Результат*, ДополнительныеПараметры)
5 Birmingem
 
10.05.18
14:24
(3)Делал так.
В форме справочника в процедуре ПриЗакрытии():
Оповестить("СоздалиИВыбралиТовар",Объект.Ссылка);

А в модуле формы документа:
Процедура ОбработкаОповещения(Событие,Параметр,Источник)
    Если Событие = "СоздалиИВыбралиТовар" Тогда
        ТекСтрока=Элементы.Товары.ТекущиеДанные;
        ТекСтрока.Товар=Параметр;
    Конецесли;
КонецПроцедуры

Правильно?
Но процедура ОбработкаОповещения() не запускается.
С оповещениями вообще еще не работал.
Может еще где-то чего-то надо прописать?
6 Birmingem
 
10.05.18
14:26
(4) Результат = Неопределено
7 singlych
 
10.05.18
14:34
В ПараметрыНовогоТовара вставляешь "РежимВыбора" Истина, в ОтрытьФорму в параметре Владелец указываешь элемент формы, в который должен прилетать товар. Ссылка сама прилетит, если что-то еще нужно, есть ОбработкаВыбора или там ПриИзменении.
8 Defender aka LINN
 
10.05.18
15:15
(6) Ну а кто тебе виноват? Сделай, чтобы была ссылка
9 Birmingem
 
11.05.18
14:45
(7)Сделал:
ПараметрыНовогоТовара.Вставить("РежимВыбора",Истина);
ОткрытьФорму("Справочник.Товары.ФормаОбъекта",ПараметрыНовогоТовара, Элементы.Товары.ТекущиеДанные.Товар, ЭтаФорма.УникальныйИдентификатор,,,ПослеЗаписиТовара);


После этого в текущей строке в реквизите Товар должна появиться ссылка на созданный товар?
Не появляется.
Проверяю в процедуре ПриЗакрытии() в форме справочника, там ЭтаФорма.ВладелецФормы = Неопределено

Что не так?
10 Birmingem
 
11.05.18
14:54
Если же в ОткрытьФорму() в качестве владельца передаю ЭтаФорма, то в форме товара в ПриЗакрытии() ВладелецФормы определяется как форма вызывающего документа.
Но ссылка на созданный товар не передается в форму владельца.
11 Cyberhawk
 
11.05.18
14:55
Результат закрытия формы будет в обработке оповещения метода ОткрытьФорму
12 Birmingem
 
11.05.18
14:55
(8)Подскажи, как сделать чтобы было "Результат = Ссылка на созданный товар"?
13 Birmingem
 
11.05.18
14:56
(11) Так в том то и дело, что Результат=Неопределено
14 DrWatson
 
11.05.18
16:06
(9) По справке владельцем формы может быть либо форма, либо элемент формы. У тебя это ссылка - совсем не то что нужно.

С табличной частью есть тонкость - она должна быть в режиме редактирования. Когда пользователь жмет кнопку, то это явно не так. Программно можно зайти в режим редактирования с помощью:
Элементы.Товары.ИзменитьСтроку();

(2) должен быть вполне рабочим вариантом, не понимаю почему он тебе не подходит.

(12) Если не подходит через элемент формы, а нужно прям обязательно через Результат. То общая идея заключается в том, что в форме справочника нужно делать Закрыть(Объект.Ссылка). Скорее всего, лучше сделать свою кнопку записи, программно записывать и закрывать форму, возвращая указанным образом ссылку.
15 singlych
 
11.05.18
16:18
(9) Владельцем надо элемент формы передавать, а не данные.
Но если у тебя ТЧ, то я хз как сделать красиво. Почему-то колонка ТЧ не канает в качестве владельца. Но можно передать саму ТЧ
ОткрытьФорму("Справочник.Товары.ФормаОбъекта",ПараметрыНовогоТовара, Элементы.Товары, ....

А потом в ТоварыОбработкаВыбора пихнуть ВыбранноеЗначение в текущую строку.
16 DrWatson
 
11.05.18
16:21
(15) Да, нет, канает. Я же говорю только должен быть режим редактирования.
17 singlych
 
11.05.18
16:25
(16) Действительно, прикольно.
18 Birmingem
 
11.05.18
17:10
(14)Спасибо!
Еще несколько раз прочитал синтаксис метода ОткрытьФорму().
Оказывается, вызываемую форму надо закрывать принудительно-программно, методом Закрыть(), и в параметре этого метода передавать ссылку.

Сделал так:

Процедура ПослеЗаписи(ПараметрыЗаписи)
    Если ТипЗнч(ЭтаФорма.ВладелецФормы) = Тип("УправляемаяФорма") Тогда
        Если ЭтаФорма.ВладелецФормы.ИмяФормы = "Документ.АктПриемки.Форма.ФормаДокумента" Тогда
            Закрыть(Объект.Ссылка);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

И вот тогда в моей процедуре ВыполнитьПослеЗаписиТовара() в параметре Результат появляется ссылка на этот записанный элемент справочника.
19 Cyberhawk
 
11.05.18
17:51
(13) Так не сам по себе же. Ты его передаешь в параметре метода "Закрыть()"
20 Fragster
 
гуру
11.05.18
17:52
В параметрах передать РежимВыбора Истина и владелец - тот элемент управления, куда надо вернуть значение
21 Fragster
 
гуру
11.05.18
17:53
а в открываемой форме нового ничего не надо
22 Birmingem
 
11.05.18
18:55
(19)Аха... Только я очень нескоро понял, что Закрыть() надо именно писать, а при интерактивном закрытии ничего не передается.
(20)Позже, для интереса, еще попытаюсь этот метод попробовать. С учетом замечаний в (14)
Программист всегда исправляет последнюю ошибку.