Доступ к параметрам закрытия метода Закрыть() в процедуре ПередЗакрытием

1. Dima_ 148 22.09.17 06:34 Сейчас в теме
День добрый!
Помогите в решении задачи:
форма закрывается методом Закрыть(<ПараметрЗакрытия>) с параметрами
как можно получить доступ к этим параметрам после вызова метода?
Например в процедуре ПередЗакрытием или ПриЗакрытии.

Проблема в следующем:
в процедуре ПередЗакрытием проверяется определённое условие и если оно выполняется, тогда Отказ = Истина; и закрытие не происходит.
Затем если вызывается метод Закрыть() без параметров (по кнопке Esc или нажатию на крестик) в ОповещениеОткрытьФорму первоначальные параметры передаются.
Как их очистить в процедуре ПередЗакрытием?
+
По теме из базы знаний
Найденные решения
22. spacecraft 23.09.17 08:37 Сейчас в теме
(21)
Планировал сделать, что после ввода пользователем числа 123 поле очищается и окно ввода остаётся открытым.

Для это достаточно проверку делать в обработчике кнопки, а не в обработчике ПередЗакрытием. Тогда в последнем ничего городить не придется.
Dima_; +1
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. atomskxs 22.09.17 09:26 Сейчас в теме
Возможно, я что-то не понял.
Вот пример:
&НаКлиенте
Процедура ПодобратьДокументыЗаПериод(Команда)
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьПослеЗакрытияФормыПодбораЗаПериод", ЭтотОбъект);	
	ОткрытьФорму("ВнешняяОбработка.ВыгрузкаДокументов.Форма.ФормаВыбораЗаПериодУправляемая",, ЭтаФорма,,,, ОписаниеОповещения);
	
КонецПроцедуры

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

        бла-бла-бла
	
КонецПроцедуры

Показать

Соответственно, РезультатЗакрытия можно обработать как угодно.

В "дочерней" форме так:

&НаКлиенте
Процедура ОтобратьИЗакрыть(Команда)
	
	АдресРезультата = ПолучитьДанныеНаСервере();
	ЭтаФорма.Закрыть(АдресРезультата);
	
КонецПроцедуры


Соответственно, если в "дочерней" форме надо почистить АдресРезультата, то, к примеру, его можно сделать реквизитом формы и в ПередЗакрытием написать АдресРезультата = Неопределено;
aleksxx; starik-2005; +2
3. Dima_ 148 22.09.17 10:09 Сейчас в теме
(2)
Вызов окна:
&НаКлиенте
Процедура ВыполнитьВводЧисла()
	
	ОбработчикОповещения = Новый ОписаниеОповещения("ОповещениеОткрытьФормуВводаЧисла", ЭтотОбъект);
	ОткрытьФорму("Обработка.Форма.ФормаВводаЧисла", ПараметрыФормы,,,,, ОбработчикОповещения, Режим); 
	
КонецПроцедуры

Процедура ОповещениеОткрытьФормуВводаЧисла(РезультатОткрытияФормы, ДополнительныеПараметры) Экспорт
	Если НЕ РезультатОткрытияФормы = Неопределено Тогда
		...
	КонецЕсли;
КонецПроцедуры

Показать


Открывается окно ввода числа
пользователь вводит число в поле "ВводимоеЧисло" и нажимает кнопку ввод;
если это число = 123 тогда нужно отменить закрытие окна.

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


Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	Если ВводимоеЧисло = 123 Тогда
		ВводимоеЧисло = 0;
		Отказ = Истина;		
	КонецЕсли;
КонецПроцедуры
Показать


Если пользователь далее просто закрывает окно (Esc или "крестик", т.е. вызывается метод "Закрыть()" без параметров), в обработчик оповещения всё равно передаётся число 123, т.е.
РезультатОткрытияФормы.ВведенноеЧисло будет равено 123.
+
4. spacecraft 22.09.17 10:21 Сейчас в теме
(3) самый простой вариант в данном случае, это хранить СтруктураОтвета в реквизитах формы. И при Отмене очищать.
Но если нужен общий костыль, то вот вариант:
&НаКлиенте
Перем ЗакрыватьФорму;

&НаКлиенте
Процедура Команда1(Команда)
	ЗакрыватьФорму = Истина;
	Закрыть("Да");
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	Если Не ЗакрыватьФорму = Истина Тогда
		Отказ = Истина;
		ПодключитьОбработчикОжидания("ЗакрытьФорму", 0.1, Истина);
	Иначе
		Если Не ЗначениеЗаполнено(Объект.Продавец) Тогда
			Отказ = Истина;
			ЗакрыватьФорму = Ложь;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЗакрытьФорму() Экспорт
	ЗакрыватьФорму = Истина;
	Закрыть();
КонецПроцедуры
Показать


Просто очищать передаваемый реквизит не получится. Передача по значению, а не по ссылке.
+
9. Dima_ 148 22.09.17 11:03 Сейчас в теме
(4) за костыли спасибо всё получилось,

Интересно как без костылей сбросить параметры закрытия после отмены закрытия формы?
Для эксперимента сделал на форме две кнопки закрытия на одну назначил стандартную команду формы "Закрыть" а на вторую команду вызывающую процедуру с одной строкой "Закрыть()"
Первая параметры закрытия не сбрасывает, вторая сбрасывает.
Получается, что вызванная программно команда "Закрыть()" отличается от стандартной команды формы "Закрыть".
+
5. atomskxs 22.09.17 10:31 Сейчас в теме
(3)
У тебя очищается ВводимоеЧисло, а передается СтруктураОтвета.

Впрочем, сейчас посмотрю — мож там и впрямь какой момент интересный.

upd:

Ну да. Вот так вообще не закрывается при 123:
&НаКлиенте
Процедура КнопкаВвод()
    
    Закрыть(ВводимоеЧисло);
    
КонецПроцедуры


Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
    Если ВводимоеЧисло = 123 Тогда
        ВводимоеЧисло = 0;
        Отказ = Истина;        
    КонецЕсли;
КонецПроцедуры
Показать


Т.е. работает как надо. Хоть по крестику, хоть по кнопочке.
+
6. spacecraft 22.09.17 10:45 Сейчас в теме
(5) пользователь после этого набирает 111 и нажимает "крестик". Что передается?
+
7. atomskxs 22.09.17 10:47 Сейчас в теме
(6)
Пардон. Ты прав.
+
8. atomskxs 22.09.17 11:02 Сейчас в теме
(6) Не, беру пардон назад. Работает все.
Надо просыпаться :)
Прикрепленные файлы:
ВнешняяОбработка1.epf
+
14. Dima_ 148 22.09.17 11:24 Сейчас в теме
(8)
Если создавать новую структуру ответа и передавать, тогда не работает.
Поправил (как у меня в конфигурации), теперь при вводе 111 и закрытии крестиком возвращает 123.
Получается, что если это не параметр формы его очистить нельзя?
Прикрепленные файлы:
ВнешняяОбработка2.epf
+
15. spacecraft 22.09.17 11:31 Сейчас в теме
(14) я это еще в (4) озвучил.
Получается, что если это не параметр формы его очистить нельзя?

Есть такое понятие, как "Область видимости".
Смотрим код:
&НаКлиенте
Процедура КнопкаВвод()
    
    СтруктураОтвета = Новый Структура;
    СтруктураОтвета.Вставить("ВведенноеЧисло", ВводимоеЧисло);
    
    Закрыть(СтруктураОтвета)
    
КонецПроцедуры
Показать

СтруктураОтвета, которая передается в метод Закрыть, имеет область видимости только в методе КнопкаВвод(). При выходе из процедуры она становится недоступна.
+
16. Dima_ 148 22.09.17 11:40 Сейчас в теме
(15) тогда почему если затем вызвать команду "Закрыть()" программно, то всё работает как положено и СтруктураОтвета очищается.
А если стандартную команду формы "Закрыть" то СтруктураОтвета не очищается?
+
19. spacecraft 22.09.17 12:04 Сейчас в теме
(16)
тогда почему если затем вызвать команду "Закрыть()" программно, то всё работает как положено и СтруктураОтвета очищается.

Потому, что программно вызываете Закрыть(Неопределено). Это понятно?
При "стандартном закрытии" эта команда не вызывается.
+
21. Dima_ 148 23.09.17 05:38 Сейчас в теме
(19) Спасибо, теперь это понятно!
А стандартную команду "Закрыть" для окна можно переопределить?

(20) 1. Это расширение совместимое с 8.2 и заменить процедуру не получится.
2. Признаю, ошибочное утверждение.

Планировал сделать, что после ввода пользователем числа 123 поле очищается и окно ввода остаётся открытым.
Видимо придётся закрывать окно через костыль в (4) от Oleg Space (spacecraft).
+
22. spacecraft 23.09.17 08:37 Сейчас в теме
(21)
Планировал сделать, что после ввода пользователем числа 123 поле очищается и окно ввода остаётся открытым.

Для это достаточно проверку делать в обработчике кнопки, а не в обработчике ПередЗакрытием. Тогда в последнем ничего городить не придется.
Dima_; +1
23. Dima_ 148 25.09.17 06:22 Сейчас в теме
(22), точно, ведь команды формы переопределить можно, спасибо.
Вопрос закрыт.
+
17. atomskxs 22.09.17 11:44 Сейчас в теме
(15)
Он о другом. Процесс:
Форма —> ОткрытьФормуВвода
ФормаВвода —> Вводим 123 —> жмем крестик —> все отрабатывает. Окно не закрывается. —> вводим 111 —> жмем крестик —> окно закрывается —> параметра нет —> возвращается неопределено.

Форма —> ОткрытьФормуВвода
ФормаВвода —> Вводим 123 —> жмем ввести число и закрыть —> все отрабатывает. Окно не закрывается. —> вводим 111 —> жмем крестик —> окно закрывается —> параметр есть —> возвращается 123.


UPD:
С двойной проверкой работает, что понятно -__-

&НаКлиенте
Процедура ВвестиЧислоИЗакрыть(Команда)
	
	Если ВводимоеЧисло <> 123 Тогда
		Закрыть(ВводимоеЧисло);
	КонецЕсли;

КонецПроцедуры
Показать
Dima_; +1
18. Dima_ 148 22.09.17 11:59 Сейчас в теме
(17) Совершенно верно, получается, что параметры закрытия для обработчика оповещения сохраняются и если окно не закрыть, а потом закрывать не программно (по крестику), они не сбрасываются в "Неопределено", как будто продолжили прерванное закрытие с параметрами.
Вот я и спрашивал как сбросить запомненные параметры закрытия.
+
10. Dima_ 148 22.09.17 11:03 Сейчас в теме
11. atomskxs 22.09.17 11:04 Сейчас в теме
(10) Нифига не передается оО
Платформа 8.3.10.2299
По крестику срабатывает отказ и форма не закрывается.

Т.е. если просто так закрыть форму, то РезультатОткрытияФормы = Неопределено, если же ВводимоеЧисло = 123, то отказ = истина и все. Кирдык. Застряли в форме.
+
12. spacecraft 22.09.17 11:17 Сейчас в теме
(11)
По крестику срабатывает отказ и форма не закрывается.

еще раз: "пользователь после этого набирает 111 и нажимает "крестик". Что передается?"
+
13. atomskxs 22.09.17 11:24 Сейчас в теме
(12) Ты прав. Все. Пойду за кофе :)
+
20. Release 22.09.17 13:42 Сейчас в теме
А зачем вызывать метод Закрыть() и потом проверять нужно ли закрывать форму, вместо того, чтобы сразу проверить стоит ли вызывать указанный метод?

(3)
Esc или "крестик", т.е. вызывается метод "Закрыть()" без параметров

Откуда взялось такое утверждение?
+
Внимание! Тема сдана в архив

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