Разработка и Конфигурация · 10 мин
Как вызвать ошибку 1С и зачем это нужно
Как намеренно вызвать ошибку 1С в тестовой базе: исключения в коде, отладка, проверка обработчиков. Безопасные методы, ограничения и частые ошибки.
Намеренный вызов ошибки в 1С — стандартный приём при разработке, тестировании и диагностике. Разработчику нужно проверить, как конфигурация реагирует на сбой: корректно ли откатывается транзакция, срабатывает ли обработчик исключений, записывается ли событие в журнал регистрации. Тестировщику — воспроизвести проблему пользователя, чтобы локализовать её причину.
Важно понимать разницу между управляемым исключением и реальным сбоем. Управляемое исключение создаётся штатными средствами встроенного языка и полностью контролируется разработчиком. Реальный сбой — деление на ноль, обращение к несуществующему реквизиту, потеря соединения с СУБД — возникает сам и может привести к потере несохранённых данных.
Все эксперименты с вызовом ошибок выполняйте только в копии базы или на тестовом стенде. В рабочей базе даже «безобидное» исключение, вызванное внутри транзакции записи документа, может оставить данные в несогласованном состоянии, если обработка ошибок в конфигурации реализована небрежно.
Как вызвать управляемое исключение командой «ВызватьИсключение»
Основной штатный способ — оператор ВызватьИсключение. Он прерывает выполнение кода и передаёт управление ближайшему блоку Попытка...Исключение, а если обработчика нет — выводит пользователю окно с текстом ошибки.
Минимальный пример для проверки через консоль кода или внешнюю обработку:
ВызватьИсключение "Тестовая ошибка: проверка обработчика исключений";Оператор принимает строку с описанием, которое попадёт в сообщение пользователю и в журнал регистрации. Если вызвать его без параметров внутри блока Исключение, будет повторно вызвано текущее исключение — так передают ошибку «наверх» по стеку вызовов.
Проверить результат просто: после выполнения кода на экране появляется стандартное окно «Ошибка» с вашим текстом, а в журнале регистрации (Администрирование → Обслуживание → Журнал регистрации) фиксируется событие с видом «Ошибка». Если окна нет, а код завершился молча — значит, исключение перехвачено обработчиком выше по стеку.
Как проверить блок «Попытка — Исключение»
Частая задача — убедиться, что обработчик исключений в существующем коде вообще работает. Для этого исключение вызывают внутри Попытка и смотрят, выполнилась ли ветка Исключение.
Попытка
ВызватьИсключение "Тест обработчика";
Исключение
Инфо = ИнформацияОбОшибке();
Сообщить("Перехвачено: " + Инфо.Описание);
КонецПопытки;Объект ИнформацияОбОшибке() даёт детали: описание, имя модуля, номер строки, стек вызовов. Если ваша ветка Исключение сработала и вывела сообщение — обработчик функционирует. Если сообщение не появилось, а исключение «вылетело» наружу — проверьте, не находится ли код в модуле, где исключения подавляются настройками, и нет ли синтаксической ошибки в самом блоке.
Полезный приём — временно вставить ВызватьИсключение в середину подозрительного алгоритма и посмотреть, дойдёт ли выполнение до этой точки. Если ошибка не появилась, значит, код до неё не выполняется: условие не срабатывает или процедура вообще не вызывается.
Как вызвать системную ошибку для диагностики
Иногда нужно воспроизвести не управляемое исключение, а реальную системную ошибку платформы — например, чтобы проверить поведение клиентского приложения или настройки кластера серверов. Несколько классических способов:
- Деление на ноль:
Результат = 1 / 0;— вызывает ошибку «Деление на 0». - Обращение к несуществующему свойству:
Х = Неопределено.Поле;— ошибка обращения к свойству. - Вызов несуществующего метода: обращение к процедуре, которой нет в модуле.
- Ошибка преобразования типа:
Число = Число("текст");— исключение при конвертации. - Обращение к удалённому объекту БД: получить ссылку, удалить объект другой транзакцией, затем обратиться к его реквизитам.
Системные ошибки отличаются от ВызватьИсключение тем, что их текст формирует платформа, а не разработчик. Это важно при тестировании обработчиков: ваш код должен корректно реагировать и на штатные ошибки платформы, а не только на собственные исключения.
Как вызвать ошибку блокировки данных
Ошибки управляемых блокировок — частый источник проблем в многопользовательском режиме. Чтобы воспроизвести конфликт блокировок, откройте два сеанса одной базы (например, два окна тонкого клиента под разными пользователями) и выполните в обоих запись одного и того же объекта с задержкой.
Порядок действий: в первом сеансе начните транзакцию и измените объект, не завершая запись (например, откройте форму документа и измените реквизит, установив монопольную блокировку через код). Во втором сеансе попытайтесь записать тот же объект. Через время ожидания, заданное в настройках, второй сеанс получит ошибку «Конфликт блокировки при выполнении транзакции».
- 1Создайте копию базы и запустите два сеанса под разными пользователями
- 2В первом сеансе откройте документ и начните редактирование, удерживая блокировку
- 3Во втором сеансе попытайтесь записать тот же документ программно
- 4Дождитесь истечения таймаута ожидания и зафиксируйте текст ошибки
- 5Проверьте, что оба сеанса корректно продолжили работу после отмены
Такой тест показывает, как конфигурация обрабатывает конкурентный доступ: выдаёт ли понятное сообщение пользователю, повторяет ли попытку записи, не «зависает» ли форма. Время ожидания блокировки задаётся в свойствах информационной базы в консоли кластера или через параметр соединения.
Как смоделировать ошибку обмена и веб-сервиса
Для проверки устойчивости интеграций ошибку вызывают на стороне внешней системы или прямо в коде обмена. Самый контролируемый способ — вызвать исключение внутри процедуры отправки или получения данных и убедиться, что очередь сообщений, регистрация изменений и повторные попытки работают как задумано.
Если нужно смоделировать недоступность веб-сервиса, укажите в настройках подключения заведомо неверный адрес или временно остановите публикацию на веб-сервере. Попытка вызова вернёт ошибку соединения — это позволит проверить таймауты и текст сообщения, который увидит пользователь.
Как использовать отладчик для вызова и анализа ошибок
Отладчик — самый безопасный инструмент: он не создаёт ошибку, а позволяет остановиться в нужной точке и вручную спровоцировать ситуацию. Включите отладку (в конфигураторе: Отладка → Начать отладку), поставьте точку останова перед подозрительной строкой и выполните действие в клиентском приложении.
Когда выполнение остановится, используйте «Табло» (Ctrl+Shift+F9) для вычисления произвольных выражений — например, выполните там ВызватьИсключение или обращение к переменной, чтобы увидеть реакцию системы в текущем контексте. Полезна и настройка «Остановка по ошибке» (Отладка → Остановка по ошибке): платформа прервёт выполнение в момент возникновения любого исключения, и вы увидите точное место и стек вызовов.
Как проверить результат эксперимента
Появилось с ожидаемым текстом
Окна нет либо текст не тот — исключение перехвачено раньше
Есть событие с уровнем «Ошибка» и нужным комментарием
События нет — ошибка подавлена обработчиком без записи в журнал
Тестовые объекты не изменились или откатились транзакцией
Объект записан частично — транзакция не отработала
Типичные ошибки при намеренном вызове сбоев
Отдельно отметим последний пункт: перед переносом доработок в рабочую базу выполните поиск по модулям на строку ВызватьИсключение и проверьте, что все отладочные вставки удалены или обёрнуты в осмысленные проверки с понятными текстами.
Что важно запомнить
Управляемую ошибку вызывают оператором «ВызватьИсключение», системную — делением на ноль или обращением к несуществующим объектам, конфликт блокировок — двумя конкурирующими сеансами. Все эксперименты проводят в копии базы, результат проверяют по окну ошибки, журналу регистрации и состоянию данных, а отладочный код удаляют перед переносом в рабочую среду.
Частые вопросы
Можно ли вызвать ошибку 1С без доступа к конфигуратору?
Да, если у вас есть права на запуск внешних обработок или консоли кода — они выполняют произвольный код в пользовательском режиме. Также многие системные ошибки (деление на ноль в поле ввода с выражением, некорректные данные при загрузке) воспроизводятся через обычный интерфейс. Но полноценная диагностика требует конфигуратор и отладчик.
Чем отличается «ВызватьИсключение» от «Сообщить»?
Сообщить просто выводит текст в панель сообщений и не прерывает выполнение кода. ВызватьИсключение полностью останавливает выполнение, передаёт управление обработчику и при отсутствии обработчика показывает модальное окно ошибки. Для имитации сбоя подходит только второй вариант.
Опасно ли вызывать исключение внутри транзакции?
Само по себе исключение безопасно: платформа откатывает незавершённую транзакцию. Опасность в коде, который перехватывает исключение и продолжает работу, не откатив транзакцию явно, — тогда часть изменений может зафиксироваться. Всегда проверяйте логику обработчика в тестовой базе.
Как проверить, что ошибка записалась в журнал регистрации?
Откройте журнал регистрации (в конфигураторе: Администрирование → Журнал регистрации, или в режиме предприятия через раздел администрирования), установите отбор по уровню «Ошибка» и нужному интервалу времени. Если события нет — обработчик исключения не вызвал ЗаписьЖурналаРегистрации, и ошибка зафиксирована только визуально.
Как смоделировать аварийное завершение сеанса?
Для клиент-серверной базы — завершить рабочий процесс сеанса через консоль кластера или «убить» процесс клиента в диспетчере задач. Для файловой базы достаточно завершить процесс клиентского приложения. Делайте это только в копии базы: аварийное завершение во время записи — классический способ получить повреждённые данные в файловом варианте.
Что делать, если тестовое исключение не появляется на экране?
Проверьте три вещи: не перехвачено ли исключение блоком Попытка...Исключение выше по стеку; действительно ли выполняется строка с вызовом (поставьте точку останова); не отключён ли показ ошибок в настройках клиента. Чаще всего причина — «молчаливый» обработчик, который перехватывает ошибку без какой-либо реакции.