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

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

Как в 1С вывести служебное сообщение

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

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

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

Ниже разобраны оба способа с примерами кода, особенностями работы в управляемых и обычных формах, типичные ошибки и способы проверки результата. Материал применим к платформам 1С 8.2 и 8.3 вне зависимости от конкретной конфигурации.

Вывод простого сообщения процедурой Сообщить

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

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

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

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

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

bsl
Сообщить("Операция выполнена", СтатусСообщения.Информация);
Сообщить("Проверьте заполнение табличной части", СтатусСообщения.Внимание);
Сообщить("Критическая ошибка обмена данными", СтатусСообщения.ОченьВажное);

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

Расширенный вывод через СообщениеПользователю

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

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

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

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

Сообщение.КлючДанных = Объект.Ссылка;

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

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

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

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

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

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

// Реквизит шапки

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

// Поле табличной части (вторая строка, индексация с нуля)

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

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

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

Сообщение.Текст = "Цена не может быть отрицательной";

Сообщение.Поле = "Товары[" + (Строка.НомерСтроки - 1) + "].Цена";

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

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

Типичные ошибки
01
Указание имени элемента формы вместо пути к данным — привязка не сработает, сообщение останется без перехода к полю
02
Нумерация строк табличной части с единицы вместо нуля — сообщение укажет не на ту строку
03
Вызов Сообщить() без заполнения свойства Текст — пользователь увидит пустое сообщение

Где выполняется код: клиент и сервер

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

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

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

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

Как выбрать действие

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

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

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

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

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

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

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

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

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

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

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

КонецЕсли;

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

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

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

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

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

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

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

Сообщения нет — проверьте, что код реально выполняется и не обёрнут в исключение

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

Клик по сообщению переводит фокус на нужный реквизит

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

Клик ничего не делает — неверно задано свойство Поле

Блокировка записи
Норма

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

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

Сообщение выводится, но документ сохраняется — флаг Отказ не установлен

Отладочный вывод и полезные приёмы

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

Если ПараметрыСеанса.РежимОтладки Тогда

Сообщить("ОТЛАДКА: сумма до скидки = " + СуммаДокумента);

КонецЕсли;

Полезные приёмы при работе со служебными сообщениями:

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

Отличия от других способов информирования

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

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

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

Сообщить()

Быстрый вывод текста со статусом; нет привязки к полям, подходит для отладки и простых уведомлений

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

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

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

Ненавязчивое всплывающее уведомление; не привязано к полям и исчезает автоматически

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

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

Часто задаваемые вопросы

Почему сообщение не появляется, хотя Сообщить() вызывается?

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

Как вывести сообщение из фонового задания?

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

Можно ли очистить панель сообщений программно?

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

Почему привязка к полю табличной части не работает?

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

Чем отличается Важное от ОченьВажное в статусе сообщения?

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

Итог

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

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