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

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

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

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

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

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

Метод Сообщить(): самый простой способ

Глобальный метод Сообщить() выводит текст в панель сообщений. Минимальный вызов выглядит так:

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

Вторым необязательным параметром передаётся статус сообщения — перечисление СтатусСообщения. От статуса зависит пиктограмма рядом с текстом:

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

Сообщить("Проведение отменено", СтатусСообщения.Важное);

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

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

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

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

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

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

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

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

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

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

bsl
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = НСтр("ru = 'Укажите склад отгрузки'");
Сообщение.Поле = "Склад";
Сообщение.УстановитьДанные(Объект);
Сообщение.Сообщить();

Привязка сообщения к полю формы и к данным объекта

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

Для табличных частей путь указывается с индексом строки:

Сообщение.Поле = "Товары[2].Количество";

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

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

Сообщения при проверке заполнения и проведении

Типовой сценарий — сообщения об ошибках в обработчиках ОбработкаПроверкиЗаполнения и ОбработкаПроведения. Здесь действует соглашение: после вывода сообщения об ошибке нужно установить признак отказа.

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

Если Не ЗначениеЗаполнено(Склад) Тогда

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

Сообщение.Текст = "Не указан склад";

Сообщение.Поле = "Склад";

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

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

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

КонецЕсли;

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

Если забыть Отказ = Истина, документ запишется или проведётся, несмотря на выведенное сообщение, — пользователь увидит предупреждение, но операция завершится. Это одна из самых частых ошибок начинающих разработчиков.

Типичные ошибки
01
Вывели сообщение об ошибке, но не установили Отказ = Истина — операция выполняется несмотря на предупреждение
02
Используют Сообщить() для прогресса длительной операции на сервере — пользователь видит все сообщения только в конце
03
Путают индексацию: путь Товары[0] соответствует первой строке, а не второй
04
Вызывают Сообщить() в серверной процедуре пакетного задания, где сообщения никто не увидит — нужен журнал регистрации

Где сообщения не сработают: фоновые задания и регламентные операции

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

Для неинтерактивных сценариев используйте журнал регистрации:

ЗаписьЖурналаРегистрации("Обмен данными",

УровеньЖурналаРегистрации.Ошибка, , ,

"Не удалось загрузить документ: " + ОписаниеОшибки());

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

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

Как выбрать механизм

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

Альтернативы: предупреждения, оповещения и показ ввода

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

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

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

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

Сообщить()

Быстро и просто, но без привязки к полю и без контроля. Для отладки и простых случаев

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

Стандарт для прикладного кода: привязка к полю, ключ данных, корректная работа в управляемых формах

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

Модальный диалог на клиенте. Когда сообщение нельзя пропустить, но не подходит для сервера

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

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

Проверка результата и отладка

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

Если сообщение «теряется», типичные причины: код выполняется в фоновом задании, сообщение выводится до открытия формы, либо серверный вызов прерывается исключением до завершения — тогда накопленные сообщения могут не дойти до клиента.

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

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

Появление сообщения
Норма

Текст виден в панели сообщений после выполнения кода

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

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

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

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

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

Курсор никуда не переходит — неверное имя поля или не вызван УстановитьДанные()

Блокировка операции
Норма

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

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

Документ записывается несмотря на сообщение — забыт Отказ = Истина

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

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

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

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

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

Как вывести сообщение об ошибке табличной части?

Укажите в свойстве Поле путь с индексом строки с нуля, например "Товары[0].Количество", и вызовите УстановитьДанные(Объект). Платформа подсветит ячейку в соответствующей строке таблицы формы.

Увидит ли пользователь сообщение из регламентного задания?

Нет. У регламентных и фоновых заданий нет интерактивного сеанса, поэтому панель сообщений недоступна. Фиксируйте такие события через ЗаписьЖурналаРегистрации и анализируйте журнал регистрации.

Можно ли вывести сообщение на другом языке?

Да, оберните текст в функцию НСтр() с указанием языковых фрагментов, например НСтр("ru = 'Текст'; en = 'Text'"). Платформа выберет вариант по языку сеанса пользователя. Это стандарт для конфигураций, работающих в многоязычной среде.

Итог

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

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