Как задать вопрос пользователю в немодальном режиме в обработчике "передНачаломДобавления"?

В модальном режиме все просто:

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

    КонецПроцедуры
```
---
Сделай вот так

```1c
    &НаКлиенте
    Процедура ДопКомплектацияПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)

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

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

    &НаКлиенте
    Процедура ПослеОтветаПользователя(Ответ, ДополнительныеПараметры) Экспорт

    Если Ответ = КодВозвратаДиалога.Да Тогда
    Записать();
    Объект.ДопКомплектация.Добавить();
    КонецЕсли;

    КонецПроцедуры
```
---
Все оказалось проще....

```1c
    &НаКлиенте
    Процедура ДополнительноПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
    ПередИзменениемИзделия(Отказ, Элемент, "ДобавлениеДопа");
    КонецПроцедуры

    &НаКлиенте
    Процедура ДополнительноПередНачаломИзменения(Элемент, Отказ)
    ПередИзменениемИзделия(Отказ, Элемент, "ИзменениеДопа");
    КонецПроцедуры

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

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

    Оповещение = Новый ОписаниеОповещения("ПослеОтветаПользователя", ЭтаФорма, ПараметрыОповещения);
    ТекстВопроса = НСтр("ru = 'Возможно, заказ находится в производстве. Вы уверены, что надо вносить изменения?'; de = 'Möglich, der Auftrag befindet sich in der Produktion. Sind Sie sicher, dass man die Änderungen vornehmen muss?'; en = 'Perhaps, the order is in production. Are you sure you want to edit?'");
    ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
    КонецЕсли;
    КонецПроцедуры // ПередИзменениемИзделия()

    &НаКлиенте

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

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

    Если Ответ = КодВозвратаДиалога.Да Тогда
        Записать();
        Объект.ДопКомплектация.Добавить();
    КонецЕсли;

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

Да, спасибо, получилось. А если "ПередНачаломИзменения"
---
```1c
    ТекстВопроса = НСтр("ru = 'Перед заполнением таблица будет очищена. Продолжить выполнение операции?'");

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

    &НаКлиенте
    Процедура ПолучитьОтветПользователя(Результат, Параметры) Экспорт

    Если Результат = КодВозвратаДиалога.Отмена Тогда
    Возврат;
    КонецЕсли;
    ЗаполнитьПоВидуПотребителяНаСервере();
    КонецПроцедуры // ПолучитьОтветПользвателя()
```

как то так
---
Формально задача решается так

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

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

Но практически задача не решаема. Дело в том, что в немодальном режиме происходит асинхронный вызов процедуры вопроса, т.е. сразу после вызова процедуры ПоказатьВопрос программа продолжает выполнятся вне зависимости от результата работы процедуры ПоказатьВопрос (программа просто не ждет результата действия пользователя). В этой ситуации присвоение параметру Отказ значения Истина в обработчике ответа уже не возможно.
---
А как обойти такой случай. Ведь не редко необходимо, перед выбором, задать вопрос пользователю.
---
Сделай вот так

```1c
    &НаКлиенте
    Процедура ДопКомплектацияПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)

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

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

    &НаКлиенте
    Процедура ПослеОтветаПользователя(Ответ, ДополнительныеПараметры) Экспорт

    Если Ответ = КодВозвратаДиалога.Да Тогда
    Записать();
    Объект.ДопКомплектация.Добавить();
    КонецЕсли;

    КонецПроцедуры
```
---
Ну тогда уже так

```1c
    &НаКлиенте
    Процедура ДопКомплектацияПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)

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

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

    &НаКлиенте
    Процедура ПослеОтветаПользователя(Ответ, ДополнительныеПараметры) Экспорт

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

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

    ДополнительноПередНачаломИзменения(ДополнительныеПараметры.Элемент, Ложь);

    КонецЕсли;
    КонецПроцедуры

    &НаКлиенте
    Процедура ДополнительноПередНачаломИзменения(Элемент, Отказ)

    Если НЕ ЗаписатьДокументВФорме Тогда
    Отказ = Истина;

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

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

Попробовал так перед в событии передизменением, не получилось...
в частности в оповещении функция "ДополнительноПередНачаломИзменения" вызвалась но ничего не отработала. Строка не перешла в режим редактирования.

Подскажите, что не так делаю?
---
Подскажите, что не так делаю?

```1c
    ЗаписатьДокументВФорме = Истина;
    ДополнительноПередНачаломИзменения(ДополнительныеПараметры.Элемент, Ложь);
    ...

    Процедура ДополнительноПередНачаломИзменения(Элемент, Отказ)
    Если НЕ ЗаписатьДокументВФорме Тогда // здесь никогда не войдет в условие.
```

Условие никогда не отработает, так как выше установлено ЗаписатьДокументВФорме = Истина;
---
```1c
    &НаКлиенте
    Перем ЗаписатьДокументВФорме;
```

 Дело не в этом. Эта переменная объявлена. Тут именно все по отладчику отрабатывает, а строка не переходит в режим редактирования
---
дело как раз в этом. Условие никогда не отработает, так как выше установлено ЗаписатьДокументВФорме = Истина;
Это с учетом того, что переменная объявлена.
Для проверки можно попробовать удалить ЗаписатьДокументВФорме = Истина;
Тогда всегда будет заходить в тело условия.
---
Так она отрабатывает, когда вызывается функция "ДополнительноПередНачаломИзменения". В этот момент переменная ЗаписатьДокументВФорме = Истина код выполняется, а строка не переходит в режим редактирования.
---
какой код выполняется?
Вот исходный код:

```1c
    &НаКлиенте
    Процедура ДопКомплектацияПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)

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

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

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

    ДополнительноПередНачаломИзменения(ДополнительныеПараметры.Элемент, Ложь);

    КонецЕсли;
    КонецПроцедуры

    &НаКлиенте
    Процедура ДополнительноПередНачаломИзменения(Элемент, Отказ)

    Если НЕ ЗаписатьДокументВФорме Тогда
    Отказ = Истина;

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

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

В самом начале (первая процедура) делается Отказ = Истина;
Это означает, что программа ничего делать не будет. В том числе и ничего не будет добавлять. Далее асинхронно вызывается ПоказатьВопрос и обработчик ДопКомплектацияПередНачаломДобавления завершается и ничего не ждет.

После показа вопроса Вызывается процедура ПослеОтветаПользователя.
В ней клиентской переменной ЗаписатьДокументВФорме присваивается значение Истина.

Вызывается процедура ДополнительноПередНачаломИзменения.
Проверяется клиентская переменная ЗаписатьДокументВФорме, которая ранее установилась в Истина. Она в этот момент Истина.
Проверка на Условие: Если НЕ ЗаписатьДокументВФорме Тогда в данном случае означает Если НЕ Истина Тогда. Что эквивалентно Если Ложь Тогда.
Т.к. Там не Ложь, то тело условия не будет выполняться. Далее завершение всех процедур.

В итоге имеет просто Отказ = Истина в самом начале и показ ничего не значащего вопроса.

Как еще проще объяснить я не знаю.
---
Объясню подробнее.
В начале:

```1c
    Процедура ДопКомплектацияПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)

    Отказ = Истина;
```

Т.е. сразу же отключается стандартное поведение.
Затем следует диалог Вопрос.
После ничего не делается, так как код построен так, что можно было бы сразу написать возврат.
Т.е. он будет аналогичен следующему коду:

```1c
    &НаКлиенте
    Процедура ДопКомплектацияПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)

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

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

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

```1c
    &НаКлиенте
    Процедура ДополнительноПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
    ПередИзменениемИзделия(Отказ, Элемент, "ДобавлениеДопа");
    КонецПроцедуры

    &НаКлиенте
    Процедура ДополнительноПередНачаломИзменения(Элемент, Отказ)
    ПередИзменениемИзделия(Отказ, Элемент, "ИзменениеДопа");
    КонецПроцедуры

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

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

    Оповещение = Новый ОписаниеОповещения("ПослеОтветаПользователя", ЭтаФорма, ПараметрыОповещения);
    ТекстВопроса = НСтр("ru = 'Возможно, заказ находится в производстве. Вы уверены, что надо вносить изменения?'; de = 'Möglich, der Auftrag befindet sich in der Produktion. Sind Sie sicher, dass man die Änderungen vornehmen muss?'; en = 'Perhaps, the order is in production. Are you sure you want to edit?'");
    ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
    КонецЕсли;
    КонецПроцедуры // ПередИзменениемИзделия()

    &НаКлиенте

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

    ТекЭлемент = ДополнительныеПараметры.Элемент;
    Если ДополнительныеПараметры.ВидВызова = "ИзменениеДопа" Тогда
    ТекЭлемент.ИзменитьСтроку();
    ИначеЕсли ДополнительныеПараметры.ВидВызова = "ДобавлениеДопа" Тогда
    ТекЭлемент.ДобавитьСтроку();
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры
```
---
Все спасибо за помощь в поиске. :) Теперь вопрос закрыт.