Передать данные форме-владельцу при закрытии не модальной формы

1. robix 13.06.20 16:58 Сейчас в теме
Здравствуйте. Имеется форма, которая открывается не модально
(модально ее открыть нельзя, так как в ней происходит открытие excel-файла. А в модальном режиме окно выбора файлы перекрывается.
Если кто знает как обойти такое поведение модального окна 1С, то это тоже было бы решением проблемы.)

А в текущем способе (не модальном) , нужно при закрытии данной формы передать форме из которой она открывалась - табличную часть.

Пробовал через оповещение.Но проблема в том, если после: оповестить() сразу идет: форма.закрыть(), то оповещение не состоится :)

Что посоветуете, как в такой ситуации передать данные форме-владельцу ?
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. independ 1520 14.06.20 06:51 Сейчас в теме
(1) В форме владелец создать нужный реквизит, и передать из второй формы,
ВладелецФормы.Реквизит=РеквизитИзВторойФормы;
Закрыть();

и если нужно его обработать то в модуле формы создать нужную процедуру с признаком ЭКСПОРТ и запустить перед закрытием второй формы
ВладелецФормы.ОбработатьРеквизит();

Если используется табличная часть
Для каждого стр из ТЧ Цикла
       ЗаполнитьЗначенияСвойств(ВладелецФормы.ТЧ.Добавить(),стр);
КонецЦикла;
sandr13; Мах; Romario_; userMKA; Matveev_VS; +5 1 Ответить
21. Luis-Gomer 52 10.04.24 11:43 Сейчас в теме
(1) В дочерней форме - ОповеститьОВыборе(Данные)

В родительской - в опписание оповещения после закрытия обрабатывать этот результат.
2. Alfn 59 13.06.20 17:59 Сейчас в теме
При открытии формы определить ОповещениеОЗакрытии,
Во второй форме в ПередЗакрытием отказ в истину и вызвать Закрыть(ТабличнаяЧасть)!
и обработать полученный результат
Istur; advanter; DFV_trade; andy_zhav; +4 Ответить
3. robix 13.06.20 23:40 Сейчас в теме
(2)
в ПередЗакрытием отказ в истину и вызвать Закрыть(ТабличнаяЧасть)!


И форма никогда не закроется :) Можете сами попробовать.


Но за идею спасибо. В моем случае я вторую форму закрываю по определенной кнопке, которая несет как раз смысл передачи тч. Поэтому в Отказ в ПередЗакрытием мне не нужен.
user756416; +1 Ответить
5. Alfn 59 14.06.20 07:37 Сейчас в теме
(3)
И форма никогда не закроется :) Можете сами попробовать.


Вот так можно сделать

&НаКлиенте
Перем ЗакрытьФорму;

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) 
	Отказ = Не ЗавершениеРаботы И ЗакрытьФорму <> Истина;
	ЗакрытьФорму = Истина;
	Закрыть(Объект.ТабличнаяЧасть);
КонецПроцедуры
Показать
user1798793; Istur; kabantus; +3 Ответить
8. andy_zhav 197 15.06.20 10:06 Сейчас в теме
(2) Все так за исключением отказ = истина
6. Alfn 59 14.06.20 07:43 Сейчас в теме
(модально ее открыть нельзя, так как в ней происходит открытие excel-файла. А в модальном режиме окно выбора файлы перекрывается.
Если кто знает как обойти такое поведение модального окна 1С, то это тоже было бы решением проблемы.)


эту проблему можно попробовать через ОбработчикОжидания решить.

На форму реквизит (Булево).
В ПриОткрытии проверять его и если Истина, то запускать обработчик.

пример:

&НаКлиенте
Процедура ПриОткрытии(Отказ) 
	Если ВыбратьФайл Тогда
		ПодключитьОбработчикОжидания("ОткрытьВыборФайла", 0.1, Истина);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьВыборФайла() 
        тут обработка...
КонецПроцедуры
Показать
7. andy_zhav 197 15.06.20 10:00 Сейчас в теме
1. В том месте где открываем форму нужно добавить описание оповещения закрытия формы и его обработчик
&НаКлиенте
Процедура ОткрытьНеМодальнуюФорму(Команда)
	ОткрытьФорму("ОбщаяФорма.НемодальнаяФорма",,ЭтаФорма,,,,Новый ОписаниеОповещения("ПослеЗакрытияФормы",ЭтаФорма),РежимОткрытияОкнаФормы.Независимый);
КонецПроцедуры

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


Если нужно чтобы окно выглядело как модальное, но при этом было фактически не модальным - можно поиграться с режимом открытия формы: РежимОткрытияОкнаФормы.БлокироватьОкноВладельца или РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс

2. В форме откуда надо передать параметр в процедуру, которая закрывает форму:
&НаКлиенте
Процедура ЗакрытьФормуСПараметромЗакрытия(Команда)
    Закрыть("Параметр закрытия, передаваемый в родительскую форму");
КонецПроцедуры


Параметр команды закрыть - произвольный
sandr13; user875116; sajmon45; user1798793; SLukin; DENSKR; goliath-itd; Sashares; +8 1 Ответить
20. user875116 10.04.24 10:06 Сейчас в теме
(2) спасибо, помог, грамотно и по делу!
9. Xershi 1486 08.04.21 14:25 Сейчас в теме
	
	ПараметрыЗакрытия = Новый Структура;
	ПараметрыЗакрытия.Вставить("Адрес", "Тест");
	
	ОповеститьОВыборе(ПараметрыЗакрытия);

Передаем на клиенте результат, форма сама закроется.
Далее в форме владельце обрабатываем результат:
&НаКлиенте
Процедура ОбработкаВыбора

Не забываем инициализировать через свойства формы.
GennadiyN; +1 Ответить
10. Alex_under 22.04.21 15:24 Сейчас в теме
У формы есть параметр ОписаниеОповещенияОЗакрытии при его использовании можно без лишних костылей закидывать любые значения. А дальше уже проверять их и использовать.

Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияЗачисления", ЭтотОбъект, Новый Структура("Зачисление, СуммаОплаты", Неопределено, 0));
			ОткрытьФорму("Документ.ЗачислениеЭкварнига.Форма.ФормаДокумента",Новый Структура("ЗначенияЗаполнения", СтруктураЗаполнения)
				,,,,,Оповещение,РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);	


&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
	Если ЭтаФорма.ОписаниеОповещенияОЗакрытии <> Неопределено
		И ЭтаФорма.ОписаниеОповещенияОЗакрытии.ДополнительныеПараметры.Свойство("Зачисление") Тогда
		ЭтаФорма.ОписаниеОповещенияОЗакрытии.ДополнительныеПараметры.Зачисление = Объект.Ссылка;
		ЭтаФорма.ОписаниеОповещенияОЗакрытии.ДополнительныеПараметры.СуммаОплаты = Объект.СуммаДокумента;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗакрытияЗачисления(Результат, Параметры) Экспорт
	ЗаполнитьЗначенияСвойств(Элементы.ТаблицаЭкваринга.ТекущиеДанные, Параметры);
КонецПроцедуры
Показать
araatt; Istur; PuhFromUfa; KoC_one; Kazaams; OlgaOnuchina; Disly; SuperSpade; additech; hasp_x; Kyrandian; WiseSnake; marilyn0719; Whit3bear; jaroslav.h; AnddnA; emorozova; TSSV; +18 Ответить
11. kassbar 158 22.06.21 13:33 Сейчас в теме
в форме-владельце добавить экспортную процедуру.
при закрытии подчиненной формы вызвать эту процедуру через ВладелецФормы<ИмяЭкспортнойПроцедуры>, передав нужный параметр.
MonteCriZto; +1 1 Ответить
12. FatPanzer 22.06.21 13:59 Сейчас в теме
(11) А если это общая форма и вызывается из 38 различных мест?
13. kassbar 158 22.06.21 14:45 Сейчас в теме
(12) тогда очевидно что этот способ не подходит, не так ли ?
14. FatPanzer 22.06.21 14:48 Сейчас в теме
(13) Я этого не говорил. Но это абсолютно неоптимальный способ, он не соответствует принципу DRY
15. kassbar 158 22.06.21 15:01 Сейчас в теме
(14) предложите свой абсолютно оптимальный способ, соответствующий принципу DRY
16. FatPanzer 22.06.21 15:04 Сейчас в теме
(15) Оповещение с обработчиком в общем клиентском модуле.
17. kassbar 158 22.06.21 15:07 Сейчас в теме
(16) и ссылочку на ИТС пожалуйста, где сказано что это является абсолютно оптимальным способом, соответствующий принципу DRY
18. FatPanzer 22.06.21 15:11 Сейчас в теме
19. ЕСТЬNULL 206 08.02.22 04:21 Сейчас в теме
Гуглил свой вопрос, нашёл ветку. Неважно, что старая, напишу, как решил для себя.

Так же мыслил, первый параметр обработки о закрытии не возвращал информации о том, менял ли кто там чего или нет (обновлять мне список или что мне делать то на форме владельце). Короче, оповещениеоЗакрытии само по себе мне ничего не даёт, и по большому счету мне надо реагировать не на факт закрытия, а на факт записи на форме. И он для этого вообще не подходит. (возможно у ТС другие обстоятельства).

https://its.1c.ru/db/pubv8devui#content:230:1
Есть метод Оповестить(Событие) и событие формы ОбработкаОповещения(ИмяСобытия, Параметр, Источник)

В моём случае мне надо было обрабатывать событие записи с двух разных форм, одна "заводская" (из серийного решения) и вторая моя, которую я рисовал лет 8 назад. В заводской, естественно, форма уже вовсю оповещала о факте записи, в отличие от моей. То есть формы объектов сами по себе должны докладывать всем формам через стандартные механизмы факт изменения объектов на самой себе. Делать формы элементов (и записей) без этого механизма - моветон, так как иначе вы никак не уведомите другие формы об изменении чего-то на себе, а никакая другая форма, кроме как на которой происходят события, об этих изменениях не знает. (Если вы в каждой, которая должна оповещать, чего-то не предусмотрели).

Стандартно и просто.
Аллилуя 1С
fatman78; +1 Ответить
Оставьте свое сообщение

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