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

Проблема в следующем:
в процедуре ПередЗакрытием проверяется определённое условие и если оно выполняется, тогда Отказ = Истина; и закрытие не происходит.
Затем если вызывается метод Закрыть() без параметров (по кнопке Esc или нажатию на крестик) в ОповещениеОткрытьФорму первоначальные параметры передаются.
Как их очистить в процедуре ПередЗакрытием?
---
Планировал сделать, что после ввода пользователем числа 123 поле очищается и окно ввода остаётся открытым.
Для это достаточно проверку делать в обработчике кнопки, а не в обработчике ПередЗакрытием. Тогда в последнем ничего городить не придется.
---
Возможно, я что-то не понял.
Вот пример:
```1c
    &НаКлиенте
    Процедура ПодобратьДокументыЗаПериод(Команда)

    ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьПослеЗакрытияФормыПодбораЗаПериод", ЭтотОбъект);
    ОткрытьФорму("ВнешняяОбработка.ВыгрузкаДокументов.Форма.ФормаВыбораЗаПериодУправляемая",, ЭтаФорма,,,, ОписаниеОповещения);

    КонецПроцедуры

    &НаСервере
    Процедура ВыполнитьПослеЗакрытияФормыПодбораЗаПериод(РезультатЗакрытия, ПараметрыОповещения)

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

    бла-бла-бла

    КонецПроцедуры
```

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

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

```1c
    &НаКлиенте
    Процедура ОтобратьИЗакрыть(Команда)

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

    КонецПроцедуры
```

Соответственно, если в "дочерней" форме надо почистить АдресРезультата, то, к примеру, его можно сделать реквизитом формы и в ПередЗакрытием написать АдресРезультата = Неопределено;
---
Вызов окна:

```1c
    &НаКлиенте
    Процедура ВыполнитьВводЧисла()

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

    КонецПроцедуры

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

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

модуль формы ФормаВводаЧисла

```1c
    &НаКлиенте
    Процедура КнопкаВвод()

    СтруктураОтвета = Новый Структура;
    СтруктураОтвета.Вставить("ВведенноеЧисло", ВводимоеЧисло);

    Закрыть(СтруктураОтвета)

    КонецПроцедуры

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

Если пользователь далее просто закрывает окно (Esc или "крестик", т.е. вызывается метод "Закрыть()" без параметров), в обработчик оповещения всё равно передаётся число 123, т.е.
РезультатОткрытияФормы.ВведенноеЧисло будет равено 123.
---
самый простой вариант в данном случае, это хранить СтруктураОтвета в реквизитах формы. И при Отмене очищать.
Но если нужен общий костыль, то вот вариант:

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

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

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

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

Просто очищать передаваемый реквизит не получится. Передача по значению, а не по ссылке.
---
за костыли спасибо всё получилось,

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

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

upd:

Ну да. Вот так вообще не закрывается при 123:

```1c
    &НаКлиенте
    Процедура КнопкаВвод()

    Закрыть(ВводимоеЧисло);

    КонецПроцедуры

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

Т.е. работает как надо. Хоть по крестику, хоть по кнопочке.
---
пользователь после этого набирает 111 и нажимает "крестик". Что передается?
---
Пардон. Ты прав.
---
Не, беру пардон назад. Работает все.
Надо просыпаться :)
---
Если создавать новую структуру ответа и передавать, тогда не работает.
Поправил (как у меня в конфигурации), теперь при вводе 111 и закрытии крестиком возвращает 123.
Получается, что если это не параметр формы его очистить нельзя?
---
я это еще в (4) озвучил.
Получается, что если это не параметр формы его очистить нельзя?
Есть такое понятие, как "Область видимости".
Смотрим код:

```1c
    &НаКлиенте
    Процедура КнопкаВвод()

    СтруктураОтвета = Новый Структура;
    СтруктураОтвета.Вставить("ВведенноеЧисло", ВводимоеЧисло);

    Закрыть(СтруктураОтвета)

    КонецПроцедуры
```

СтруктураОтвета, которая передается в метод Закрыть, имеет область видимости только в методе КнопкаВвод(). При выходе из процедуры она становится недоступна.
---
тогда почему если затем вызвать команду "Закрыть()" программно, то всё работает как положено и СтруктураОтвета очищается.
А если стандартную команду формы "Закрыть" то СтруктураОтвета не очищается?
---
тогда почему если затем вызвать команду "Закрыть()" программно, то всё работает как положено и СтруктураОтвета очищается.
Потому, что программно вызываете Закрыть(Неопределено). Это понятно?
При "стандартном закрытии" эта команда не вызывается.
---
Спасибо, теперь это понятно!
А стандартную команду "Закрыть" для окна можно переопределить?

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

Планировал сделать, что после ввода пользователем числа 123 поле очищается и окно ввода остаётся открытым.
Видимо придётся закрывать окно через костыль в (4) от Oleg Space (spacecraft).
---
Планировал сделать, что после ввода пользователем числа 123 поле очищается и окно ввода остаётся открытым.
Для это достаточно проверку делать в обработчике кнопки, а не в обработчике ПередЗакрытием. Тогда в последнем ничего городить не придется.
---
, точно, ведь команды формы переопределить можно, спасибо.
Вопрос закрыт.
---
Он о другом. Процесс:
Форма —> ОткрытьФормуВвода
ФормаВвода —> Вводим 123 —> жмем крестик —> все отрабатывает. Окно не закрывается. —> вводим 111 —> жмем крестик —> окно закрывается —> параметра нет —> возвращается неопределено.

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

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

```1c
    &НаКлиенте
    Процедура ВвестиЧислоИЗакрыть(Команда)

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

    КонецПроцедуры
```
---
Совершенно верно, получается, что параметры закрытия для обработчика оповещения сохраняются и если окно не закрыть, а потом закрывать не программно (по крестику), они не сбрасываются в "Неопределено", как будто продолжили прерванное закрытие с параметрами.
Вот я и спрашивал как сбросить запомненные параметры закрытия.
---
Передаётся 123
---
Нифига не передается оО
Платформа 8.3.10.2299
По крестику срабатывает отказ и форма не закрывается.

Т.е. если просто так закрыть форму, то РезультатОткрытияФормы = Неопределено, если же ВводимоеЧисло = 123, то отказ = истина и все. Кирдык. Застряли в форме.
---
По крестику срабатывает отказ и форма не закрывается.
еще раз: "пользователь после этого набирает 111 и нажимает "крестик". Что передается?"
---
Ты прав. Все. Пойду за кофе :)
---
А зачем вызывать метод Закрыть() и потом проверять нужно ли закрывать форму, вместо того, чтобы сразу проверить стоит ли вызывать указанный метод?

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