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