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

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

Как вывести предупреждение пользователю в 1С

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

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

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

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

Какой способ выбрать: сравнение вариантов

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

Сравнение способов вывода сообщений

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

Окно с текстом и кнопкой ОК. Подходит для информирования и предупреждений. Требует описания оповещения, работает во всех клиентах.

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

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

ПоказатьВопрос

Диалог с кнопками Да/Нет/Отмена и обработкой ответа. Подходит для подтверждения действий, только на клиенте.

ПоказатьОповещениеПользователя

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

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

Метод вызывается только на клиенте — в тонком, толстом или веб-клиенте. Сигнатура: ПоказатьПредупреждение(ОписаниеОповещения, ТекстПредупреждения, Таймаут, Заголовок). Первый параметр — описание оповещения, которое будет вызвано после закрытия окна; если продолжение не нужно, передайте Неопределено.

Пример простого предупреждения без продолжения:

&НаКлиенте

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

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

"Операция завершена с ошибками. Проверьте журнал регистрации.",

0, "Внимание");

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

Если после закрытия окна нужно выполнить код, создайте описание оповещения и экспортную процедуру-обработчик:

&НаКлиенте

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

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

ПоказатьПредупреждение(Оповещение, "Данные будут отправлены без проверки.", 0, "Внимание");

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

&НаКлиенте

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

// продолжение логики после нажатия ОК

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

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

Сообщения об ошибках заполнения через СообщениеПользователю

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

&НаКлиенте

Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)

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

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

Сообщение.Текст = "Не заполнен контрагент";

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

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

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

Отказ = Истина;

КонецЕсли;

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

Свойство КлючДанных (или метод УстановитьДанные) связывает сообщение с объектом, а Поле — с конкретным реквизитом. Без этой привязки сообщение появится в общем списке и не подсветит проблемное поле. На сервере сообщения накапливаются и показываются пользователю после завершения вызова — поэтому метод безопасен для серверных процедур.

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

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

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

&НаКлиенте

Процедура КомандаОчистить(Команда)

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

ПоказатьВопрос(Оповещение, "Табличная часть будет очищена. Продолжить?",

РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет, "Подтверждение");

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

&НаКлиенте

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

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

Объект.Товары.Очистить();

КонецЕсли;

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

Обратите внимание на кнопку по умолчанию: для деструктивных действий (удаление, очистка) кнопкой по умолчанию должна быть безопасная — «Нет» или «Отмена». Тогда случайное нажатие Enter не приведёт к потере данных.

Немодальные оповещения для фоновых событий

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

ПоказатьОповещениеПользователя("Документ проведён",

ПолучитьНавигационнуюСсылку(Объект.Ссылка),

Строка(Объект.Ссылка), БиблиотекаКартинок.Информация);

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

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

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

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

Проверка результата и типичные ошибки

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

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

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

Открытие окна в тонком и веб-клиенте
Норма

Предупреждение появляется, текст читаем, заголовок корректный

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

Ошибка «Интерактивные операции недоступны» или молчание

Обработчик оповещения
Норма

После нажатия ОК выполняется продолжение кода

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

Процедура-обработчик не вызывается, логика теряется

Привязка сообщения к полю
Норма

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

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

Сообщение висит в общем списке без навигации

Конфигуратор: проверка модальности
Норма

Режим использования модальности «Не использовать», ошибок компиляции нет

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

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

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

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

Итог

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

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

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

Как вывести предупреждение на сервере 1С?

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

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

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

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

Передайте в третий параметр ПоказатьПредупреждение таймаут в секундах, например: ПоказатьПредупреждение(Неопределено, "Сохранено", 5). Через пять секунд окно закроется автоматически. Для важных сообщений оставляйте 0 — тогда окно ждёт нажатия ОК.

Как вывести сообщение с привязкой к полю табличной части?

В свойстве Поле укажите путь к данным с индексом строки, например: Сообщение.Поле = "Товары[2].Количество". Обязательно вызовите Сообщение.УстановитьДанные(Объект), иначе платформа не сможет сопоставить путь с элементом формы и подсветка не сработает.

Почему в веб-клиенте не появляется предупреждение?

Чаще всего причина в модальном вызове Предупреждение() при отключённом режиме модальности или в том, что код фактически выполняется на сервере. Проверьте директивы компиляции процедуры и замените вызов на ПоказатьПредупреждение с описанием оповещения.

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

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