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

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

Чем заменить Сообщить() в 1С

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

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

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

Почему Сообщить() считается устаревшим

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

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

Основная замена: СообщениеПользователю

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

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

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

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

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

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

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

Для табличных частей указывайте поле с индексом строки: Сообщение.Поле = "Товары[2].Количество". Тогда пользователь увидит ошибку именно в третьей строке таблицы, а не где-то на форме вообще.

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

Уведомления без привязки к форме

ПоказатьПредупреждение — когда нужна реакция пользователя

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

ПоказатьОповещениеПользователя — ненавязчивая информация

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

Состояние и ПоказатьОповещениеПользователя при длительных операциях

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

Сравнение способов вывода

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

Ошибки заполнения и проведения; привязка к полю и объекту; работает на сервере. Не подходит для модальных предупреждений.

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

Сообщение требует подтверждения; только клиент, асинхронный вызов. Блокирует работу до нажатия кнопки.

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

Фоновая информация без прерывания работы; только клиент. Легко пропустить, не подходит для ошибок.

Состояние

Прогресс длительной операции; не сохраняется в истории, не заменяет сообщения об ошибках.

Сообщения в серверном коде и фоновых заданиях

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

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

Когда Сообщить() всё ещё допустим

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

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

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

Проверка результата после замены

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

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

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

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

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

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

Сообщение в общей панели, поле не подсвечено

Блокировка операции
Норма

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

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

Сообщение есть, но документ записался

Серверный вызов
Норма

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

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

Дубли сообщений или их отсутствие

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

Чем заменить Сообщить() в модуле объекта документа?

Используйте СообщениеПользователю с вызовом УстановитьДанные(ЭтотОбъект) — сообщение привяжется к объекту, а при указании свойства Поле подсветит конкретный реквизит. В обработчиках проверки заполнения дополнительно установите Отказ = Истина.

Работает ли СообщениеПользователю в тонком и веб-клиенте?

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

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

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

Нужно ли удалять все вызовы Сообщить() из старого кода?

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

Что выбрать для сообщения об успешном завершении операции?

Для краткого подтверждения без прерывания работы — ПоказатьОповещениеПользователя(). Если результат критичен и пользователь должен его точно увидеть — ПоказатьПредупреждение() с текстом результата.

Итог

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

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