К статье
Практический материал

Разработка и Конфигурация · 9 мин

Что такое Попытка в 1С и как работает обработка исключений

Что такое Попытка в 1С: синтаксис Попытка–Исключение–КонецПопытки, примеры кода, обработка ошибок через ИнформацияОбОшибке, типичные ошибки разработчиков.

Попытка в 1С — это языковая конструкция встроенного языка платформы «1С:Предприятие», предназначенная для перехвата и обработки ошибок времени выполнения. Она работает по принципу try-catch, знакомому разработчикам на других языках: код, который может завершиться ошибкой, помещается в блок Попытка, а реакция на сбой описывается в блоке Исключение.

Без обработки исключений любая ошибка выполнения — деление на ноль, обращение к несуществующему файлу, разрыв соединения с базой — прерывает выполнение процедуры и показывает пользователю системное сообщение. Для обменов данными, фоновых заданий и интеграций это критично: один сбойный документ остановит выгрузку целиком. Конструкция Попытка–Исключение позволяет локализовать проблему, записать её в журнал и продолжить работу.

Конструкция доступна во всех современных версиях платформы 1С:Предприятие 8 и используется одинаково в тонком, толстом и веб-клиенте, а также на сервере. Дальше разберём синтаксис, практические сценарии, типичные ошибки и способы проверки результата.

Синтаксис конструкции Попытка–Исключение

Полная форма оператора выглядит так: после ключевого слова Попытка идут защищаемые операторы, затем Исключение с обработчиком ошибки и завершающее КонецПопытки;. Точка с запятой после КонецПопытки обязательна.

bsl
Попытка
    Результат = Значение1 / Значение2;
Исключение
    ИнфоОшибки = ИнформацияОбОшибке();
    ЗаписьЖурналаРегистрации("Деление", УровеньЖурналаРегистрации.Ошибка, , , ИнфоОшибки.Описание);
    Результат = 0;
КонецПопытки;

Если в блоке Попытка ошибок не возникло, блок Исключение полностью пропускается, и выполнение продолжается после КонецПопытки. Если ошибка произошла — выполнение мгновенно переходит в блок Исключение, а операторы после точки сбоя внутри Попытки не выполняются.

Допустима и сокращённая форма без блока Исключения — только с КонецПопытки. Но на практике её почти не используют: ошибка будет «проглочена» без какой-либо диагностики, что затрудняет поиск проблем.

Объект ИнформацияОбОшибке: что можно узнать о сбое

Внутри блока Исключение функция ИнформацияОбОшибке() возвращает объект с деталями произошедшей ошибки. Это главный инструмент диагностики: без него обработчик превращается в «чёрный ящик», который скрывает проблему вместо её фиксации.

Ключевые свойства объекта:

  • Описание — краткий текст ошибки, подходит для журнала регистрации;
  • ПодробноеОписаниеОшибки — расширенный текст со стеком вызовов, удобен для разработчика;
  • ИмяМодуля и НомерСтроки — где именно произошёл сбой;
  • Причина — вложенный объект ИнформацияОбОшибке, если ошибка была вызвана другой ошибкой (например, при вызове веб-сервиса).

Для вывода пользователю лучше не показывать сырой текст исключения — он содержит технические детали. Правильный подход: записать подробности в журнал регистрации, а пользователю сообщить понятную формулировку и рекомендуемое действие.

Типичные сценарии применения

Обмены данными и интеграции

Самый частый случай — обработка загрузки данных, где сбой одного объекта не должен останавливать весь пакет. Каждый элемент оборачивается в собственную Попытку внутри цикла: ошибочный элемент пропускается с записью в лог, остальные обрабатываются штатно.

Работа с файлами и внешними ресурсами

Чтение файла, подключение к COM-объекту, HTTP-запрос — все эти операции зависят от внешней среды и могут завершиться ошибкой в любой момент. Оборачивание в Попытку позволяет корректно освободить ресурсы и сообщить о недоступности сервиса.

Управляемые транзакции

Попытка используется в паре с транзакциями: если внутри транзакции произошла ошибка, в блоке Исключение вызывается ОтменитьТранзакцию(). Без этого база может остаться в промежуточном состоянии с частично записанными данными.

bsl
НачатьТранзакцию();
Попытка
    ДокументОбъект.Записать();
    РегистрНабор.Записать();
    ЗафиксироватьТранзакцию();
Исключение
    ОтменитьТранзакцию();
    ВызватьИсключение ОписаниеОшибки();
КонецПопытки;

Оператор ВызватьИсключение и проброс ошибок

Иногда обработчик не может полностью разрешить ситуацию — например, процедура записала ошибку в журнал, но вызывающий код тоже должен узнать о сбое. Для этого служит оператор ВызватьИсключение: он генерирует новое исключение с заданным текстом или повторно выбрасывает текущее.

Вызов ВызватьИсключение без параметров внутри блока Исключение пробрасывает исходную ошибку наверх по стеку. Это правильный паттерн для «обработал, но не решил»: локальная логика зафиксировала сбой, а решение о судьбе всей операции принимает вызывающий уровень.

Маршрут решения

Как выбрать действие в блоке Исключение

Ошибка локальна и есть безопасное значение по умолчаниюЗапишите в журнал и подставьте значение по умолчанию
Сбой внутри транзакцииОтмените транзакцию и пробросьте исключение выше
Причина неизвестна или затрагивает целостность данныхЗафиксируйте подробное описание и прервите операцию с понятным сообщением

Типичные ошибки при использовании Попытки

Типичные ошибки
01
Пустой блок Исключение — ошибка проглатывается, и сбой проявляется позже в непредсказуемом месте
02
Оборачивание всей процедуры целиком — теряется точная локализация ошибки, обработка становится бесполезной
03
Использование Попытки для управления логикой вместо проверок условиями — код медленнее и хуже читается
04
Продолжение работы после ошибки в транзакции без её отмены — рассогласование данных в базе
05
Показ пользователю сырого текста исключения вместо понятного сообщения

Отдельная распространённая проблема — использование Попытки как замены обычной проверки. Например, вместо Если ЗначениеЗаполнено(Ссылка) разработчик обращается к реквизиту внутри Попытки. Такой код работает медленнее и маскирует реальные дефекты данных. Исключения — для исключительных ситуаций, а не для штатной логики.

Ещё одна ошибка — вложенные Попытки без необходимости. Вложенность допустима, но каждый уровень должен иметь осмысленный обработчик; иначе стоит оставить одну внешнюю Попытку.

Как проверить, что обработка работает правильно

После внедрения обработчика нужно убедиться, что он действительно перехватывает ошибку и оставляет систему в корректном состоянии. Проверяется это моделированием сбоя: например, временной передачей заведомо неверного пути к файлу или отключением веб-сервиса.

Контрольные точки

Как проверить результат

Журнал регистрации после тестового сбоя
Норма

Есть запись с уровнем Ошибка и понятным описанием

Тревожный признак

Записей нет — исключение проглочено молча

Состояние данных после ошибки в транзакции
Норма

Частичных записей нет, данные согласованы

Тревожный признак

Объект записан частично — транзакция не отменена

Сообщение пользователю
Норма

Понятный текст и рекомендуемое действие

Тревожный признак

Технический текст исключения или отсутствие сообщения

Полезно также проверить граничный случай: ошибка в самом обработчике. Если в блоке Исключение происходит новый сбой (например, при записи в журнал), исключение уйдёт выше без обработки. Критичные обработчики стоит делать максимально простыми.

FAQ: частые вопросы о Попытке в 1С

Можно ли использовать Попытку без блока Исключение?

Синтаксически да — конструкция Попытка…КонецПопытки допустима. Но тогда ошибка будет полностью скрыта без диагностики. Такой приём оправдан крайне редко, например при попытке удалить временный файл, которого может не быть.

Чем ВызватьИсключение отличается от Сообщить?

Сообщить только выводит текст пользователю и не прерывает выполнение. ВызватьИсключение генерирует ошибку времени выполнения, останавливает текущий код и передаёт управление ближайшему обработчику Исключение выше по стеку.

Работает ли Попытка в фоновых заданиях?

Да, механизм работает и в фоновых заданиях. Более того, там он особенно важен: необработанное исключение завершит задание аварийно, а обработчик позволит записать причину в журнал и, при необходимости, запланировать повторный запуск.

Снижает ли Попытка производительность кода?

Сама по себе конструкция почти ничего не стоит. Замедление возникает только при фактическом возникновении исключения — разворачивание стека и формирование объекта ошибки требуют ресурсов. Поэтому Попытку не следует использовать вместо обычных проверок в штатной логике.

Как получить текст ошибки вне блока Исключение?

Напрямую — никак: ИнформацияОбОшибке() осмысленна только внутри обработчика. Если текст нужен дальше, сохраните его в переменную внутри блока Исключение и передавайте дальше как обычное строковое значение.

Что делать, если ошибка возникает внутри самого блока Исключение?

Такое исключение не перехватывается текущей Попыткой и уходит выше по стеку вызовов. Чтобы этого избежать, держите код обработчика минимальным: запись в журнал, отмена транзакции, присвоение безопасного значения — без сложной логики.

Итог

Что важно запомнить

Попытка в 1С — это механизм перехвата ошибок времени выполнения: защищаемый код в блоке Попытка, реакция на сбой в блоке Исключение с диагностикой через ИнформацияОбОшибке. Всегда фиксируйте ошибку в журнале, отменяйте транзакции при сбое и не используйте исключения вместо обычных проверок.