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

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

Как вывести сообщение на сервере в 1С

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

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

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

Ниже разобраны доступные способы, различия клиентского и серверного контекста, примеры кода и типичные ошибки, из-за которых сообщения теряются или не отображаются.

Почему на сервере нельзя вызвать Предупреждение

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

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

Из этого следует важное ограничение: сообщение видно только после завершения серверного вызова. Если серверная процедура выполняется долго, пользователь не увидит промежуточные сообщения «в реальном времени» — они появятся все сразу в конце.

Способ 1. Объект СообщениеПользователю — рекомендуемый вариант

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

Минимальный пример в серверной процедуре:

// Серверная процедура

&НаСервере

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

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

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

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

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

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

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

Поля Поле, ПутьКДанным и КлючДанных позволяют «подсветить» конкретный реквизит: при двойном щелчке по сообщению курсор перейдёт к нужному полю формы. Это стандартное поведение при ошибках проверки заполнения.

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

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

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

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

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

Для реквизитов табличной части в свойстве Поле указывается путь с индексом строки, например "Объект.Товары[2].Количество". Нумерация в пути начинается с нуля, что часто становится источником ошибок.

Способ 2. Процедура Сообщить — простой, но ограниченный

Глобальная процедура Сообщить("текст") работает и на сервере, и на клиенте. Она выводит простой текст без привязки к полям:

&НаСервере

Процедура ВыполнитьОбработкуНаСервере()

Сообщить("Обработано записей: " + КоличествоЗаписей);

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

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

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

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

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

Сообщить()

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

ОбщегоНазначения.СообщитьПользователю (БСП)

Обертка из Библиотеки стандартных подсистем: единый формат, параметры привязки, интеграция с длительными операциями. Доступна только в конфигурациях на БСП.

Вывод сообщений из длительных серверных операций

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

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

// На клиенте после завершения фонового задания

Сообщения = ФоновоеЗадание.ПолучитьСообщенияПользователю();

Для Каждого Сообщение Из Сообщения Цикл

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

КонецЦикла;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Сообщение указывает на конкретную строку с правильным индексом

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

Подсвечивается не та строка — индексация в пути идёт с нуля, а НомерСтроки начинается с единицы

Фоновое задание
Норма

Все сообщения задания выведены на клиенте после завершения

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

Часть сообщений потеряна — не вызван ПолучитьСообщенияПользователю у объекта задания

Типичные ошибки при выводе сообщений с сервера

Большинство проблем связано с непониманием момента отображения сообщений и путаницы между контекстами выполнения.

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

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

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

FAQ

Можно ли показать модальное окно с сервера?

Нет. Серверный код не имеет доступа к интерфейсу. Если нужен диалог с пользователем, серверная логика должна вернуть результат на клиент, а уже клиентская процедура вызывает Предупреждение() или Вопрос() с обработкой ответа.

Почему сообщение не появляется после серверного вызова?

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

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

В свойстве Поле укажите путь с индексом строки, например "Объект.Товары[1].Цена". Помните, что индекс начинается с нуля, поэтому из НомерСтроки нужно вычесть единицу. Дополнительно задайте КлючДанных со ссылкой на объект.

Чем Сообщить() отличается от СообщениеПользователю?

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

Как передать сообщения из фонового задания пользователю?

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

Куда попадают сообщения, если нет открытой формы?

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

Итог

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

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