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