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