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