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