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

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

Как вывести сообщение в 1С: все рабочие способы с примерами

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

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

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

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

Способ 1. Процедура Сообщить() — самый простой вывод текста

Процедура Сообщить() выводит текст в окно сообщений (панель сообщений) программы. Это самый старый и простой способ, доступный и на клиенте, и на сервере. Синтаксис минимален:

Сообщить("Документ успешно записан");

Вторым необязательным параметром можно указать статус сообщения, который влияет на пиктограмму в панели сообщений:

Сообщить("Не заполнен контрагент", СтатусСообщения.Важное);

Сообщить("Операция прервана", СтатусСообщения.ОченьВажное);

Сообщить("Для справки: курс загружен", СтатусСообщения.Информация);

Доступные статусы: Обычное, Информация, Внимание, Важное, ОченьВажное, БезСтатуса. Статус влияет только на оформление — пиктограмму рядом с текстом, но не на поведение программы.

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

Способ 2. СообщениеПользователю — с привязкой к полю формы

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

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

Сообщение.Текст = "Не заполнено поле ""Контрагент""";

Сообщение.Поле = "Контрагент";

Сообщение.ПутьКДанным = "Объект";

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

Разберём свойства. Текст — текст сообщения. Поле — имя реквизита объекта, к которому привязана ошибка. ПутьКДанным — путь к данным формы, содержащим это поле (для основного реквизита формы документа это обычно Объект). Если привязка не нужна, Поле и ПутьКДанным можно не заполнять — сообщение выведется как обычное.

Также доступно свойство КлючДанных — ссылка на объект информационной базы. Если оно заполнено, по двойному щелчку на сообщении откроется форма этого объекта. Это удобно, когда ошибка относится к другому документу или элементу справочника:

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

Сообщение.Текст = "По контрагенту есть незакрытый долг";

Сообщение.КлючДанных = СсылкаНаРасчетныйДокумент;

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

В обработчике ОбработкаПроверкиЗаполнения именно СообщениеПользователю является стандартным способом: сообщение выводится, а параметру Отказ присваивается Истина, что блокирует запись объекта до исправления ошибки.

bsl
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	Если Не ЗначениеЗаполнено(Договор) Тогда
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = "Укажите договор контрагента";
		Сообщение.Поле = "Договор";
		Сообщение.ПутьКДанным = "Объект";
		Сообщение.Сообщить();
		Отказ = Истина;
	КонецЕсли;
КонецПроцедуры

Способ 3. ПоказатьПредупреждение() и ПоказатьВопрос() — диалоги с пользователем

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

&НаКлиенте

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

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

ПоказатьВопрос(Оповещение, "Удалить выбранные строки?", РежимДиалогаВопрос.ДаНет);

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

&НаКлиенте

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

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

// выполняем удаление

КонецЕсли;

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

Процедура ПоказатьПредупреждение() работает аналогично, но только информирует пользователя с одной кнопкой «ОК»:

ПоказатьПредупреждение(, "Печатная форма сформирована", 10, "Результат");

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

Способ 4. ПоказатьОповещениеПользователя() — ненавязчивые уведомления

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

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

"Загрузка завершена",

ПолучитьНавигационнуюСсылку(СсылкаНаДокумент),

"Загружено 150 строк из файла",

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

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

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

Сравнение способов вывода

Сообщить()

Простой текст в панель сообщений. Работает на клиенте и сервере. Не привлекает внимания, не привязывается к полям.

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

Привязка к полю формы и к объекту по ссылке. Стандарт для ошибок проверки заполнения. Требует больше кода.

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

Диалог, требующий реакции. Только на клиенте, асинхронно, с описанием оповещения.

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

Ненавязчивое уведомление о завершении операции. Только на клиенте, не блокирует работу.

Как выбрать способ: условия и ограничения

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

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

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

Маршрут решения

Как выбрать действие

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

Типичные ошибки при выводе сообщений

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

Вторая ошибка — попытка показать диалог из серверного кода или из фонового задания. В фоновом задании интерактивные вызовы недоступны в принципе: сообщения оттуда имеет смысл писать через Сообщить() (они попадут в протокол задания через ПолучитьСообщенияПользователю()) или в журнал регистрации через ЗаписьЖурналаРегистрации().

Третья ошибка — неправильный ПутьКДанным в СообщениеПользователю. Если путь указан неверно, привязка к полю просто не сработает: сообщение выведется, но поле не подсветится. Для основного реквизита формы документа путь — Объект, для реквизита формы — имя самого реквизита. Проверить правильность можно, щёлкнув дважды по сообщению: курсор должен перейти к нужному полю.

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

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

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

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

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

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

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

Привязка сообщения к полю
Норма

Двойной щелчок по сообщению переводит курсор на поле, поле подсвечено

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

Сообщение есть, но поле не подсвечивается — проверьте Поле и ПутьКДанным

Работа диалога в веб-клиенте
Норма

ПоказатьВопрос() открывает окно, ответ приходит в процедуру оповещения

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

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

Сообщения из серверной процедуры
Норма

После завершения вызова все сообщения появляются в панели

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

Сообщений нет — проверьте, не очищен ли буфер ПолучитьСообщенияПользователю()

Часто задаваемые вопросы

Чем Сообщить() отличается от СообщениеПользователю?

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

Почему сообщение из серверной процедуры не видно сразу?

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

Как вывести сообщение и остановить выполнение кода?

Сообщить() сам по себе выполнение не прерывает. В модуле объекта используйте ВызватьИсключение с текстом ошибки — это и выведет сообщение, и прервёт операцию с откатом транзакции. В проверке заполнения достаточно вывести сообщение и установить Отказ = Истина.

Как вывести сообщение из фонового задания?

Интерактивные диалоги в фоновом задании недоступны. Используйте Сообщить() — эти сообщения можно получить из основного сеанса через метод фонового задания ПолучитьСообщенияПользователю(), либо записывайте события в журнал регистрации через ЗаписьЖурналаРегистрации().

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

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

Итог

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

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