Здравствуйте. Имеется форма, которая открывается не модально
(модально ее открыть нельзя, так как в ней происходит открытие excel-файла. А в модальном режиме окно выбора файлы перекрывается.
Если кто знает как обойти такое поведение модального окна 1С, то это тоже было бы решением проблемы.)
А в текущем способе (не модальном) , нужно при закрытии данной формы передать форме из которой она открывалась - табличную часть.
Пробовал через оповещение.Но проблема в том, если после: оповестить() сразу идет: форма.закрыть(), то оповещение не состоится :)
Что посоветуете, как в такой ситуации передать данные форме-владельцу ?
При открытии формы определить ОповещениеОЗакрытии,
Во второй форме в ПередЗакрытием отказ в истину и вызвать Закрыть(ТабличнаяЧасть)!
и обработать полученный результат
в ПередЗакрытием отказ в истину и вызвать Закрыть(ТабличнаяЧасть)!
И форма никогда не закроется :) Можете сами попробовать.
Но за идею спасибо. В моем случае я вторую форму закрываю по определенной кнопке, которая несет как раз смысл передачи тч. Поэтому в Отказ в ПередЗакрытием мне не нужен.
(модально ее открыть нельзя, так как в ней происходит открытие excel-файла. А в модальном режиме окно выбора файлы перекрывается.
Если кто знает как обойти такое поведение модального окна 1С, то это тоже было бы решением проблемы.)
эту проблему можно попробовать через ОбработчикОжидания решить.
На форму реквизит (Булево).
В ПриОткрытии проверять его и если Истина, то запускать обработчик.
пример:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если ВыбратьФайл Тогда
ПодключитьОбработчикОжидания("ОткрытьВыборФайла", 0.1, Истина);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьВыборФайла()
тут обработка...
КонецПроцедуры
1. В том месте где открываем форму нужно добавить описание оповещения закрытия формы и его обработчик
&НаКлиенте
Процедура ОткрытьНеМодальнуюФорму(Команда)
ОткрытьФорму("ОбщаяФорма.НемодальнаяФорма",,ЭтаФорма,,,,Новый ОписаниеОповещения("ПослеЗакрытияФормы",ЭтаФорма),РежимОткрытияОкнаФормы.Независимый);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗакрытияФормы(ПараметрЗакрытия, ДополнительныеПараметры) Экспорт
Если ПараметрЗакрытия = Неопределено Тогда
Возврат;
ИначеЕсли ТипЗнч(ПараметрЗакрытия) = Тип("Строка") Тогда
Сообщить("Параметр из немодальной формы: " + ПараметрЗакрытия);
Иначе
Сообщить("Получен произвольный параметр");
КонецЕсли;
КонецПроцедуры
Показать
Если нужно чтобы окно выглядело как модальное, но при этом было фактически не модальным - можно поиграться с режимом открытия формы: РежимОткрытияОкнаФормы.БлокироватьОкноВладельца или РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс
2. В форме откуда надо передать параметр в процедуру, которая закрывает форму:
&НаКлиенте
Процедура ЗакрытьФормуСПараметромЗакрытия(Команда)
Закрыть("Параметр закрытия, передаваемый в родительскую форму");
КонецПроцедуры
У формы есть параметр ОписаниеОповещенияОЗакрытии при его использовании можно без лишних костылей закидывать любые значения. А дальше уже проверять их и использовать.
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияЗачисления", ЭтотОбъект, Новый Структура("Зачисление, СуммаОплаты", Неопределено, 0));
ОткрытьФорму("Документ.ЗачислениеЭкварнига.Форма.ФормаДокумента",Новый Структура("ЗначенияЗаполнения", СтруктураЗаполнения)
,,,,,Оповещение,РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
Если ЭтаФорма.ОписаниеОповещенияОЗакрытии <> Неопределено
И ЭтаФорма.ОписаниеОповещенияОЗакрытии.ДополнительныеПараметры.Свойство("Зачисление") Тогда
ЭтаФорма.ОписаниеОповещенияОЗакрытии.ДополнительныеПараметры.Зачисление = Объект.Ссылка;
ЭтаФорма.ОписаниеОповещенияОЗакрытии.ДополнительныеПараметры.СуммаОплаты = Объект.СуммаДокумента;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗакрытияЗачисления(Результат, Параметры) Экспорт
ЗаполнитьЗначенияСвойств(Элементы.ТаблицаЭкваринга.ТекущиеДанные, Параметры);
КонецПроцедуры
в форме-владельце добавить экспортную процедуру.
при закрытии подчиненной формы вызвать эту процедуру через ВладелецФормы<ИмяЭкспортнойПроцедуры>, передав нужный параметр.
Гуглил свой вопрос, нашёл ветку. Неважно, что старая, напишу, как решил для себя.
Так же мыслил, первый параметр обработки о закрытии не возвращал информации о том, менял ли кто там чего или нет (обновлять мне список или что мне делать то на форме владельце). Короче, оповещениеоЗакрытии само по себе мне ничего не даёт, и по большому счету мне надо реагировать не на факт закрытия, а на факт записи на форме. И он для этого вообще не подходит. (возможно у ТС другие обстоятельства).
В моём случае мне надо было обрабатывать событие записи с двух разных форм, одна "заводская" (из серийного решения) и вторая моя, которую я рисовал лет 8 назад. В заводской, естественно, форма уже вовсю оповещала о факте записи, в отличие от моей. То есть формы объектов сами по себе должны докладывать всем формам через стандартные механизмы факт изменения объектов на самой себе. Делать формы элементов (и записей) без этого механизма - моветон, так как иначе вы никак не уведомите другие формы об изменении чего-то на себе, а никакая другая форма, кроме как на которой происходят события, об этих изменениях не знает. (Если вы в каждой, которая должна оповещать, чего-то не предусмотрели).