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

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

Как вывести окно ошибки в 1С

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

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

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

Какие способы вывода ошибки существуют в 1С

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

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

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

Сообщить()

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

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

Подходит, когда нужна гарантированная реакция пользователя; работает только на клиенте, в асинхронном режиме требует описания оповещения.

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

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

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

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

Как вывести простое сообщение через Сообщить()

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

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

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

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

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

Когда пользователь должен гарантированно увидеть ошибку и подтвердить, что прочитал её, применяется ПоказатьПредупреждение(). Метод доступен только в клиентском контексте — на сервере его вызов приведёт к ошибке.

&НаКлиенте

Процедура ПроверитьДанные(Команда)

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

ПоказатьПредупреждение(, "Заполните поле ""Контрагент""!", 10, "Ошибка проверки");

Возврат;

КонецЕсли;

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

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

Как обработать закрытие окна

Если после закрытия предупреждения нужно выполнить действие, передайте первым параметром описание оповещения:

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

ПоказатьПредупреждение(Оповещение, "Документ не проведён: есть ошибки.");

&НаКлиенте

Процедура ПослеЗакрытияПредупреждения(ДополнительныеПараметры) Экспорт

// Действия после того, как пользователь закрыл окно

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

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

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

&НаСервере

Процедура ЗаписатьДанные()

Если Не ПроверитьПрава() Тогда

ВызватьИсключение "Недостаточно прав для выполнения операции.";

КонецЕсли;

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

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

Как привязать ошибку к полю формы через СообщениеПользователю

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

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

Сообщение.Текст = "Укажите дату отгрузки.";

Сообщение.Поле = "ДатаОтгрузки";

Сообщение.ПутьКДанным = "Объект";

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

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

Именно этот способ используется в типовых конфигурациях при проверке заполнения. Если сообщение создаётся в обработчике ОбработкаПроверкиЗаполнения, достаточно установить параметр Отказ = Истина — платформа сама покажет сообщения и заблокирует запись объекта.

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

Как выбрать способ в зависимости от контекста

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

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

Как выбрать действие

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

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

Типичные ошибки при выводе окон ошибок

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

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

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

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

Отображение сообщения
Норма

Текст виден пользователю в панели сообщений или в окне

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

Сообщение не появляется — проверьте контекст выполнения (клиент/сервер)

Модальное окно
Норма

Окно открывается, после закрытия выполняется код из описания оповещения

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

Код после ПоказатьПредупреждение выполняется до закрытия окна — логика не вынесена в оповещение

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

Клик по сообщению активирует нужный реквизит формы

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

Привязки нет — проверьте свойства Поле и ПутьКДанным

Исключение в транзакции
Норма

После ошибки данные не изменились

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

Часть данных записалась — исключение вызвано вне транзакции

FAQ

Чем отличается Сообщить() от СообщениеПользователю?

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

Почему ПоказатьПредупреждение не работает в серверной процедуре?

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

Как вывести окно ошибки с кнопками «Да» и «Нет»?

Используйте ПоказатьВопрос() с описанием оповещения и режимом диалога РежимДиалогаВопрос.ДаНет. Результат выбора пользователя придёт в процедуру оповещения параметром.

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

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

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

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

Как сделать, чтобы окно предупреждения закрывалось автоматически?

Передайте в ПоказатьПредупреждение третьим параметром таймаут в секундах, например 10. Если указать 0 или опустить параметр, окно будет ждать действия пользователя бессрочно.

Итог

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

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