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