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

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

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

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

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

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

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

Какие механизмы вывода сообщений существуют в 1С

В платформе 1С:Предприятие 8.3 доступно четыре основных способа показать текст пользователю. Они различаются контекстом выполнения (клиент или сервер), модальностью и возможностью привязки к элементам формы.

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

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

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

Сервер и клиент, привязка к полям формы, панель сообщений. Оптимален для ошибок проверки заполнения.

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

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

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

Только клиент, всплывающее уведомление. Хорош для фоновых процессов и несрочной информации.

Сообщить()

Работает везде, но без привязки к данным. Допустим для отладки и простых служебных выводов.

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

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

Типовой пример в процедуре ОбработкаПроверкиЗаполнения модуля объекта:

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

Если Не ЗначениеЗаполнено(Контрагент) Тогда

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

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

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

Сообщение.УстановитьДанные(ЭтотОбъект);

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

Отказ = Истина;

КонецЕсли;

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

Обратите внимание на три момента. Во-первых, свойство Поле содержит имя реквизита, а не его синоним. Во-вторых, метод УстановитьДанные() связывает сообщение с объектом — без него привязка к форме не сработает. В-третьих, флаг Отказ = Истина отменяет запись: само по себе сообщение документ не остановит.

Для сообщений из табличной части укажите путь с индексом строки через свойство ПутьКДанным либо сформируйте значение Поле вида "Товары[2].Количество" — тогда платформа подсветит конкретную ячейку.

bsl
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "В строке 3 не указано количество";
Сообщение.Поле = "Товары[2].Количество";
Сообщение.УстановитьДанные(Объект);
Сообщение.Сообщить();

Когда использовать ПоказатьПредупреждение

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

&НаКлиенте

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

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

ПоказатьПредупреждение(ОписаниеОповещения,

"Операция удалит данные без возможности восстановления.",

10, "Внимание");

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

Первый параметр — ОписаниеОповещения — задаёт процедуру, которая выполнится после закрытия окна. Это асинхронная модель: код не «ждёт» на строке вызова, а продолжение описывается отдельной процедурой. Если реакция не нужна, первый параметр можно опустить. Третий параметр — таймаут в секундах, после которого окно закроется само; значение 0 означает отсутствие таймаута.

ПоказатьОповещениеПользователя для фоновых уведомлений

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

&НаКлиенте

Процедура ОповеститьОЗавершении()

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

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

,

"Загружено 150 документов из файла обмена",

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

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

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

Устаревший метод Сообщить и обычные формы

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

Сообщить("Документ успешно проведён", СтатусСообщения.Информация);

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

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

Как выбрать способ: маршрут решения

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

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

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

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

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

Большинство проблем с сообщениями связано не с самим выводом, а с контекстом выполнения и ожиданиями разработчика относительно поведения платформы.

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

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

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

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

Привязка к полю
Норма

Двойной щелчок по сообщению активирует нужный реквизит формы

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

Сообщение отображается без связи с полем, курсор никуда не переходит

Отказ от записи
Норма

При ошибке заполнения документ не записывается

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

Сообщение выводится, но документ сохраняется

Контекст выполнения
Норма

Клиентские методы вызываются только в &НаКлиенте

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

Ошибка «Метод объекта не обнаружен» или недоступность метода на сервере

Поведение окна
Норма

Предупреждение ждёт нажатия, оповещение исчезает само

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

Код после вызова выполняется раньше, чем пользователь прочитал текст

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

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

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

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

Модуль объекта исполняется на сервере, а метод ПоказатьПредупреждение доступен только на клиенте. В модуле объекта используйте СообщениеПользователю — платформа доставит такие сообщения в интерфейс пользователя автоматически.

Как показать сообщение с кнопками «Да» и «Нет»?

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

Можно ли вывести сообщение из фонового задания?

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

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

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

Почему сообщение не привязывается к полю формы, хотя Поле указано?

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

Итог

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

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