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