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

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

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

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

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

Частая путаница возникает из-за того, что Сообщить() в тонком клиенте не показывает отдельное окно, а выводит текст в панель сообщений, поэтому пользователь может его просто не заметить. Если нужен именно модальный диалог, который нельзя проигнорировать, используются другие методы. Ниже разобраны все рабочие варианты с примерами кода, различия между ними и типичные ошибки разработчиков.

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

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

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

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

Вывод окна через ПоказатьПредупреждение

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

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

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

"Не удалось записать документ: не заполнен контрагент.",

0,

"Ошибка записи"

);

Второй параметр — текст сообщения, третий — таймаут в секундах (0 означает, что окно не закроется само), четвёртый — заголовок окна. Если оповещение не нужно, первым параметром передаётся Неопределено.

Процедура-обработчик оповещения должна быть объявлена в том же модуле с директивой &НаКлиенте:

&НаКлиенте

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

// Действия после того, как пользователь нажал «ОК»

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

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

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

&НаСервере

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

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

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

КонецЕсли;

// Дальнейшая логика записи

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

Перехватить исключение и обработать его самостоятельно можно так:

Попытка

ЗаписатьДокумент();

Исключение

ИнформацияОбОшибке = ИнформацияОбОшибке();

Сообщить("Ошибка: " + ИнформацияОбОшибке.Описание);

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

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

Вывод сообщения через Сообщить и привязка к полю формы

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

&НаКлиенте

Процедура ПроверитьЗаполнение()

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

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

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

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

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

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

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

КонецЕсли;

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

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

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

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

&НаКлиенте

Процедура ОбработатьОшибкуОбмена()

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

ПоказатьВопрос(Оповещение,

"Ошибка обмена данными. Повторить попытку?",

РежимДиалогаВопрос.ПовторитьОтмена,

20,

КодВозвратаДиалога.Отмена,

"Ошибка обмена");

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

&НаКлиенте

Процедура ПослеВопросаОбОшибке(Результат, ДополнительныеПараметры) Экспорт

Если Результат = КодВозвратаДиалога.Повторить Тогда

ВыполнитьОбмен();

КонецЕсли;

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

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

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

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

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

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

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

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

Как проверить, что окно ошибки работает правильно

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

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

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

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

Отображение окна
Норма

Окно появляется с понятным текстом и заголовком

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

Текст виден только в панели сообщений — значит, использован Сообщить()

Поведение после закрытия
Норма

Логика из оповещения выполняется, форма работает

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

Код после вызова выполнился до нажатия кнопки — забыта асинхронность

Контекст выполнения
Норма

Диалог вызывается только в клиентских процедурах

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

Ошибка выполнения в серверном коде — диалог вызван на сервере

Итог

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

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

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

Почему Сообщить() не показывает окно с ошибкой?

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

Как вывести окно ошибки из серверной процедуры?

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

Чем ВызватьИсключение отличается от ПоказатьПредупреждение?

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

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

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

Можно ли использовать старые методы Предупреждение() и Вопрос()?

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

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

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