УФ, Платформа 8.3.17.1851

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

В ОписанииОповещения пробовала менять "ЭтотОбъект" на "ЭтаФорма", результат тот же.

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

&НаКлиенте
Процедура ЗадатьВопрос(Артикул, Наименование)

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

 ТекстВопроса = "Не найдена номенклатура арт. "+Артикул+" " +Наименование+Символы.ПС+"Создать новую?";

 ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена, 0, КодВозвратаДиалога.Да,"Нет номенклатуры");

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

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

 Если Результат = КодВозвратаДиалога.Да Тогда

  //тут обработка

 Иначе

  //тут обработка

 КонецЕсли;

КонецПроцедуры
---
асинхронная (не путать с многопоточной) работа в 1С на клиенте означает следующее. Идет выполнение подряд. Вызывается асинхронный метод и далее не ждет его выполнения, а продолжает выполнение последующего кода. Когда клиент освобождается, происходит вызов метода, который был указан как вызываемый по окончании работы асинхронного метода. И идет выполнение уже в нем. Клиент 1С не может работать многопоточно, но сделано такое подобие асинхронности. Чтобы не зависал клиент, если метод долго выполняется.
---
Собрать табличку с полями <создать> и <выбранная номенклатура.>
Заполнить её. И один раз показать, пусть юзверь разбирается.
---
Ожидание ответа от пользователя - это не ожидание для продолжения исполнения программы. Программа исполняется сама собой, невзирая. Чтобы понять это - напишите после ПоказатьВопрос() что-то типа Сообщить("Мне пофиг на всех, я продолжаю работать и никого не жду")
---
вроде все правильно, может где-то в букве ошибка, типа с - английская затесалась . Попробуйте скопировать ПослеОтветаНаВопрос из любой строчки и вставить в другую или переназвать по новому.
---
Ничего не дает, пробовала. Была бы ошибка в названии функции - при запуске бы выдавалось, что Процедура не найдена (проверяла)
---
в процедуре ПослеОтветаНаВопрос() на самом деле нет ничего, даже сообщить?
---
Все же сделайте, как написано в С-П:

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

 Оповещение = Новый ОписаниеОповещения("ОбработатьВопрос", ЭтаФорма, "_Имя_Действия_"); //, Новый Структура("Событие", "Тест")); - шаблон для передачи доп.параметров
 ПоказатьВопрос(Оповещение, "Вы уверены?", РежимДиалогаВопрос.ДаНет, 20, КодВозвратаДиалога.Нет, "Заголовок: Выполнение обработки.");

в свойствах конфигурации в совместимости что стоит?
---
&НаКлиенте
Процедура ПослеОтветаНаВопрос(Результат, Параметры) Экспорт

Сообщить("!УРЯЯЯЯ!");
// и дальше остальной код

Что сделает?
---
Не поняла, что произошло, но "ПослеОтветаНаВопрос" начала работать.
Но не совсем так, как надо..
В целом, логика такая: обрабатывается табличная часть документа, построчно в цикле. Для каждой строки, если не выполняется определенное условие, вызывается Процедура ЗадатьВопрос.

Но, если условие не выполняется для нескольких строк, появляется несколько табличек с вопросом (по 1 на каждую строку). И только при нажатии на последнюю идет вызов ПослеОтветаНаВопрос.

А, вроде, по описанию уже первый "ПоказатьВопрос" должен был ждать ответа?
---
построчно в цикле. Для каждой строки, если не выполняется определенное условие, вызывается Процедура ЗадатьВопрос

Это очень плохая и неправильная логика. Нужно обойти _все_ строки, собрать вопросы. А потом один раз их задать.
Ну... Или переходить .17 и использовать асинх, если уж очень не хочется "логику" переделывать..

ЗЫ. Пора отвыкать от синхронности и вопросов в цикле... А то так ещё в проведении вопросы начнёте задавать...
---
асинхронная (не путать с многопоточной) работа в 1С на клиенте означает следующее. Идет выполнение подряд. Вызывается асинхронный метод и далее не ждет его выполнения, а продолжает выполнение последующего кода. Когда клиент освобождается, происходит вызов метода, который был указан как вызываемый по окончании работы асинхронного метода. И идет выполнение уже в нем. Клиент 1С не может работать многопоточно, но сделано такое подобие асинхронности. Чтобы не зависал клиент, если метод долго выполняется.
---
по описанию уже первый "ПоказатьВопрос" должен был ждать ответа?

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

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

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

    Элемент = ОбъектыНазначенияМассив[0];

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

Много лет работала эта обработка, а теперь перестала. В ОтветНаВопросЗавершение вообще не заходит. В чем может быть дело?
---
&НаКлиенте
Процедура ОтветНаВопросЗавершение(Результат, ДополнительныеПараметры) Экспорт
    Если Результат = КодВозвратаДиалога.Да Тогда
        ВыполнитьОткрытие();
    Иначе
        Возврат
    КонецЕсли;
КонецПроцедуры

а если сделать так? сообщение есть?
&НаКлиенте
Процедура ОтветНаВопросЗавершение(Результат, ДополнительныеПараметры) Экспорт

   Сообщить ("Заход");
    Если Результат = КодВозвратаДиалога.Да Тогда
        ВыполнитьОткрытие();
    Иначе
        Возврат
    КонецЕсли;
КонецПроцедуры
---
Нет сообщения, отладчик в эту процедуру даже не заходит. Пришлось убрать вопрос, чтобы заработало.