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