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