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

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

Как вывести сообщение пользователю в управляемой форме 1С

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

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

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

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

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

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

&НаСервере

Процедура ПроверитьДанныеНаСервере()

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

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

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

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

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

Важно понимать: метод Сообщить() у объекта СообщениеПользователю работает и на сервере, и на клиенте. Это делает его универсальным, в отличие от интерактивных диалогов, доступных только на клиенте.

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

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

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

Если форма работает с объектом (например, документом), привязка выполняется к реквизиту объекта:

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

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

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

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

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

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

Сообщение для строки табличной части

Для табличной части дополнительно указывается индекс строки через свойство КлючДанных не нужен — достаточно сформировать имя поля с индексом:

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

Сообщение.Текст = "В строке 2 не указано количество";

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

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

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

Индексация в пути — с нуля, поэтому вторая строка имеет индекс 1. При ошибке в индексе или имени поля привязка просто не сработает: сообщение выведется без подсветки, исключения не возникнет.

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

Идентификатор назначения и сообщения из модуля объекта

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

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

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

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

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

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

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

Если сообщение формируется в общем модуле, передайте туда идентификатор формы параметром. Это типовой приём для проверок, вынесенных из формы в переиспользуемый код.

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

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

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

&НаКлиенте

Процедура ПослеЗаписи(ПараметрыЗаписи)

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

"Запись выполнена",

,

"Документ успешно записан",

БиблиотекаКартинок.Информация);

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

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

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

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

Ошибки заполнения, привязка к полям, работа на сервере. Сообщение остаётся в панели до закрытия.

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

Несрочные информационные уведомления. Только клиент, исчезает автоматически, без привязки к полям.

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

Критичная информация, требующая подтверждения. Только клиент, блокирует работу до нажатия кнопки.

Сообщить()

Быстрая отладка. Нет привязки к полям и управления назначением, в продуктивном коде нежелательно.

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

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

Для реквизитов формы (не объекта) ПутьКДанным не указывается, а в Поле пишется имя реквизита формы. Смешение этих вариантов — самая частая причина «молчаливой» потери привязки.

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

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

Отображение сообщения
Норма

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

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

Панель пуста — проверьте ИдентификаторНазначения и контекст вызова

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

Двойной щелчок по сообщению активирует нужное поле, оно подсвечено

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

Фокус не переходит — неверные Поле или ПутьКДанным

Табличная часть
Норма

Подсвечивается ячейка именно той строки, где ошибка

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

Подсвечивается другая строка — индекс в Поле смещён

FAQ

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

Чаще всего код выполняется в контексте, где сообщение уходит «в никуда»: например, в фоновом задании или при несовпадающем ИдентификаторНазначения. Проверьте, что вызов происходит в контексте формы, и что идентификатор формы передан корректно. Также убедитесь, что процедура действительно выполняется — поставьте точку останова.

Как вывести сообщение без привязки к объекту, к реквизиту формы?

Заполните только Поле именем реквизита формы, а ПутьКДанным оставьте пустым. Платформа найдёт элемент формы, связанный с этим реквизитом, и подсветит его.

Можно ли очистить ранее выведенные сообщения?

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

Чем отличается КлючДанных от ПутьКДанным?

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

Как вывести сообщение из ОбработкаПроверкиЗаполнения в модуле объекта?

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

Итог

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

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