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

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

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

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

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

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

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

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

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

Сообщить("Обработка завершена успешно.");

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

Сообщить("Внимание: остаток товара меньше резерва", СтатусСообщения.ОченьВажное);

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

Текст можно формировать через СтрШаблон() для подстановки значений — это корректнее конкатенации строк и упрощает локализацию:

Сообщить(СтрШаблон("Проведено документов: %1 из %2", Проведено, Всего));

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

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

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

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

Сообщение.Поле = "ДатаОтгрузки";

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

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

Ключевые свойства объекта:

  • Текст — содержимое сообщения;
  • Поле — имя реквизита, к которому привязано сообщение; в форме такое сообщение подсвечивает поле, и по двойному щелчку курсор переходит к нему;
  • ПутьКДанным — путь к данным формы для привязки сообщения к элементу управления;
  • КлючДанных — ссылка на объект базы; сообщение будет показано только при открытой форме этого объекта или при работе с ним;
  • ИдентификаторНазначения — позволяет адресовать сообщение конкретной форме.

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

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

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

В обработчике ОбработкаПроверкиЗаполнения сообщения формируются так:

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

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

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

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

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

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

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

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

КонецЕсли;

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

Флаг Отказ = Истина обязателен, если сообщение сигнализирует об ошибке: без него документ проведётся, несмотря на выведенное предупреждение. Для табличных частей в свойстве Поле указывают путь вида "Товары[3].Количество", а индекс строки получают через Строка.НомерСтроки - 1 (индексация с нуля).

Привязка в управляемой форме

На клиенте в управляемой форме привязка делается через ПутьКДанным и ИдентификаторНазначения:

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

Сообщение.Текст = "Сумма превышает лимит";

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

Сообщение.ИдентификаторНазначения = ЭтаФорма.УникальныйИдентификатор;

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

Порядок действий
  1. 1
    Создайте объект: Новый СообщениеПользователю
  2. 2
    Заполните Текст и Поле (или ПутьКДанным)
  3. 3
    Вызовите УстановитьДанные(Объект) для привязки к ключу данных
  4. 4
    Вызовите Сообщить() — только в этот момент текст выводится
  5. 5
    При ошибке установите Отказ = Истина в проверяющем обработчике

Сообщения в клиент-серверном режиме и на сервере

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

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

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

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

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

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

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

Сообщить()

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

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

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

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

Гарантирует, что пользователь увидел текст. Блокирует интерфейс — нельзя использовать массово.

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

Ненавязчивое уведомление с возможностью ссылки на объект. Не подходит для ошибок.

ВызватьИсключение

Единственный способ гарантированно прервать операцию и откатить транзакцию. Текст показывается как ошибка.

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

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

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

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

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

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

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

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

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

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

Курсор переходит к привязанному полю формы

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

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

Сообщение об ошибке при проведении
Норма

Документ не проводится, Отказ = Истина

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

Документ провёлся — сообщение не связано с отказом

Серверный вызов с Сообщить()
Норма

Текст виден в клиенте после завершения вызова

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

Сообщение пропало — вероятно, было исключение или вызов из фонового задания

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

Итог

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

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

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

Почему сообщение, выведенное на сервере, не видно пользователю?

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

Как подсветить конкретный реквизит формы при ошибке?

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

Чем отличается Сообщить() от ПоказатьПредупреждение()?

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

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

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

Как остановить проведение документа с выводом причины?

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

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

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