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