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