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