При разработке и отладке в среде 1С:Предприятие многие программисты сталкиваются с тем, что при включении в конфигураторе опции «Останавливаться по ошибке» (меню Отладка — Настройка отладки), система начинает прерывать выполнение кода на участках, которые в обычном режиме работают без видимых проблем. Рассмотрим подробнее, что это за ошибки, стоит ли их бояться и нужно ли тратить время на их устранение.
Для начала разберем, как работает платформа, когда выполнение кода доходит до конструкции Попытка...Исключение. В обычном режиме пользователя, если внутри блока Попытка происходит ошибка, выполнение немедленно переходит в блок Исключение. Пользователь при этом не видит системного окна с ошибкой, и программа продолжает работу по заданному алгоритму.
Однако, если в конфигураторе установлена «галка» «Останавливаться по ошибке», отладчик перехватывает управление в момент возникновения исключительной ситуации, до того, как оно будет обработано кодом. Проанализируем ситуацию: это не означает, что программа «сломалась», это означает, что произошло событие, которое потенциально могло привести к сбою, но было предусмотрено разработчиком (или платформой).
Многие начинающие разработчики используют Попытка...Исключение как универсальный инструмент для проверки данных. Посмотрим на классический пример некорректного подхода:
Попытка
Сумма = Число(ВнешнийИсточник.Сумма);
Исключение
Сумма = 0;
КонецПопытки;
В данном случае, если во внешнем источнике придет строка вместо числа, платформа сгенерирует исключение. Выясним причину, почему это плохо:
Вместо использования исключений, проанализируем более правильный подход с использованием явных проверок. Разберем пример качественного кода:
// Проверяем тип данных или возможность преобразования без генерации ошибки
Если ОбщегоНазначения.СтрокаЯвляетсяЧислом(ВнешнийИсточник.Сумма) Тогда
Сумма = Число(ВнешнийИсточник.Сумма);
Иначе
Сумма = 0;
КонецЕсли;
Рассмотрим ситуацию, упомянутую в обсуждении: возникновение ошибок при записи объектов в контексте версирования. В типовых конфигурациях (использующих БСП) механизм версирования часто завязан на подписки на события ПриЗаписи или ПередЗаписью.
Если при включенной галке отладчик останавливается в модулях версирования, это может сигнализировать о серьезных проблемах:
Исключение, из-за чего запись объекта в базу проходит успешно, но история изменений не создается.В этом случае ошибки критичны. Если вы видите, что ошибка возникает в вашем коде — ее нужно исправить. Если в типовом (от БСП или вендора) — стоит проконсультироваться с техлидером, так как иногда платформенные механизмы намеренно используют исключения для проверки прав доступа или наличия свойств, и это считается «нормальным» (хотя и не идеальным) поведением.
Особую опасность представляют ситуации, когда разработчик оборачивает большие куски кода в блок Попытка, оставляя секцию Исключение пустой. Посмотрим на риски:
Попытка
НаборЗаписей = РегистрыНакопления.Продажи.СоздатьНаборЗаписей();
// ... заполнение набора ...
НаборЗаписей.Записать();
Исключение
// Ошибка просто игнорируется
КонецПопытки;
Выясним, что происходит в этот момент: если запись в регистр не удалась (например, из-за блокировки или нарушения уникальности), транзакция может оказаться в неопределенном состоянии. В худшем случае часть данных запишется, а часть — нет. При включенной галке отладчик покажет вам это место, и это ваш шанс предотвратить нарушение логической целостности базы данных.
Проанализируем стандарты разработки, которые приняты в профессиональной среде:
Файл.Существует() не гарантирует его доступность в момент открытия).Подводя итог: если отладчик останавливается на ошибке — это повод как минимум проанализировать это место. Если это ваш код и ошибку можно заменить условием Если...Тогда — сделайте это. Это повысит стабильность, скорость работы системы и облегчит жизнь коллегам, которые будут поддерживать ваш код в будущем.