Имя: Пароль:
1C
1С v8
Как инициировать вызов обработчика ошибки ОписанияОповещения?
0 5jam
 
06.07.22
09:29
Народ, всем привет!

Туплю, не пойму как работает ОписаниеОповещения и ПоказатьВопрос, вернее как запустить выполнение обработчика ошибки этого ОписанияОповещения.

Пример:
Платформа 8.3.18.1433
Создаю чистую конфу и делаю в ней обработку с УпрФормой, где вывожу команду "Показать вопрос",
в обработчике которой создаю ОписаниеОповещения, которому,
1-м параметром указываю процедуру "ОбработчикОповещения", а 4-м параметром - процедуру "ОбработчикОшибки"

Код:
ОписаниеОповещ = Новый ОписаниеОповещения("ОбработчикОповещения", ЭтаФорма, , "ОбработчикОшибки", ЭтаФорма);

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

а в ОбработчикеОповещения, если нажата кнопка "Прервать", выполняю деление на 0, что, в моем понимании и является той ошибкой, которая должна привести к вызову ОбработчикаОшибки.

Но нет. ОбработчикОшибки НЕ вызывается, вместо этого идет показ стандартного окна "Деление на 0" с кнопками ОК и Подробно.

Между тем, в СП относительно <ИмяПроцедурыОбработкиОшибки> сказано: "Имя экспортируемой процедуры модуля, которая будет вызвана в случае возникновения ошибки".

Вопрос: в случае какой-такой ошибки может быть вызвана эта процедура-обработчик ошибки? Как инициировать вызов обработчика ошибки?
Всех заранее благодарю за дельные комментарии!


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

&НаКлиенте
Процедура ОбработчикОповещения(НажатаяМнойКнопка, ДопПараметры) Экспорт
    
    Если НажатаяМнойКнопка = КодВозвратаДиалога.Прервать Тогда
        А = 5/0; // намеренно вызываю ошибку, чтоб выйти в ОбработчикОшибки
        // однако ошибка приводит к завершению работы метода
        // а ОбработчикОшибки НЕ вызывается
    КонецЕсли;
    
    
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "Выполнен ОбработчикОповещения";
    //Сообщение.Поле = "НоменклатураДляСообщения";
    //Сообщение.УстановитьДанные();
    Сообщение.Сообщить();    
    
КонецПроцедуры

&НаКлиенте
Процедура ОбработчикОшибки(НажатаяМнойКнопка, ДопПараметры) Экспорт
    
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "Выполнен ОбработчикОшибки";
    //Сообщение.Поле = "НоменклатураДляСообщения";
    //Сообщение.УстановитьДанные();
    Сообщение.Сообщить();    
    
КонецПроцедуры
1 5jam
 
06.07.22
09:31
Прошу админа исправить текст в тегах , чтоб был похож на код.
2 youalex
 
06.07.22
10:16
Я так понял, это нужно для обработки ошибки непосредственно асинхронного метода, когда поток не заходит в процедуру основного оповещения.
Например, в ТекстовыйДокумент.НачатьЗапись(), если имя файла указано неверно.
3 arsik
 
гуру
06.07.22
10:47
(0) Ну а как ты хотел?
Вызывается асинхронная функция - например "Открыть форму". И из нее будет 2 выхода - или в ОбработчикОповещения или в ОбработчикОшибки. Ошибку ты генерируешь уже после этого выбора.
ПоказатьВопрос - не может никак сгенерировать ошибку.
4 СеменовСемен
 
06.07.22
11:14
Юзай ПоказатьВопрсоАсинх
5 5jam
 
06.07.22
11:23
(3) - Какой выбор? Как сделать выход в ОбработчикОшибки?
Сделал ОткрытьФорму(), а ПриЗакрытии() этой УФ сделал ошибку /0 - результат тот же: показывает "Деление на 0" и срабатывает ОбработчикОповещения. В ОбработчикОшибки НЕ выходит.
6 unbred
 
06.07.22
11:26
в обычных формах это решается строчкой "ВызватьИсключение;"
7 youalex
 
06.07.22
11:40
(5)
> Как сделать выход в ОбработчикОшибки?
Если ты уже зашел в Процедура ОбработчикОповещения(), то ничто не мешает тебе прямо вызвать эту функцию (или любую другую, доступную из текущего контекста). Зачем тебе именно ОбработчикОшибки, он нужен для асинхронной обработки ошибки самого асинхронного метода, по сути это такой костыль.
8 arsik
 
гуру
06.07.22
11:47
(5) Ну видимо работает только для встроенных асинхронных функций типа "НачатьКопированиеФайла" и торгового оборудования в асинхронном режиме
9 5jam
 
06.07.22
11:57
(2) Да, хоть и не понял, что значит "процедуру основного оповещения",
но проверил, и действительно, попытка "ТекстовыйДокумент.НачатьЗапись(), если имя файла указано неверно" приводит к выходу в ОбработчикОшибки.

Видимо в СП речь НЕ О ВСЕХ ошибках, а только о некоторых.
Например, деление на 0 НЕ вызывает ОбработчикОшибки, а попытка записи ТекстДока с неверным именем файла - делает это.

Неплохо бы разрабам оговорить в СП, что считается ошибкой, а что нет.

Всем респект и благодарность.
10 ДедМорроз
 
06.07.22
13:12
Обработка ошибок - это для ошибок,вызываемых исполнением самого асинхронного метода еще до его окончания.
Исполнение же основной процедуры оповещения происхрдит после окончания выполнения асинхронного метода,когда он выполнен успешно.