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

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

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

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

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

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

Два механизма вывода сообщений: чем они отличаются

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

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

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

Сообщить()

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

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

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

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

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

Процедура Сообщить: синтаксис и типовые примеры

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

Текст сообщения удобно собирать через СтрШаблон(), чтобы не плодить конкатенацию строк. Это особенно полезно в циклах обработки данных, где в сообщение подставляются номер строки, наименование элемента и причина пропуска.

bsl
Сообщить(СтрШаблон("Пропущен элемент %1: не заполнена цена", Элемент.Наименование), СтатусСообщения.Внимание);

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

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

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

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

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

Сообщения при проведении документов и отказ от операции

В обработчике ОбработкаПроверкиЗаполнения сообщения выводятся в паре с установкой параметра Отказ = Истина. Само по себе сообщение не блокирует запись — платформа продолжит проведение, если вы явно не установили отказ. Это одна из самых частых логических ошибок: разработчик выводит «Нельзя проводить с нулевым количеством», но документ спокойно проводится.

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

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

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

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

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

Отдельная ловушка — локализация. Если конфигурация многоязычная, жёстко зашитые русские строки в сообщениях потребуют переделки; используйте НСтр("ru = 'Текст сообщения'") с самого начала, это практически не усложняет код.

Когда сообщений недостаточно: альтернативы

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

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

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

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

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

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

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

Почему сообщение выводится, но документ всё равно проводится?

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

Как привязать сообщение к строке табличной части?

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

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

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

Чем отличается УстановитьДанные() от КлючДанных?

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

Как вывести сообщение на нескольких языках?

Оберните текст в функцию НСтр: НСтр("ru = 'Не заполнен контрагент'"). Платформа подставит строку для языка текущего сеанса, если переводы добавлены в конфигурацию.

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

Методы Предупреждение() и ПоказатьПредупреждение() доступны только на клиенте. Если код выполняется в серверной процедуре (директива &НаСервере, модуль объекта), вызов завершится ошибкой — выносите интерактив в клиентский контекст.