Сначала создаём собственную ошибку ввода, затем оборачиваем её понятной ошибкой операции, сохраняя исходную причину отдельным объектом.
Где и как запускать
Полный серверный общий модуль учебной базы. Собственные значения в памяти, без чтения или записи рабочих данных.
Подготовка
Используйте отдельную учебную базу без рабочих данных. Создайте серверный общий модуль УчебныйЯзык с флагом Сервер, без Привилегированный.
Вставьте весь модуль выбранного примера, а не одну процедуру внутрь другой. Из своей серверной команды учебной обработки вызовите УчебныйЯзык.ВыполнитьПример().
Все числа, строки и коллекции созданы в самом примере. Документы, регистры, файловая система и сеть не используются; никаких зависимостей от КА2/УНФ/УТ/БП нет.
Браузер показывает код, но не исполняет BSL. Проверки результата нужно выполнить вручную на платформе 8.5.1.1343 в учебной базе.
Процедура ВыполнитьПример() Экспорт
ОшибкаОбработана = Ложь;
Попытка
ПроверитьУчебнуюПокупку(0);
Исключение
ОшибкаОбработана = Истина;
Ошибка = ИнформацияОбОшибке();
Сообщить(Ошибка.Код = "training.purchase.failed");
Сообщить(Ошибка.ДополнительнаяИнформация = "Собственная задача: книги по 250");
Сообщить(Ошибка.ЯвляетсяОшибкойКатегории(КатегорияОшибки.ОшибкаКонфигурации, Ложь));
Если Ошибка.Причина = Неопределено Тогда
ВызватьИсключение "Учебная проверка не нашла сохранённую причину";
КонецЕсли;
Сообщить(Ошибка.Причина.Код = "training.quantity.range");
Сообщить(Ошибка.Причина.ДополнительнаяИнформация = "Собственное количество должно быть от 1 до 10");
Сообщить(Ошибка.Описание);
Сообщить(Ошибка.Причина.Описание);
КонецПопытки;
Сообщить(ОшибкаОбработана);
КонецПроцедуры
Процедура ПроверитьУчебнуюПокупку(Знач Количество)
Попытка
ПроверитьУчебноеКоличество(Количество);
Исключение
Причина = ИнформацияОбОшибке();
ВызватьИсключение("Учебную покупку рассчитать нельзя", КатегорияОшибки.ОшибкаКонфигурации,
"training.purchase.failed", "Собственная задача: книги по 250", Причина);
КонецПопытки;
КонецПроцедуры
Процедура ПроверитьУчебноеКоличество(Знач Количество)
Если ТипЗнч(Количество) <> Тип("Число") Тогда
ВызватьИсключение "Передайте собственное числовое количество";
КонецЕсли;
Если Количество < 1 ИЛИ Количество > 10 ИЛИ Количество <> Цел(Количество) Тогда
ВызватьИсключение("Неверное учебное количество", КатегорияОшибки.ОшибкаКонфигурации,
"training.quantity.range", "Собственное количество должно быть от 1 до 10");
КонецЕсли;
КонецПроцедурыРазбор по шагам
Внутренняя функция проверяет собственное число 0. Она создаёт ошибку с категорией ОшибкаКонфигурации и отдельным кодом training.quantity.range.
В следующем обработчике получить первичную ошибку в переменную Причина. Получать её надо до создания нового исключения.
Новый пятиаргументный ВызватьИсключение получает строку, допустимую категорию, строковый код, дополнительный текст и первичную ИнформацияОбОшибке.
Внешний обработчик проверяет код операции, затем наличие причины, а уже после этого обращается к её полям.
ЯвляетсяОшибкойКатегории с Ложь проверяет только текущую ошибку. Текст и код исходного неверного количества не теряются в строковом склеивании.
Как проверить результат
Шесть логических проверок Истина, а также два описания ошибок. Служебные строки и формат описаний заранее не фиксируются.
Вызовите ПроверитьУчебнуюПокупку(3): исключения нет, внешний обработчик не выполняется, последний флаг Ложь. Это положительный вариант, не потерянная диагностика.
Ожидаемый результат
Разобраны собственный код ошибки, разрешённая категория, цепочка причин и правильное место получения диагностики.
На что обратить внимание
Нельзя передавать в параметре категории ВсеОшибки, ПрочаяОшибка, ОшибкаКомпиляцииВстроенногоЯзыка, ОшибкаВоВремяВыполненияВстроенногоЯзыка и ИсключениеВызванноеИзВстроенногоЯзыка.
Причина — объект ИнформацияОбОшибке, не строка ОписаниеОшибки. Свойства полученной диагностики доступны только для чтения.
ДополнительнаяИнформация здесь содержит только собственное учебное правило. Не помещайте туда пароли, токены и содержимое рабочих документов.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.