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