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