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

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

Как в 1С написать сообщение пользователям

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

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

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

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

Вывод простого сообщения через Сообщить()

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

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

bsl
// Клиентский контекст, управляемая форма
&НаКлиенте
Процедура КомандаПроверить(Команда)
	Сообщить("Проверка запущена", СтатусСообщения.Информация);
	Сообщить("Найдено ошибок: " + КоличествоОшибок, СтатусСообщения.Важное);
КонецПроцедуры

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

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

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

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

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

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

Окна предупреждений и оповещения

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

bsl
&НаКлиенте
Процедура УдалитьДанные(Команда)
	Оповещение = Новый ОписаниеОповещения("ПослеВопросаОбУдалении", ЭтотОбъект);
	ПоказатьВопрос(Оповещение, "Удалить выбранные записи? Действие необратимо.",
		РежимДиалогаВопрос.ДаНет, 20, КодВозвратаДиалога.Нет);
КонецПроцедуры

&НаКлиенте
Процедура ПослеВопросаОбУдалении(Результат, ДопПараметры) Экспорт
	Если Результат = КодВозвратаДиалога.Да Тогда
		УдалитьДанныеНаСервере();
	КонецЕсли;
КонецПроцедуры

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

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

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

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

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

Сравнение вариантов

Система взаимодействий (БСП)

Мгновенная доставка, история обсуждений. Требует регистрации сервера взаимодействий и БСП в конфигурации.

Регистр сведений + опрос

Работает в любой конфигурации без внешних сервисов. Задержка доставки равна интервалу проверки, нужна своя форма просмотра.

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

Только текущий сеанс текущего пользователя. Подходит для уведомлений о результате операции, а не для рассылки.

Выбор способа под конкретную задачу

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

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

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

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

Типичные ошибки и проверка результата

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

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

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

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

Панель сообщений после выполнения кода
Норма

Сообщение видно с нужным статусом и текстом

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

Панель пуста — код серверный, а вызов завершился отказом транзакции

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

Курсор переходит в нужное поле формы

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

Ничего не происходит — в свойстве Поле неверный путь к данным

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

Диалоги асинхронные, ошибок нет

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

Ошибка о модальных вызовах — замените на Показать... с оповещением

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

Итог

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

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

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

Почему Сообщить() в серверной процедуре не показывает текст сразу?

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

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

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

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

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

Как отправить сообщение всем пользователям, работающим в базе?

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

Куда писать сообщения из регламентных заданий?

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

Работает ли ПоказатьПредупреждение в обычном приложении?

Да, асинхронные методы ПоказатьПредупреждение и ПоказатьВопрос доступны и в обычном приложении. Но там также разрешены модальные Предупреждение() и Вопрос(), поэтому для совместимости кода между режимами лучше сразу использовать асинхронные версии с описанием оповещения.