Обработка ошибок в 1С: как писать надёжный код без перегрузки
Ошибка метода контекста в 1С?
Ошибки в 1С — неизбежная часть жизни любого разработчика. Программа может упасть из-за незаполненного поля, недоступной СУБД, сбоя драйвера или просто по вине криво написанного алгоритма. Чтобы система не развалилась окончательно, встроенный язык 1С поддерживает обработку ошибок — через конструкцию Попытка...Исключение и сопутствующие функции.
В этой статье разберём, как работает механизм обработки ошибок в платформах 8.1–8.3, чем отличается «обычная ошибка» от исключительной ситуации, и как писать код так, чтобы не утонуть в Попытках и Сообщить().
Откуда берутся ошибки в 1С
Ошибки возникают не только в коде. В 1С они могут быть следствием проблем в данных, окружении, платформе или логике самой конфигурации. Ниже — основные источники.
Ошибки в данных
- Незаполненные обязательные поля формы
- Неверные ссылки на объекты
- Противоречивые данные, которые не проходят валидацию
Пример: пользователь сохраняет документ, не заполнив контрагента — система выдаёт ошибку, но позволяет продолжить после исправления.
Ошибки в коде
- Неправильное использование переменных
- Нарушение типов данных
- Отсутствие проверок перед вызовами методов или обращением к объектам
Пример: в коде вызывается метод у Неопределено — без Попытки программа упадёт.
Ошибки окружения
- Потеря соединения с базой данных
- Ошибки сети при работе с внешними источниками
- Отказ драйверов, библиотек или СУБД
Пример: попытка отправить HTTP-запрос при отключённом интернете.
Ошибки платформы
- Сбои ядра 1С:Предприятие
- Несовместимость версий конфигурации и платформы
- Нарушения в механизмах транзакций или исполнения процедур
Пример: фоновое задание не завершается, вызывая зависание клиентского сеанса.
Ошибка ≠ Исключительная ситуация
- Ошибка — это восстановимая ситуация на уровне бизнес-логики. Её можно обработать, показать пользователю сообщение и продолжить выполнение.
- Исключительная ситуация — серьёзный сбой, чаще всего на уровне платформы. Часто приводит к аварийному завершению программы и требует перезапуска.
Как работает встроенный механизм обработки ошибок
Платформа 1С:Предприятие поддерживает встроенную конструкцию Попытка … Исключение … КонецПопытки, которая позволяет ловить ошибки исполнения во время выполнения скрипта. Этот механизм появился ещё в версии 8.1 и работал одинаково вплоть до 8.3.16 включительно.
Принцип работы
Всё, что находится внутри блока Попытка, исполняется как обычно. Если происходит ошибка — управление сразу передаётся в блок Исключение. При этом выполнение кода из оставшейся части блока Попытка прекращается.
Попытка
// потенциально опасный код
Результат = 1 / 0;
Исключение
Сообщить("Ошибка: " + ОписаниеОшибки());
КонецПопытки;
Что такое ОписаниеОшибки() и ИнформацияОбОшибке()
ОписаниеОшибки()— возвращает короткий текст с описанием ошибки, например:
«Недопустимая операция деления на 0»
ИнформацияОбОшибке()— возвращает структуру с подробностями: имя модуля, номер строки, тип исключения и т.п. Используется для логирования и технической диагностики.
Изменения с версии 8.3.17
Начиная с 8.3.17 механизм стал более чувствительным к системным сбоям. Часть исключений платформы перестали перехватываться обычной Попыткой — особенно те, что связаны с аварийными ошибками ядра, COM-объектами и повреждёнными транзакциями.
Где и как правильно использовать Попытку
Конструкция Попытка … Исключение полезна, но требует разумного применения. Использовать её «на всякий случай» — вредная практика, мешающая отладке и пониманию кода.
Когда использовать Попытку уместно:
- При работе с внешними сервисами (HTTP-запросы, COM-объекты, файловая система)
- В местах, где сбой допустим и должен быть отработан без остановки процесса
- При чтении/записи в нестабильные источники: FTP, сетевые ресурсы, сторонние базы
Пример корректного использования:
Попытка
Файл = Новый Файл("C:\temp\данные.txt");
Строки = Файл.Прочитать();
Исключение
ЗаписатьЛог("Ошибка чтения файла: " + ОписаниеОшибки());
КонецПопытки;
Где Попытка не нужна и вредна:
- При валидации данных — лучше использовать обычные
Если,Проверка,Возврат
- В бизнес-логике, где ошибка должна быть явно обработана, а не «заглушена»
- Во всем теле процедуры или функции — ухудшает читаемость, затрудняет отладку
Антипример:
Попытка
// весь код внутри, включая расчёты, логику и UI
...
Исключение
// ничего не делаем
КонецПопытки;
Такая конструкция не просто бесполезна — она скрывает реальные ошибки, не позволяет их анализировать и делает код непредсказуемым.
5. Как писать устойчивый код без избыточной обработки ошибок
Проверяйте данные до выполнения логики
Не нужно оборачивать каждый потенциально опасный участок в Попытку. Проще и безопаснее сделать проверку заранее:
Если Значение <> Неопределено Тогда
// логика
КонецЕсли;
Это читается лучше и снижает риск неконтролируемых исключений.
Используйте Попытку, только если ошибка — ожидаемое поведение
Если операция может упасть (например, при чтении файла или подключении к внешнему сервису), и это нормальная ситуация — используйте Попытку. Но не для подавления всех ошибок подряд.
Попытка
Данные = ПрочитатьИзФайла(Путь);
Исключение
ЗаписатьЛог("Не удалось прочитать файл: " + ОписаниеОшибки());
КонецПопытки;
Логируйте ошибки с деталями
Просто сообщение — мало. Используйте ИнформацияОбОшибке() или лог в файл, чтобы потом можно было восстановить контекст.
Исключение
Сообщить("Ошибка при загрузке: " + ОписаниеОшибки());
ЗаписатьВДиагностику(ИнформацияОбОшибке());
КонецПопытки;
Не оставляйте Исключение пустым
Если вы не обрабатываете ошибку — не заглушайте её. Лучше позволить системе упасть с понятным описанием, чем маскировать причину.
Попытка
...
Исключение
// ничего не делаем — плохо
КонецПопытки;
Не закрывайте всю функцию в Попытку
Это ухудшает читаемость, мешает отладке и приводит к ситуации, когда ошибка не видна ни разработчику, ни пользователю.
Попытка
// всё подряд
Исключение
Сообщить("Что-то пошло не так");
КонецПопытки;
Лучше разделить критичные и безопасные участки, чтобы точно понимать, где возможен сбой
Обработка ошибок в 1С — это не про «завернуть всё в Попытку на всякий случай». Это про понимание, где ошибка может произойти, как она повлияет на работу пользователя и нужно ли продолжать выполнение после сбоя.
Хороший код в 1С:
- заранее проверяет данные,
- отделяет бизнес-логику от нестабильных операций,
- логирует реальные сбои,
- не скрывает ошибки, которые нужно исправлять.
Попытка — это инструмент, а не защита от всех проблем. Используйте её осознанно, чтобы не плодить неустойчивые конструкции, а создавать предсказуемую и отлаживаемую систему.
