ПоказатьВопрос не прерывает исполнение процедуры с ожиданием результата ответа на диалог

1. BuryMeInVegas 12.11.21 16:11 Сейчас в теме
Добрый день! Веду простейшею доработку, заказчик запросил выводить диалоговое окно при сохранении карточки партнёра пользователем, не владеющим определёнными правами. Диалог реализовал, описание оповещения реализовал, всё как обычно. Однако при отладке исполнение кода на строке "ПоказатьВопрос" не останавливается, а продолжается, по итогу диалог всплывает не до сохранения карточки участника, а после (по ТЗ нужно прерывать исполнение кода перед процедурой сохранения данных). Вопрос: где у меня косяк?) Никак не могу понять. Код ниже приложу:
Отказ = Ложь; // Моя переменная для дальнейшего прерывания исполнения кода, если пользователь ответил на диалог "Нет"
			
ДействияПослеОтветаНаВопрос = Новый ОписаниеОповещения("ПослеОтветаНаДиалог", ЭтотОбъект, Отказ); // Инициализация описания оповещения
	
Если Не ПользовательЯвляетсяОКЗИлиАдмином () Тогда // Проверка ролей пользователя
    ПоказатьВопрос(ДействияПослеОтветаНаВопрос, "После сохранения участника корректировка карточки участника закупочной процедуры будет невозможна. " +  Символы.ПС + "Подтвердите необходимость завершения процесса заведения карточки участника для дальнейшего её сохранения.", РежимДиалогаВопрос.ДаНет, , , "ВНИМАНИЕ!");	// Вот на этом месте исполнение процедуры не останавливается, уходит дальше в проверку переменной "Отказ"
КонецЕсли;

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

Показать
Найденные решения
2. Sashares 33 12.11.21 16:22 Сейчас в теме
(1)
Однако при отладке исполнение кода на строке "ПоказатьВопрос" не останавливается, а продолжается

В этом и смысл немодального метода ПоказатьВопрос, что он не блокирует выполнение кода.
Код который должен выполняться после ответа на вопрос должен размещаться в процедуре, которая является обработчиком оповещения.
То есть в вашем случае должно быть так - если задали вопрос, то дальше процедуру не выполняем, а результат обрабатываем в ДействияПослеОтветаНаВопрос.

Если Не ПользовательЯвляетсяОКЗИлиАдмином () Тогда // Проверка ролей пользователя
    ПоказатьВопрос(ДействияПослеОтветаНаВопрос, "После сохранения участника корректировка карточки участника закупочной процедуры будет невозможна. " +  Символы.ПС + "Подтвердите необходимость завершения процесса заведения карточки участника для дальнейшего её сохранения.", РежимДиалогаВопрос.ДаНет, , , "ВНИМАНИЕ!");    // Вот на этом месте исполнение процедуры не останавливается, уходит дальше в проверку переменной "Отказ"
Возврат;
КонецЕсли;

То есть после ПоказатьВопрос добавляется Возврат.
3. Release 12.11.21 16:25 Сейчас в теме
(1) Это естественное поведение данного метода.
ПоказатьВопрос (ShowQueryBox)
Описание:
Выводит на экран окно вопроса, при этом не ожидается завершения ответа пользователя.

Всё, что должно происходить после ответа на вопрос и зависящее от него, нужно перенести в процедуру параметра ОписаниеОповещенияОЗавершении.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Sashares 33 12.11.21 16:22 Сейчас в теме
(1)
Однако при отладке исполнение кода на строке "ПоказатьВопрос" не останавливается, а продолжается

В этом и смысл немодального метода ПоказатьВопрос, что он не блокирует выполнение кода.
Код который должен выполняться после ответа на вопрос должен размещаться в процедуре, которая является обработчиком оповещения.
То есть в вашем случае должно быть так - если задали вопрос, то дальше процедуру не выполняем, а результат обрабатываем в ДействияПослеОтветаНаВопрос.

Если Не ПользовательЯвляетсяОКЗИлиАдмином () Тогда // Проверка ролей пользователя
    ПоказатьВопрос(ДействияПослеОтветаНаВопрос, "После сохранения участника корректировка карточки участника закупочной процедуры будет невозможна. " +  Символы.ПС + "Подтвердите необходимость завершения процесса заведения карточки участника для дальнейшего её сохранения.", РежимДиалогаВопрос.ДаНет, , , "ВНИМАНИЕ!");    // Вот на этом месте исполнение процедуры не останавливается, уходит дальше в проверку переменной "Отказ"
Возврат;
КонецЕсли;

То есть после ПоказатьВопрос добавляется Возврат.
4. BuryMeInVegas 12.11.21 16:26 Сейчас в теме
(2) Я понял. Только проблема в том, что мне нужно как раз ожидать действие пользователя, чтобы в зависимости от его ответа либо не давать вести запись в БД, либо давать, в случае утвердительного ответа пользователя. Сильно ломать изначальную структуру кода тоже желания не возникает, но, судя по всему так и придётся поступить. Благодарю за ответ!
6. Sashares 33 12.11.21 16:31 Сейчас в теме
(4)
Сильно ломать изначальную структуру кода тоже желания не возникает, но, судя по всему так и придётся поступить.

Так и не надо ломать. Вопрос же задается не всегда, а только при соблюдении условия.
То что выполняется ниже можно было бы вынести в отдельную процедуру и вызывать ее как из этой процедуры, если вопрос не задается, так и в обработчике оповещения, если пользователь согласился сохранять.
7. BuryMeInVegas 12.11.21 16:36 Сейчас в теме
(6) Да, уже нашёл выход из ситуации. Вынес кусок того кода, который должен вызываться после ответа на диалог в отдельную процедурку, вызвал её в случае, если диалог не нужен, и вызвал в процедуре описания оповещения, в случае утвердительного ответа на диалог, проблема решилась. Благодарю за идею!
8. Release 12.11.21 18:12 Сейчас в теме
(7) Если конфигурация поддерживает нужную версию платформы можно использовать:
ВопросАсинх (DoQueryBoxAsync)
Доступен, начиная с версии 8.3.18.

Не потребуется разбивать блок кода на несколько в разных процедурах.
9. BuryMeInVegas 12.11.21 18:33 Сейчас в теме
(8) Там 8.3.11. Асинхронностью там даже и не пахнет. :)
3. Release 12.11.21 16:25 Сейчас в теме
(1) Это естественное поведение данного метода.
ПоказатьВопрос (ShowQueryBox)
Описание:
Выводит на экран окно вопроса, при этом не ожидается завершения ответа пользователя.

Всё, что должно происходить после ответа на вопрос и зависящее от него, нужно перенести в процедуру параметра ОписаниеОповещенияОЗавершении.
5. BuryMeInVegas 12.11.21 16:26 Сейчас в теме
(3) Да, мне чуть выше уже указали на эту ошибку, проморгал её. Но Ваш ответ тоже отмечу, как решение. :)
Оставьте свое сообщение

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