В языке 1С основным инструментом для этого служит конструкция Попытка ... Исключение ... КонецПопытки. Эта статья научит вас не просто использовать этот оператор, а делать это правильно и эффективно.
1. Что это такое? Базовый синтаксис
Конструкция позволяет "попытаться" выполнить некоторый блок кода, и если в процессе его выполнения возникнет ошибка (исключение), управление немедленно перейдет в блок Исключение, не прерывая работу всей программы.
Попытка
// Код, который может вызвать ошибку
// Например: деление на ноль, работа с файлом, запрос к базе
Результат = 10 / 0;
Исключение
// Этот блок выполнится ТОЛЬКО если в блоке "Попытка" возникла ошибка
Сообщить("Произошла ошибка: " + ОписаниеОшибки());
КонецПопытки;2. Объект ИнформацияОбОшибке — ваш главный инструмент
Когда исключение произошло, вам нужно понять, что же пошло не так. Для этого в блоке Исключение используется функция ИнформацияОбОшибке(). Она возвращает объект со следующими ключевыми свойствами:
-
Описание— текстовое описание ошибки (то, что видит пользователь). -
ИмяМодуля— путь к модулю, в котором произошла ошибка. -
НомерСтроки— номер строки в модуле, где упал код. -
Источник— часто содержит техническое имя ошибки (например,{DivideByZeroException}). -
ВстроенноеОбращение** — если ошибка возникла встроенной в платформу, здесь будет ее описание.
Пример детального анализа ошибки:
bslПопытка
НесуществующийФайл = Новый ЧтениеТекста("C:\несуществующий_файл.txt");
Исключение
Инфо = ИнформацияОбОшибке();
Сообщить("Ошибка в модуле: " + Инфо.ИмяМодуля);
Сообщить("Строка: " + Инфо.НомерСтроки);
Сообщить("Что пошло не так: " + Инфо.Описание);
// Для разработчика можно вывести более детальную информацию
Сообщить("Для разработчика: " + Инфо.Источник + ", " + Инфо.ВстроенноеОбращение);
КонецПопытки;3. Ключевое слово ВызватьИсключение — создаем ошибки сами
Иногда вам нужно самим прервать выполнение кода с определенной ошибкой, если бизнес-логика нарушена. Для этого используется оператор ВызватьИсключение.
Процедура ПровестиДокумент(Документ)
// Проверка бизнес-логики
Если Не Документ.ПроверенаЗаполненность() Тогда
// Прерываем выполнение с понятным сообщением
ВызватьИсключение "Документ не заполнен! Проведите проверку заполненности.";
КонецЕсли;
// ... основной код проведения ...
КонецПроцедуры4. Типичные ошибки новичков (Как НЕ надо делать)
Ошибка 1: Слепое глотание всех ошибок
ПЛОХО:
bslПопытка
ВыполнитьОченьВажнуюОперацию();
Исключение
// Какая ошибка? Мы не знаем. Просто молча пропустили.
// Программа продолжает работать в неконсистентном состоянии!
КонецПопытки;ХОРОШО:
bslПопытка
ВыполнитьОченьВажнуюОперацию();
Исключение
// Логируем ошибку для администратора
ЗаписатьЖурналРегистрации("ОшибкаПроведения", УровеньЖурналаРегистрации.Ошибка, ИнформацияОбОшибке());
// И сообщаем пользователю
Сообщить("Не удалось выполнить операцию. Обратитесь к администратору.");
// ИЛИ, если это критично, прерываем дальнейшие действия
Возврат Ложь;
КонецПопытки;Ошибка 2: Использование в циклах без обработки на уровне элемента
ПЛОХО:
bslПопытка
Для каждого Элемент Из Коллекция Цикл
// Если ошибка на 3-м элементе, цикл прервется, остальные не обработаются
ОпаснаяОперация(Элемент);
КонецЦикла;
Исключение
Сообщить("Ошибка при обработке коллекции");
КонецПопытки;ХОРОШО:
bslДля каждого Элемент Из Коллекция Цикл
Попытка
ОпаснаяОперация(Элемент);
Исключение
// Обрабатываем ошибку для конкретного элемента и идем дальше
Сообщить("Не удалось обработать элемент: " + Элемент + ". Ошибка: " + ОписаниеОшибки());
// Можно также записать проблемный элемент в массив для последующего разбора
КонецПопытки;
КонецЦикла;5. Продвинутые техники
Получение стека вызовов
Иногда ИнформацияОбОшибке() не дает полной картины. Для отладки сложных ошибок используйте ПодробноеПредставлениеОшибки(). Этот метод показывает весь стек вызовов, который привел к ошибке.
Попытка
// ... какой-то код ...
Исключение
// Логируем ВСЮ цепочку вызовов
ЗаписатьЖурналРегистрации("СтекОшибки", УровеньЖурналаРегистрации.Ошибка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибки()));
КонецПопытки;Обработка конкретных типов ошибок (сопоставление с образцом)
В версиях платформы 1С 8.3.6 и выше появилась возможность обрабатывать разные типы ошибок по-разному, используя конструкцию Когда внутри блока Исключение.
Попытка
// Код, который может вызвать разные ошибки
ОткрытьФайл(Путь);
ВыполнитьЗапрос(Запрос);
Исключение
// Обрабатываем ошибку "Файл не найден"
Когда "ФайлНеНайден", "КаталогНеСуществует" Тогда
Сообщить("Указанный файл не существует. Проверьте путь.");
Возврат;
// Обрабатываем ошибки доступа
Когда "ОтказВДоступе" Тогда
Сообщить("Нет прав для доступа к файлу.");
Возврат;
// Обрабатываем ошибки запросов
Когда "ОшибкаВыполненияЗапроса" Тогда
Сообщить("Ошибка в SQL-запросе.");
ЗаписатьЖурналРегистрации("ОшибкаЗапроса", УровеньЖурналаРегистрации.Ошибка, ИнформацияОбОшибке());
// Обрабатываем все остальные, неизвестные ошибки
Иначе
Сообщить("Неизвестная ошибка: " + ОписаниеОшибки());
ЗаписатьЖурналРегистрации("НеизвестнаяОшибка", УровеньЖурналаРегистрации.Ошибка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибки()));
КонецПопытки;Заключение и лучшие практики
-
Не игнорируйте ошибки. Пустой блок
Исключение— это мина замедленного действия. -
Всегда логируйте. Используйте
ЗаписатьЖурналРегистрации()для записи деталей ошибки (ИнформацияОбОшибке(),ПодробноеПредставлениеОшибки()). Это сэкономит часы отладки. -
Информируйте пользователя. Показывайте понятные сообщения, не перегружая его техническими деталями.
-
Будьте конкретны. Обрабатывайте ошибки на том уровне, где у вас есть достаточно контекста, чтобы с ними справиться. Используйте
Когдадля точечной обработки. -
Используйте для внешних операций. Обязательно оборачивайте в
Попытка...Исключениеоперации, которые зависят от внешних факторов: работа с файлами, интернет-соединение, вызовы внешних компонент, сложные запросы к базе.
Правильное использование обработки исключений — это признак зрелости разработчика. Оно делает ваши конфигурации стабильными, предсказуемыми и удобными в сопровождении.

