Здравия всем!
Такой вопрос. Может баян, но я как-то не нашёл решения.

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

Создавал тему на мисте, но предложение добавить свою команду взамен стардартной мне не нравится. http://www.forum.mista.ru/topic.php?id=721810

Есть адекватные способы?
---
SeiOkami, ответ 1С на твой вопрос - "красиво это никак не сделать":

http://its.1c.ru/docs/v8nonmodal/#25
---
SeiOkami, можно поступить так: Добавить реквизит формы ФлагВопроса - Булево. В ПередЗаписью поставить вашу проверку, которая будет отрабатывать пока ФлагВопроса = Ложь. В случае если найдены недопустимые символы выставляем Отказ в истину, реквизит ФлагВопроса в Истину и вызываем ваш ПоказатьВопрос, в обработчике оповещения которого в случае ответа "Да" вы вызовите запись повторно.
Чуть позже выложу код.
---
, прочтите внимательнее, пожалуйста, вопрос. Проблема не в том, как спросить пользователя. И не в том как записать. А в том, как определить, закрывать форму после записи, аль нет.
---
SeiOkami, прошу прощения. Утренний кофе не успел подействовать.
---
SeiOkami,
upd: написал вариант, но после внимательно прочтения понял, что это не то что нужно )))
подумаем )
---
SeiOkami, ответ 1С на твой вопрос - "красиво это никак не сделать":

http://its.1c.ru/docs/v8nonmodal/#25
---
alexx2510, жалько... Очень жалько. Но благодарю за официальный ответ со ссылкой на ИТС.
---
в 8.3.11 вот такой код использую:

```1c
    Если Не ПараметрыЗаписи.ПринудительноЗакрытьФорму Тогда
```

Если пользователь нажал провести или записать документ, то там ложь, а вот если провести и закрыть, то там истина!
---
Сталкивался с подобной задачей.
Мне предлагали убрать кнопку "Записать и закрыть" и оставить только "Записать" и "Закрыть".
И в вашем случае для "закрыть" свой обработчик
---
fokin, да есть такой вариант, я написал об это в (0), но всё же надеюсь на то, что есть что-то получше =(
---
что мешает добавить пару реквизитов ДалиОтвет и КодВозврата формы,
проверять потом в ПриЗаписи на клиенте в цикле ДалиОтвет и делать отказ если отказались?
---
После записи программно (при ответе пользователя "Да") Можно вставить следующий код:

```1c
    Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
    Закрыть();
    КонецЕсли;
```
, где "ПараметрыЗаписи" параметр процедуры "ПередЗаписью".
При нажатии на кнопку "Записать" режим записи будет

```1c
    ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Запись
```
, и закрывать, следовательно, не нужно.

P.S. Если, конечно, документ не был проведен до этого.
---
Мой костыль, работает на 8.3.10.2753

```1c
    &НаКлиенте
    Перем ВыполняетсяЗакрытие;
    &НаКлиенте
    Перем _МодифицированностьФормы;

    &НаКлиенте
    Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    Если Модифицированность Тогда

    _МодифицированностьФормы = Истина;

    //При закрытии форма этого вопроса оказывается под формой вопроса вызваной из ПередЗакрытием и закрывается вместе с формой
    Режим = РежимДиалогаВопрос.ДаНет;
    Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияВопроса", ЭтаФорма, "ПередЗаписью");
    ПоказатьВопрос(Оповещение, НСтр("ru = 'Обновить значения?';"), Режим, 0);
    КонецЕсли;
    КонецПроцедуры

    &НаКлиенте
    Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
    Если _МодифицированностьФормы
    И НЕ ВыполняетсяЗакрытие Тогда

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

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

    ВыполняетсяЗакрытие = Ложь;
    _МодифицированностьФормы = Ложь;
```
---
```1c
    &НаКлиенте
    Перем мЗакрытьФорму;

    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
    мЗакрытьФорму = Ложь;
    КонецПроцедуры

    &НаКлиенте
    Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
    Если мЗакрытьФорму= Ложь Тогда
    Отказ=Истина;
    ТекстВопроса = НСтр("ru = 'Закрыть форму?");
    ДополнительныеПараметры = Новый Структура;
    Обработчик = Новый ОписаниеОповещения("ПередЗакрытиемЗавершение", ЭтаФорма, ДополнительныеПараметры);
    ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет, 60, КодВозвратаДиалога.Да);
    КонецЕсли;
    КонецПроцедуры

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

1. В форме необходимо добавить команду "ПровестиИЗакрыть", ее свойства должны быть максимально схожи с оригинальной командой (Синоним, картинки, подписи и т.д.). Кнопку при этом создавать не нужно.

2. Описать действия на данную команду. Примерно такие:

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

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

    Результат = ЭтотОбъект.Записать(сткПараметры);
    Если Результат и ЗакрыватьПослеПроведения Тогда
    Закрыть();
    КонецЕсли;
    КонецПроцедуры
```

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

```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ЭтотОбъект.Элементы.ФормаПровестиИЗакрыть.ИмяКоманды = "ПровестиИЗакрыть";
    КонецПроцедуры
```

4. Теперь в событие ПередЗаписью, вы получите необходимые свойства в параметрах. И можете уже обрабатывать вопрос согласно рекомендаций от 1С. Можно аналогичную команду создать и для кнопки Провести
Естественно при создании формы на сервере необходимо проконтролировать, что пользователь может выполнять данные действия.
---
```1c
    &НаКлиенте
    Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    Если Не ПараметрыЗаписи.Свойство("ВопросУжеЗадан") Тогда
    Отказ = истина;
    Оповещение = Новый ОписаниеОповещения(
    "ПередЗаписьюЗавершение",
    ЭтотОбъект,ПараметрыЗаписи);
    ПоказатьВопрос(Оповещение, "Документ будет записан, продолжить?", РежимДиалогаВопрос.ДаНет);
    КонецЕсли;
    КонецПроцедуры

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

    Если Результат = КодВозвратаДиалога.Да Тогда
    Параметры.Вставить("ВопросУжеЗадан",Истина);
    Записать(Параметры);
    КонецЕсли;

    КонецПроцедуры
```
---
Спасибо! Интересное решение, только думаю стоит добавить в ПередЗаписьюЗавершение после записи:

```1c
    Если Параметры.ПринудительноЗакрытьФорму Тогда
    Закрыть();
    КонецЕсли;
```

Иначе при нажатии Провести и Закрыть - не закроется