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

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

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

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

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

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

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

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

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

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

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

Классический синхронный метод выглядит так:

Предупреждение("Не заполнено поле «Контрагент»!", 10, "Проверка данных");

Первый параметр — текст предупреждения, второй — таймаут в секундах (по истечении окно закроется само; 0 — без автозакрытия), третий — заголовок окна. Метод работает, только если в конфигураторе разрешены модальные вызовы: свойство конфигурации «Режим использования модальности» установлено в «Использовать» или «Использовать с предупреждениями».

Современный вариант, совместимый с отказом от модальности, — асинхронный вызов:

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

ПоказатьПредупреждение(ОписаниеОповещения, "Не заполнено поле «Контрагент»!", 10, "Проверка данных");

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

Порядок добавления предупреждения
  1. 1
    Определите, где выполняется код: клиент или сервер
  2. 2
    Проверьте режим использования модальности в свойствах конфигурации
  3. 3
    Для клиентского кода напишите вызов ПоказатьПредупреждение с описанием оповещения
  4. 4
    Создайте экспортную процедуру-обработчик, если нужна реакция на закрытие
  5. 5
    Протестируйте в тонком и веб-клиенте

Как показать вопрос с обработкой ответа пользователя

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

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

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

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

Процедура-обработчик принимает результат первым параметром:

&НаКлиенте

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

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

УдалитьДокументНаСервере();

КонецЕсли;

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

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

Как вывести предупреждение с сервера через сообщения

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

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

Сообщение.Текст = "Остаток по складу меньше требуемого количества";

Сообщение.Поле = "Товары[0].Количество";

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

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

Свойство Поле вместе с УстановитьДанные() делает сообщение кликабельным: при двойном щелчке курсор переходит к проблемному реквизиту формы. Это стандартное поведение для ошибок заполнения и проверок при проведении. В процедуре ОбработкаПроверкиЗаполнения после вывода сообщения нужно установить параметр Отказ = Истина, чтобы заблокировать запись объекта.

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

bsl
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "В строке " + Строка.НомерСтроки + " не указана номенклатура";
Сообщение.Поле = "Товары[" + (Строка.НомерСтроки - 1) + "].Номенклатура";
Сообщение.УстановитьДанные(Объект);
Сообщение.Сообщить();
Отказ = Истина;

Как вывести ненавязчивое оповещение

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

ПоказатьОповещениеПользователя("Запись выполнена", ,

"Документ №" + НомерДокумента + " успешно сохранён",

БиблиотекаКартинок.Информация);

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

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

Выбор способа уведомления

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

Критичная информация, требующая подтверждения прочтения. Блокирует сценарий до закрытия окна

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

Нужен выбор пользователя: продолжить, отменить, выбрать вариант. Результат обрабатывается в оповещении

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

Ошибки заполнения и проверки на сервере. Привязка к полю формы, не прерывает работу

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

Информационные уведомления о завершении операции. Не требует реакции, исчезает само

Настройки конфигурации и типичные ограничения

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

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

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

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

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

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

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

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

Появление окна предупреждения
Норма

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

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

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

Обработка ответа на вопрос
Норма

Каждая кнопка запускает свою ветку логики, закрытие крестиком обработано

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

Действие выполняется до ответа пользователя — логика не перенесена в обработчик

Серверное сообщение
Норма

Сообщение в панели, двойной щелчок ведёт к полю формы

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

Сообщение без привязки или запись объекта прошла несмотря на ошибку

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

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

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

Почему Предупреждение() выдаёт ошибку в тонком клиенте?

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

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

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

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

Передайте таймаут в секундах вторым параметром: ПоказатьПредупреждение(Оповещение, "Текст", 15). По истечении времени окно закроется, и в обработчик придёт значение по умолчанию. Учтите это в логике: автозакрытие не должно трактоваться как подтверждение действия.

Можно ли изменить кнопки в окне предупреждения?

В предупреждении доступна только кнопка «ОК». Если нужны другие варианты («Повторить», «Прервать», «Да/Нет»), используйте ПоказатьВопрос с подходящим значением РежимДиалогаВопрос или с произвольным списком кнопок через СписокЗначений.

Итог

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

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