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

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

Как вывести сообщение в 1С через Сообщить

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

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

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

Ниже разобран синтаксис процедуры, статусы сообщений, привязка к данным, различия между тонким и толстым клиентом, типичные ошибки и способы проверить, что сообщение действительно дошло до пользователя.

Синтаксис процедуры Сообщить

Процедура имеет два необязательных параметра: текст сообщения и статус. Полный синтаксис выглядит так:

Сообщить(ТекстСообщения, СтатусСообщения);

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

Количество = 15;

Сообщить(СтрШаблон("Обработано документов: %1", Количество));

Функция СтрШаблон() подставляет значения вместо меток %1, %2 и так далее. Это удобнее и читабельнее, чем склейка строк оператором «+», особенно когда в тексте несколько переменных. Если значение не строковое (число, дата, булево), платформа автоматически приведёт его к строке.

Процедура не возвращает значения и не останавливает выполнение кода. Если нужно прервать обработку после сообщения об ошибке, используйте оператор Возврат, вызов исключения ВызватьИсключение или флаг Отказ в обработчиках событий объектов.

bsl
Сообщить("Проверка завершена");
Сообщить("Найдено ошибок: " + ЧислоОшибок, СтатусСообщения.Внимание);
Сообщить(СтрШаблон("Документ %1 не проведён", НомерДокумента), СтатусСообщения.Важное);

Статусы сообщений и когда их применять

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

СтатусПиктограммаКогда применять
БезСтатусаНетНейтральный текст, разделители, служебный вывод
ОбычноеБез выделенияСтандартное информационное сообщение
Информация«i»Уведомление о завершении операции, результатах
Внимание«!» в треугольникеНекритичная проблема: данные неполные, часть строк пропущена
Важное«!» в кругеСущественная ошибка, требующая реакции пользователя
ОченьВажноеКрасный крестКритическая ситуация, операция не выполнена

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

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

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

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

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

В веб-клиенте сообщения отображаются аналогично тонкому клиенту — в панели сообщений. Если панель скрыта, её можно открыть вручную через меню или программно, о чём ниже.

Клиентская процедураМгновенный вывод

Сообщение появляется сразу в панели сообщений

Серверная процедураВывод с задержкой

Сообщение дойдёт до пользователя после возврата на клиент

Фоновое заданиеНакопление в очереди

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

Отладка без конфигуратораБыстрая диагностика

Подходит для просмотра значений переменных

Объект СообщениеПользователю: привязка к полям и отказ

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

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

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

Сообщение.Поле = "Склад";

Сообщение.УстановитьДанные(Объект);

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

Когда сообщение привязано к полю через свойства Поле и УстановитьДанные(), пользователь может перейти к ошибочному реквизиту двойным щелчком по сообщению — платформа активирует форму и установит курсор в нужное поле. Это существенно удобнее, чем просто текст «заполните склад».

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

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

Если Не ЗначениеЗаполнено(Склад) Тогда

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

Сообщение.Текст = "Укажите склад";

Сообщение.Поле = "Склад";

Сообщение.УстановитьДанные(ЭтотОбъект);

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

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

КонецЕсли;

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

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

Как показать панель сообщений и очистить её

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

Для очистки панели от старых сообщений используется ОчиститьСообщения(). Это полезно в начале повторной обработки, чтобы пользователь не путал актуальные сообщения с прошлыми. Обе процедуры доступны только на клиенте.

&НаКлиенте

Процедура ВыполнитьОбработку(Команда)

ОчиститьСообщения();

ОткрытьПанельСообщений();

ВыполнитьОбработкуНаСервере();

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

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

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

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

Панель сообщений после выполнения кода
Норма

Строка с текстом и нужной пиктограммой видна

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

Панель пуста — проверьте, не скрыта ли она, и дошёл ли код до вызова

Привязка к полю
Норма

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

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

Ничего не происходит — не заполнены Поле или УстановитьДанные

Блокировка записи при ошибке
Норма

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

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

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

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

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

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

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

Типичные ошибки
01
Вывод сообщений в цикле на каждую строку — переполнение панели и замедление работы
02
Ожидание мгновенного вывода из серверной процедуры — сообщения приходят только после возврата на клиент
03
Текст без контекста — пользователь не понимает, к какому объекту относится сообщение
04
Отсутствие Отказ = Истина — документ проводится несмотря на сообщение об ошибке
05
Использование Сообщить вместо записи в журнал регистрации — история ошибок не сохраняется

Альтернативы: Предупреждение, ПоказатьОповещениеПользователя, журнал регистрации

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

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

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

Сравнение способов уведомления

Сообщить()

Панель сообщений, не прерывает работу. Подходит для результатов проверок и отладки, легко не заметить

ПоказатьПредупреждение()

Модальное окно, требует реакции. Для критичных ситуаций; в тонком клиенте — асинхронно

ПоказатьОповещениеПользователя()

Всплывающее уведомление, исчезает само. Для подтверждения успешных действий

ЗаписьЖурналаРегистрации()

Скрыто от пользователя, хранится постоянно. Для технических деталей и аудита

FAQ

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

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

Как вывести сообщение и остановить проведение документа?

Одного Сообщить() недостаточно — оно не прерывает выполнение. В обработчике ОбработкаПроверкиЗаполнения выведите сообщение через объект СообщениеПользователю и установите параметр Отказ = Истина. Либо используйте ВызватьИсключение с текстом ошибки.

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

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

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

Да, это распространённый приём: вывод значений переменных в ключевых точках кода. После отладки такие вызовы следует удалить или заменить записью в журнал регистрации, иначе пользователи будут видеть служебный вывод.

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

Чаще всего панель сообщений просто закрыта. Вызовите ОткрытьПанельСообщений() в клиентском коде перед выводом важных сообщений. Также проверьте, что код вообще доходит до вызова Сообщить — поставьте точку останова или временное сообщение в начале процедуры.

Как вывести сообщение с подстановкой нескольких значений?

Используйте СтрШаблон(): Сообщить(СтрШаблон("Документ %1 от %2 не проведён", Номер, Дата)). Метки %1, %2 и далее заменяются переданными значениями, приведение типов выполняется автоматически.

Итог

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

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