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