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