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

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

Как вывести ошибку в 1С: все рабочие способы с примерами кода

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

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

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

Способ 1. Сообщить — вывод текста в панель сообщений

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

НовоеСообщение = Новый СообщениеПользователю;

НовоеСообщение.Текст = "Не заполнено обязательное поле «Контрагент»";

НовоеСообщение.Поле = "Контрагент";

НовоеСообщение.УстановитьДанные(ЭтотОбъект);

НовоеСообщение.Сообщить();

Свойство Поле привязывает сообщение к конкретному полю формы — при двойном щелчке по сообщению курсор перейдёт к этому полю. Метод УстановитьДанные() привязывает сообщение к объекту, что важно при проведении документов: сообщение сохранится и покажется при повторном открытии.

Упрощённый вариант через глобальный контекст: Сообщить("Текст ошибки", СтатусСообщения.Важное);. Статус влияет на иконку сообщения: Обычное, Информация, Внимание, Важное, ОченьВажное, БезСтатуса.

Способ 2. ВызватьИсключение — остановка с откатом транзакции

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

Если Не ЗначениеЗаполнено(Договор) Тогда

ВызватьИсключение "Невозможно провести документ: не указан договор контрагента";

КонецЕсли;

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

Если Не ЗначениеЗаполнено(Склад) Тогда

Сообщить("Не указан склад", СтатусСообщения.Важное);

Отказ = Истина;

КонецЕсли;

Если Не ЗначениеЗаполнено(Договор) Тогда

Сообщить("Не указан договор", СтатусСообщения.Важное);

Отказ = Истина;

КонецЕсли;

Сравнение вариантов

Сообщить

Код продолжает работать. Подходит для предупреждений и сбора нескольких ошибок. Не откатывает транзакцию сам по себе.

ВызватьИсключение

Мгновенная остановка, откат транзакции. Подходит для критических сбоев. Показывает только одну ошибку за раз.

Отказ = Истина

Работает только в предопределённых обработчиках (проведение, запись, заполнение). Документ не сохраняется, но можно показать все ошибки списком.

Способ 3. Перехват и вывод ошибки через Попытка — Исключение

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

Попытка

Результат = Значение1 / Значение2;

Исключение

ИнфоОшибки = ИнформацияОбОшибке();

Сообщить("Ошибка расчёта: " + ИнфоОшибки.Описание, СтатусСообщения.Важное);

// Подробности для разработчика:

// ИнфоОшибки.ПодробноеОписаниеОшибки, ИнфоОшибки.ИмяМодуля, ИнфоОшибки.НомерСтроки

КонецПопытки;

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

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

Способ 4. Запись ошибки в журнал регистрации

Журнал регистрации — штатное хранилище технических событий 1С. Записи в нём видят администраторы и разработчики через раздел «Администрирование — Обслуживание — Журнал регистрации» (в типовых конфигурациях путь может отличаться). Пользователю сообщение не показывается.

ЗаписьЖурналаРегистрации(

"ОбменДанными.Загрузка", // имя события

УровеньЖурналаРегистрации.Ошибка, // уровень важности

, // метаданные (необязательно)

СсылкаНаОбъект, // данные (необязательно)

ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()) // комментарий

);

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

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

Способ 5. Предупреждение и диалоговые окна в управляемых формах

Модальное окно с кнопкой «ОК» выводится методом Предупреждение (устаревший, синхронный) или ПоказатьПредупреждение (рекомендуемый, асинхронный). В веб-клиенте и при отключённых модальных вызовах работает только второй вариант.

// Современный асинхронный вариант

ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗакрытияПредупреждения", ЭтотОбъект);

ПоказатьПредупреждение(ОписаниеОповещения,

"Операция не выполнена: нет связи с сервером",

10, // таймаут в секундах, 0 — без таймаута

"Ошибка операции");

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

Вывод ошибок в типовых конфигурациях и при обмене

В типовых решениях (БП, УТ, ERP, ЗУП) поверх платформенных механизмов работает Библиотека стандартных подсистем. Для сообщений пользователю там применяется общий модуль ОбщегоНазначения.СообщитьПользователю(), который сам формирует объект СообщениеПользователю и привязывает его к данным:

ОбщегоНазначения.СообщитьПользователю(

"Не удалось согласовать заявку: превышен лимит бюджета",

, // ключ данных

"СуммаДокумента", // поле

, // путь к данным

Отказ); // флаг отказа

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

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

Как выбрать способ вывода

Нужно показать некритичное замечание и продолжить работуСообщить / СообщениеПользователю
Ошибка критична, данные не должны записатьсяВызватьИсключение или Отказ = Истина в обработчике
Ошибка в фоновом задании или обмене без интерфейсаЗаписьЖурналаРегистрации с уровнем Ошибка
Нужно гарантированно привлечь внимание пользователяПоказатьПредупреждение с обработчиком оповещения

Частые ошибки при выводе ошибок

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

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

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

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

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

Текст появился в панели сообщений, привязка к полю работает

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

Панель пуста — проверьте, не выполняется ли код на сервере без возврата сообщений

Исключение
Норма

Выполнение остановлено, транзакция откачена, данные в базе не изменились

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

Документ записался частично — значит, вместо исключения использовано Сообщить

Журнал регистрации
Норма

Запись с уровнем Ошибка находится фильтром по событию

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

Записи нет — проверьте, что код дошёл до ЗаписьЖурналаРегистрации

Частые вопросы

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

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

Почему сообщение не видно пользователю, хотя Сообщить выполнился?

Чаще всего код выполняется в фоновом задании, при обмене данными или на сервере в контексте, где сообщения не возвращаются в клиентский сеанс. Проверьте панель сообщений (она может быть скрыта) и убедитесь, что для серверных вызовов сообщения передаются через Форма.ПолучитьСообщенияПользователю() или дублируются в журнал регистрации.

Как вывести текст системной ошибки, которую поймала Попытка?

Внутри блока Исключение вызовите ИнформацияОбОшибке() и используйте свойство Описание для короткого текста или функцию ПодробноеПредставлениеОшибки() для полного. Устаревшая функция ОписаниеОшибки() тоже работает, но даёт меньше информации.

Можно ли вывести несколько ошибок одновременно?

Да. В предопределённых обработчиках (ОбработкаПроведения, ПередЗаписью, ОбработкаЗаполнения) вызывайте Сообщить для каждой проблемы и в конце установите Отказ = Истина. Пользователь увидит весь список замечаний сразу, а документ не будет записан.

Куда писать ошибки из регламентных заданий?

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

Работает ли Предупреждение в веб-клиенте?

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

Итог

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

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