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