Разработка и Конфигурация · 9 мин
Как написать и вывести сообщения в 1С
Как выводить сообщения в 1С: процедура Сообщить, объект СообщениеПользователю, привязка к полям формы, статусы, примеры кода и типичные ошибки.
В 1С:Предприятии сообщения — основной способ обратной связи программы с пользователем: предупреждения о незаполненных полях, ошибки проведения документа, информационные подсказки при обработке данных. Разработчику доступны два механизма: простая процедура Сообщить() и объект СообщениеПользователю, который умеет привязываться к реквизитам формы и подсвечивать ошибочное поле. Понимание разницы между ними определяет, насколько удобной будет работа пользователя с вашей конфигурацией.
Ошибка новичков — использовать Сообщить() везде, включая проверки заполнения в управляемых формах. В результате пользователь видит текст ошибки, но не понимает, какое именно поле нужно исправить, а сообщение теряется среди служебного вывода. Правильный выбор механизма и корректная привязка к данным решают эту проблему.
Два механизма вывода сообщений: чем они отличаются
Процедура Сообщить() — глобальный метод встроенного языка. Она принимает текст и необязательный статус (БезСтатуса, Обычное, Информация, Внимание, Важное, ОченьВажное) и выводит строку в панель сообщений. Механизм простой, но «слепой»: платформа не знает, к какому объекту или полю относится текст, поэтому клик по сообщению никуда не ведёт.
Объект СообщениеПользователю создаётся конструктором Новый СообщениеПользователю, заполняется свойствами и выводится методом Сообщить() этого объекта. Его ключевые возможности — привязка к данным формы или объекта через свойства Поле, ПутьКДанным и метод УстановитьДанные(), а также свойство КлючДанных для ссылки на объект базы. При двойном клике по такому сообщению платформа активирует связанное поле ввода.
Сравнение вариантов
Подходит для протоколов обработок, служебного вывода и отладки. Не привязывается к полям формы, теряется при групповых операциях.
Подходит для проверок заполнения, ошибок проведения и сообщений в управляемых формах. Требует больше кода, но подсвечивает проблемный реквизит.
Модальное окно, блокирует работу до нажатия кнопки. Только для критичных ситуаций, где пользователь обязан подтвердить прочтение.
Процедура Сообщить: синтаксис и типовые примеры
Минимальный вызов выглядит так: Сообщить("Обработано 150 записей");. Второй параметр задаёт статус, который влияет на пиктограмму и визуальный акцент в панели сообщений. Для важных предупреждений используйте СтатусСообщения.Важное или Внимание, для рутинного протокола — Информация или вызов без статуса.
Текст сообщения удобно собирать через СтрШаблон(), чтобы не плодить конкатенацию строк. Это особенно полезно в циклах обработки данных, где в сообщение подставляются номер строки, наименование элемента и причина пропуска.
Сообщить(СтрШаблон("Пропущен элемент %1: не заполнена цена", Элемент.Наименование), СтатусСообщения.Внимание);Помните: в серверных процедурах Сообщить() тоже работает — платформа передаёт накопленные сообщения на клиент после завершения вызова. Однако в фоновых заданиях сообщения видны только в регистрации задания и не доходят до интерактивного пользователя, поэтому для длительных операций о прогрессе сообщайте через ДлительныеОперации.СообщитьПрогресс().
Объект СообщениеПользователю: привязка к полям и данным
Типовой сценарий — проверка заполнения реквизита перед записью. Создайте объект сообщения, заполните Текст, укажите Поле (имя реквизита объекта, например "Контрагент") и вызовите УстановитьДанные(Объект), передав редактируемый объект. После вызова Сообщить() сообщение появится в панели, а по двойному клику платформа подсветит соответствующее поле формы.
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не заполнен контрагент";
Сообщение.Поле = "Контрагент";
Сообщение.УстановитьДанные(Объект);
Сообщение.Сообщить();Для реквизитов табличных частей в свойстве Поле указывается путь с индексом строки, например "Товары[2].Количество" (нумерация с нуля). Если сообщение относится к объекту, который ещё не открыт в форме, заполните КлючДанных ссылкой — тогда по клику пользователь сможет перейти к объекту.
Сообщения при проведении документов и отказ от операции
В обработчике ОбработкаПроверкиЗаполнения сообщения выводятся в паре с установкой параметра Отказ = Истина. Само по себе сообщение не блокирует запись — платформа продолжит проведение, если вы явно не установили отказ. Это одна из самых частых логических ошибок: разработчик выводит «Нельзя проводить с нулевым количеством», но документ спокойно проводится.
В модуле объекта (проведение, запись) сообщения формируются тем же СообщениеПользователю, но без привязки к форме — достаточно текста и, при необходимости, КлючДанных = Ссылка. При отказе платформа автоматически помечает сообщения как ошибки и показывает их пользователю в блоке «Операция не выполнена».
- 1В обработчике ОбработкаПроверкиЗаполнения проверьте значение реквизита
- 2При ошибке создайте СообщениеПользователю и заполните Текст и Поле
- 3Вызовите Сообщить() у объекта сообщения
- 4Установите Отказ = Истина, чтобы заблокировать запись
- 5Проверьте: документ не записывается, поле подсвечивается по клику на сообщение
Проверка результата и типичные ошибки
После внедрения кода проверьте три вещи: сообщение появляется в панели сообщений (а не только в журнале регистрации), двойной клик по нему активирует нужное поле, а при критичной ошибке операция действительно блокируется. Если сообщение выводится, но поле не подсвечивается — чаще всего не вызван УстановитьДанные() или в Поле указано имя, не совпадающее с именем реквизита.
Отдельная ловушка — локализация. Если конфигурация многоязычная, жёстко зашитые русские строки в сообщениях потребуют переделки; используйте НСтр("ru = 'Текст сообщения'") с самого начала, это практически не усложняет код.
Когда сообщений недостаточно: альтернативы
Не всякая обратная связь должна быть сообщением. Для критичных ситуаций, требующих подтверждения, подходит ПоказатьВопрос() с обработкой ответа пользователя. Для фиксации технических событий, которые не должен видеть обычный пользователь, — ЗаписьЖурналаРегистрации(). Для прогресса длительных операций — индикатор и СообщитьПрогресс, а не поток текстовых сообщений.
Как выбрать механизм
Что важно запомнить
Сообщить() — для простого вывода без привязки. СообщениеПользователю — для ошибок с подсветкой полей: заполняйте Поле, вызывайте УстановитьДанные() и не забывайте Отказ = Истина при блокировке операции.
Частые вопросы
Почему сообщение выводится, но документ всё равно проводится?
Потому что вывод сообщения не блокирует операцию. В обработчике проверки заполнения или проведения нужно явно установить параметр Отказ = Истина — только тогда платформа прервёт запись и покажет сообщения как ошибки.
Как привязать сообщение к строке табличной части?
В свойстве Поле укажите путь с индексом строки с нуля, например "Товары[0].Количество". При этом должен быть вызван УстановитьДанные() с объектом, содержащим эту табличную часть.
Можно ли вывести сообщение из фонового задания?
Метод Сообщить() в фоновом задании выполняется, но пользователь его не увидит. Используйте ЗаписьЖурналаРегистрации() для протокола или возвращайте текст через результат длительной операции и показывайте его на клиенте после завершения.
Чем отличается УстановитьДанные() от КлючДанных?
УстановитьДанные() принимает редактируемый объект формы и привязывает сообщение к его полям в открытой форме. КлючДанных — это ссылка на объект базы; по клику платформа предложит открыть объект, но не подсветит поле в текущей форме.
Как вывести сообщение на нескольких языках?
Оберните текст в функцию НСтр: НСтр("ru = 'Не заполнен контрагент'"). Платформа подставит строку для языка текущего сеанса, если переводы добавлены в конфигурацию.
Почему Предупреждение() вызывает ошибку в моём коде?
Методы Предупреждение() и ПоказатьПредупреждение() доступны только на клиенте. Если код выполняется в серверной процедуре (директива &НаСервере, модуль объекта), вызов завершится ошибкой — выносите интерактив в клиентский контекст.