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

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

Как вывести предупреждение в 1С: инструкция с примерами кода

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

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

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

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

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

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

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

Сравнение вариантов

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

Стандарт для 8.3, работает в тонком, толстом и веб-клиенте, поддерживает режим Такси. Требует асинхронного стиля кода.

Предупреждение (модальный)

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

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

Когда блокировка не нужна: текст уходит в панель сообщений и не требует нажатия кнопки.

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

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

Простейший пример, который можно вставить в клиентскую процедуру формы:

&НаКлиенте

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

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

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

"Не выбран контрагент. Проведение невозможно.", 20, "Проверка данных");

Возврат;

КонецЕсли;

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

Таймаут задаётся в секундах: по его истечении окно закроется само. Значение 0 означает, что окно будет ждать нажатия кнопки бесконечно. Заголовок отображается в шапке окна; если его не указать, платформа подставит стандартный текст.

Порядок действий
  1. 1
    Откройте модуль формы или общий клиентский модуль в конфигураторе.
  2. 2
    Определите место проверки условия, при котором нужно предупреждение.
  3. 3
    Вставьте вызов ПоказатьПредупреждение с текстом, таймаутом и заголовком.
  4. 4
    Если после закрытия нужна реакция — создайте экспортную процедуру и передайте её через Новый ОписаниеОповещения.
  5. 5
    Обновите конфигурацию базы данных и проверьте окно в пользовательском режиме.

Обработка результата: описание оповещения

Асинхронная модель означает, что код после вызова ПоказатьПредупреждение продолжит выполняться сразу, не дожидаясь закрытия окна. Если логика зависит от того, что пользователь прочитал сообщение (например, после предупреждения нужно открыть другую форму), эту логику помещают в отдельную процедуру, вызываемую через ОписаниеОповещения.

&НаКлиенте

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

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

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

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

&НаКлиенте

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

ОбновитьИнтерфейс();

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

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

Устаревший метод Предупреждение: когда он ещё встречается

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

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

Вывод предупреждения с сервера и особенности контекста

Методы ПоказатьПредупреждение и Предупреждение доступны только на клиенте. Вызов их в серверной процедуре (&НаСервере) приведёт к ошибке компиляции или выполнения. Если условие проверяется на сервере, а показать окно нужно пользователю, правильный путь — вернуть признак или текст на клиент и вызвать предупреждение уже там.

&НаКлиенте

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

ТекстОшибки = ПроверитьНаСервере();

Если ТекстОшибки <> "" Тогда

ПоказатьПредупреждение(Неопределено, ТекстОшибки, 0, "Ошибка проведения");

Возврат;

КонецЕсли;

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

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

Как оформить текст и не злоупотреблять окнами

Текст предупреждения должен отвечать на два вопроса: что случилось и что делать пользователю. Формулировка «Ошибка!» без деталей бесполезна, а «Документ не проведён: не заполнена организация. Заполните поле и повторите проведение» позволяет исправить ситуацию без обращения к программисту. Внутри текста допустимы переносы строк через Символы.ПС.

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

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

Проверка результата и ограничения

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

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

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

Появление окна
Норма

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

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

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

Таймаут
Норма

Окно закрывается само через указанное число секунд

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

Окно висит бесконечно при ненулевом таймауте — проверьте тип параметра

Оповещение
Норма

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

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

Ошибка «Процедура не обнаружена» — нет слова Экспорт или неверное имя

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

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

Чем предупреждение отличается от сообщения пользователю?

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

Как вывести предупреждение с кнопками «Да» и «Нет»?

Никак: у предупреждения всегда одна кнопка. Для выбора используйте ПоказатьВопрос с режимом диалога РежимДиалогаВопрос.ДаНет и обработкой кода возврата в процедуре оповещения.

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

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

Можно ли вывести предупреждение из фонового задания?

Нет, у фонового задания нет интерактивного интерфейса. Используйте запись в журнал регистрации, отправку уведомления по почте или передачу результата через ДлительныеОперации с последующим показом окна на клиенте.

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

Передайте третьим параметром таймаут в секундах, например: ПоказатьПредупреждение(Неопределено, "Данные сохранены", 10). При значении 0 окно будет ждать нажатия кнопки бесконечно.

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

Старый метод останавливал выполнение кода, новый — нет. Весь код, который должен выполниться после закрытия окна, перенесите в экспортную процедуру и вызывайте её через Новый ОписаниеОповещения.

Итог

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

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