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