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

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

Как вывести служебные сообщения в 1С

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

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

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

Ниже разобраны оба способа, настройка привязки к данным, вывод сообщений на клиенте и на сервере, а также типичные ошибки, из-за которых сообщения теряются или «привязываются не туда».

Метод Сообщить(): быстрый вывод в окно сообщений

Глобальный метод Сообщить() доступен в любом контексте — на клиенте и на сервере. Он принимает текст и необязательный параметр статуса, который определяет пиктограмму строки в окне сообщений.

Сообщить("Проведение отменено: не заполнен склад.", СтатусСообщения.Важное);

Доступные статусы: Обычное, Информация, Внимание, Важное, ОченьВажное, БезСтатуса. Статус влияет только на оформление, но не на логику: сообщение не останавливает проведение и не помечает поле с ошибкой.

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

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

Объект СообщениеПользователю создаётся в коде, заполняется свойствами и выводится методом Сообщить() этого объекта. Минимальный вариант:

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

Сообщение.Текст = "Не указан контрагент в документе.";

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

Ключевые свойства объекта:

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

Такое сообщение платформа выводит рядом с полем формы: реквизит подсвечивается красной рамкой, а щелчок по сообщению активирует нужный элемент. Это стандарт поведения проверок заполнения в управляемом приложении.

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

Привязка сообщения к полю формы и табличной части

Привязка работает только если одновременно заданы Поле и ПутьКДанным. Для реквизита шапки документа достаточно указать имя реквизита и путь "Объект":

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

Сообщение.Текст = "Дата отгрузки не может быть раньше даты заказа.";

Сообщение.Поле = "ДатаОтгрузки";

Сообщение.ПутьКДанным = "Объект";

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

Для строки табличной части в свойстве Поле указывается полный путь с индексом строки: Товары[2].Количество. Индексация строк начинается с нуля, поэтому для третьей строки используется индекс 2. Чтобы сформировать путь программно:

Сообщение.Поле = "Товары[" + Формат(ИндексСтроки, "ЧГ=") + "].Количество";

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

Сообщения и отказ от проведения документа

Частая задача — не просто сообщить об ошибке, а запретить запись или проведение. Для этого в обработчиках ОбработкаПроверкиЗаполнения и ОбработкаПроведения используется параметр Отказ:

Процедура ОбработкаПроведения(Отказ, РежимПроведения)

Если ОстатокНедостаточен Тогда

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

Сообщение.Текст = "Недостаточно товара на складе.";

Сообщение.КлючДанных = Ссылка;

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

Отказ = Истина;

КонецЕсли;

КонецПроцедуры

Установка Отказ = Истина сама по себе не выводит никакого текста — платформа лишь отменяет операцию и показывает стандартное уведомление об ошибке. Поэтому сообщение нужно формировать явно, иначе пользователь увидит «Ошибка при проведении» без объяснения причины.

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

Вывод сообщений на клиенте и на сервере

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

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

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

Если сообщение выводится, но пользователь его «не видит», проверьте, не открыта ли у него панель сообщений в свёрнутом виде. В типовых формах сообщения с привязкой к полю заметнее, поэтому для ошибок заполнения всегда задавайте Поле и ПутьКДанным, а не ограничивайтесь текстом.
ПЗ
Практическое замечание

Типичные ошибки при выводе сообщений

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

Третья группа ошибок связана с контекстом: попытка привязать сообщение к полю формы из серверной процедуры, где формы нет (фоновое задание, обмен данными), или вывод сообщений в цикле без ограничений. Четвёртая — забытый Отказ = Истина: сообщение об ошибке выведено, но документ всё равно провёлся, что создаёт ложное ощущение защиты.

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

Проверка результата и отладка

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

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

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

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

Подсветка поля
Норма

Реквизит обведён красным, переход по сообщению работает

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

Сообщение есть, поле не подсвечено — проверьте Поле и ПутьКДанным

Отказ от проведения
Норма

Документ не проводится, причина указана в сообщении

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

Документ провёлся несмотря на сообщение — не установлен Отказ

Сообщения из фонового задания
Норма

Тексты получены через ПолучитьСообщенияПользователю и показаны

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

Сообщения теряются без обработки в основном сеансе

Частые вопросы

Чем Сообщить() отличается от СообщениеПользователю?

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

Почему сообщение выводится, но поле формы не подсвечивается?

Чаще всего не задано или неверно заполнено одно из свойств: Поле, ПутьКДанным. Поле должно содержать имя реквизита без префикса «Объект.», а ПутьКДанным — обычно «Объект». Также привязка не работает, если сообщение выводится вне контекста формы.

Как вывести сообщение об ошибке для конкретной строки табличной части?

В свойстве Поле укажите путь с индексом строки, например «Товары[0].Количество». Индексация начинается с нуля. Индекс удобно формировать функцией Формат(Индекс, "ЧГ="), чтобы не получить разделители групп в строке.

Почему сообщения из фонового задания не видны пользователю?

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

Можно ли вывести сообщение и одновременно запретить запись документа?

Да. В обработчиках ОбработкаПроверкиЗаполнения или ОбработкаПроведения выведите сообщение через СообщениеПользователю и установите параметр Отказ в значение Истина. Без установки Отказа сообщение будет только информационным, и операция завершится.

Куда выводить техническую диагностику, которую не должен видеть пользователь?

Используйте ЗаписьЖурналаРегистрации() — записи доступны администратору через журнал регистрации и не загромождают интерфейс. Окно сообщений предназначено для информации, адресованной конечному пользователю.

Итог

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

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