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