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

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

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

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

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

Выбор способа зависит от контекста: где выполняется код (клиент или сервер), нужно ли остановить выполнение, требуется ли привязка сообщения к конкретному полю формы. Неправильный выбор приводит к типичным проблемам: сообщение «теряется» при серверном вызове, транзакция не откатывается, пользователь видит технический текст вместо понятного пояснения.

Метод Сообщить(): самый простой способ

Метод Сообщить() выводит текст в окно сообщений (в управляемом приложении — в панель сообщений внизу окна). Это самый быстрый способ информирования, подходящий для отладки и простых уведомлений.

Сообщить("Не заполнен обязательный реквизит: Контрагент");

Вторым параметром можно передать статус сообщения, который влияет на оформление (иконку):

Сообщить("Документ успешно записан", СтатусСообщения.Информация);

Сообщить("Внимание: остаток на складе отрицательный", СтатусСообщения.Внимание);

Сообщить("Ошибка проведения документа", СтатусСообщения.Важное);

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

Объект СообщениеПользователю: привязка к полям формы

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

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

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

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

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

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

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

Дополнительно можно указать свойство КлючДанных — ссылку на объект информационной базы. Тогда сообщение будет связано с конкретной ссылкой, что полезно при пакетной обработке документов: пользователь сможет перейти к проблемному объекту прямо из сообщения.

Сообщение.КлючДанных = ДокументСсылка;
Как вывести сообщение с привязкой к полю
  1. 1
    Создайте объект: Новый СообщениеПользователю
  2. 2
    Заполните свойство Текст понятной формулировкой
  3. 3
    Укажите Поле — путь к реквизиту формы
  4. 4
    Вызовите УстановитьДанные() с объектом формы
  5. 5
    Вызовите метод Сообщить() и проверьте подсветку поля

Исключения: прерывание выполнения с сообщением об ошибке

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

Если НЕ ЗначениеЗаполнено(Объект.Контрагент) Тогда

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

КонецЕсли;

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

Попытка

ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);

Исключение

Сообщить("Ошибка проведения: " + ОписаниеОшибки());

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

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

Сравнение способов вывода ошибки

Сообщить()

Быстро и просто, но без привязки к полю и без прерывания кода. Подходит для отладки и уведомлений.

СообщениеПользователю

Привязка к полю формы и к ссылке на объект. Стандарт для управляемых форм, не прерывает выполнение.

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

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

ПоказатьПредупреждение()

Модальное окно на клиенте. Требует внимания пользователя, работает только в клиентском контексте.

Модальные и асинхронные предупреждения на клиенте

Если нужно гарантированно привлечь внимание пользователя, на клиенте применяется ПоказатьПредупреждение(). Метод асинхронный: первым параметром передаётся описание оповещения — процедура, которая выполнится после закрытия окна.

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

ПоказатьПредупреждение(Оповещение, "Перед записью заполните дату документа", , "Ошибка заполнения");

Для выбора пользователя (Да/Нет, ОК/Отмена) используйте ПоказатьВопрос() с аналогичной механикой оповещений. Помните: модальные вызовы запрещены на сервере и недоступны в веб-клиенте для некоторых сценариев — проверяйте контекст выполнения директивами компиляции.

1c
&НаКлиенте
Процедура КомандаПроверить(Команда)
    Если НЕ ЗначениеЗаполнено(Объект.Дата) Тогда
        ПоказатьПредупреждение(, "Укажите дату документа", , "Проверка данных");
        Возврат;
    КонецЕсли;
КонецПроцедуры

Вывод ошибок при записи и проведении документов

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

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

Если СуммаДокумента <= 0 Тогда

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

Сообщение.Текст = "Сумма документа должна быть больше нуля";

Сообщение.Поле = "СуммаДокумента";

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

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

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

КонецЕсли;

КонецПроцедуры;

Такой подход позволяет вывести сразу несколько ошибок за одну проверку — пользователь увидит полный список проблем, а не будет исправлять их по одной. Исключение в этом случае использовать не нужно: флаг Отказ уже гарантирует отмену записи.

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

Логирование ошибок: журнал регистрации

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

ЗаписьЖурналаРегистрации("Обмен данными.Загрузка",

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

"Ошибка загрузки файла: " + ОписаниеОшибки());

Комбинация «сообщение пользователю + запись в журнал» — стандарт промышленной разработки: пользователь получает понятное пояснение, а администратор или разработчик позже находит технические детали в журнале через раздел «Администрирование — Обслуживание — Журнал регистрации».

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

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

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

Проверка результата и частые проблемы

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

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

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

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

Появление сообщения
Норма

Текст виден в панели сообщений формы

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

Сообщения нет — проверьте контекст выполнения кода

Привязка к полю
Норма

Клик по сообщению подсвечивает нужное поле

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

Поле не подсвечивается — проверьте свойства Поле и УстановитьДанные

Отказ от записи
Норма

Документ с ошибкой не появляется в списке

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

Документ записался — не установлен Отказ или не вызвано исключение

Запись в журнале
Норма

Событие видно в журнале регистрации с уровнем Ошибка

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

Записи нет — проверьте вызов ЗаписьЖурналаРегистрации

Итог

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

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

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

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

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

Чем ВызватьИсключение отличается от установки Отказ = Истина?

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

Как вывести пользователю текст системной ошибки понятным языком?

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

Можно ли вывести сообщение об ошибке в фоновом задании?

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

Работает ли Сообщить() в тонком и веб-клиенте?

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

Как сгруппировать несколько ошибок в одно сообщение?

Либо выводите каждую ошибку отдельным объектом СообщениеПользователю в цикле — это предпочтительно, так как сохраняется привязка к полям, либо соберите тексты в массив, объедините через СтрСоединить() с разделителем перевода строки и выведите одним сообщением, если привязка не нужна.