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

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

Как в 1С вывести сообщение пользователю

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

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

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

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

Вывод простого сообщения через Сообщить()

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

Сообщить("Документ успешно проведён");

Сообщить("Внимание: остаток на складе отрицательный", СтатусСообщения.Внимание);

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

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

Статусы сообщений и их визуальное отличие

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

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

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

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

Объект СообщениеПользователю создаётся конструктором Новый СообщениеПользователю и предоставляет свойства для тонкой настройки. Типовой пример проверки заполнения реквизита:

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

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

Сообщение.Поле = "Контрагент";

Сообщение.ПутьКДанным = "Объект";

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

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

Основные свойства объекта:

  • Текст — текст сообщения, который увидит пользователь;
  • Поле — имя реквизита, к которому привязано сообщение; платформа подсветит это поле в форме;
  • ПутьКДанным — путь к данным формы, обычно "Объект" для форм документов и справочников;
  • КлючДанных — ключ объекта, устанавливается автоматически методом УстановитьДанные();
  • ИдентификаторНазначения — позволяет направить сообщение в конкретную форму.

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

Сообщение с отказом от проведения документа

Классический сценарий — проверка в обработчике ОбработкаПроведения или ОбработкаПроверкиЗаполнения. Здесь сообщение должно не только информировать, но и блокировать операцию:

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

Если СуммаДокумента <= 0 Тогда

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

Сообщение.Текст = "Сумма документа должна быть больше нуля";

Сообщение.Поле = "СуммаДокумента";

Сообщение.ПутьКДанным = "Объект";

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

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

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

КонецЕсли;

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

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

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

Привязка сообщений к табличным частям

Для ошибок в строках табличной части свойство Поле заполняется с указанием индекса строки. Платформа подсветит именно нужную ячейку:

Для Каждого Строка Из Объект.Товары Цикл

Если Строка.Количество = 0 Тогда

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

Сообщение.Текст = "В строке " + Строка.НомерСтроки + " не указано количество";

Сообщение.Поле = "Товары[" + (Строка.НомерСтроки - 1) + "].Количество";

Сообщение.ПутьКДанным = "Объект";

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

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

КонецЕсли;

КонецЦикла;

Ключевой момент: индекс в квадратных скобках начинается с нуля, а НомерСтроки — с единицы, поэтому используется выражение НомерСтроки - 1. Ошибка в этом смещении приводит к подсветке соседней строки, что дезориентирует пользователя.

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

Диалоговые окна: Предупреждение и Вопрос

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

ПоказатьПредупреждение(, "Операция выполнена успешно", 10, "Результат");

ОписаниеОповещения = Новый ОписаниеОповещения("ПослеОтветаНаВопрос", ЭтотОбъект);

ПоказатьВопрос(ОписаниеОповещения, "Продолжить загрузку данных?", РежимДиалогаВопрос.ДаНет);

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

Сравнение вариантов

Сообщить()

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

СообщениеПользователю

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

ПоказатьПредупреждение / ПоказатьВопрос

Модальные окна, требующие реакции пользователя. Только на клиенте, только асинхронно. Для важных подтверждений.

ВызватьИсключение

Прерывает выполнение и откатывает транзакцию. Для критических ошибок, когда продолжение невозможно.

Как выбрать подходящий способ

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

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

Маршрут решения

Как выбрать действие

Нужно быстро увидеть значение переменной при отладкеИспользуйте Сообщить() и удалите вызов после отладки
Проверяете заполнение реквизита в форме или документеСоздайте СообщениеПользователю с Поле, ПутьКДанным и Отказ = Истина
Нужно подтверждение пользователя перед действиемВызовите ПоказатьВопрос с ОписаниеОповещения
Продолжение выполнения невозможно и опасноИспользуйте ВызватьИсключение с понятным текстом ошибки

Проверка результата и частые проблемы

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

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

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

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

Появление сообщения
Норма

Текст виден в панели сообщений после выполнения операции

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

Панель пуста — проверьте вызов метода Сообщить() и условие входа в ветку

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

Клик по сообщению активирует нужное поле формы

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

Подсвечивается другое поле или другая строка — проверьте Поле, ПутьКДанным и индекс строки

Блокировка операции
Норма

При ошибке документ не проводится

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

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

Итог

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

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

Частые вопросы

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

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

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

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

Как вывести сообщение на клиенте из серверной процедуры?

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

Как подсветить конкретную строку табличной части?

В свойстве Поле укажите путь с индексом: "Товары[2].Количество". Индекс начинается с нуля, поэтому из НомерСтроки вычитайте единицу. Не забудьте ПутьКДанным = "Объект" и УстановитьДанные(Объект).

Можно ли использовать модальное Предупреждение() в новом коде?

Нет. В тонком и веб-клиенте модальные вызовы запрещены настройками конфигурации. Используйте асинхронные ПоказатьПредупреждение() и ПоказатьВопрос() с описанием оповещения — они работают во всех клиентах.

Как отменить проведение документа из кода проверки?

Вывод сообщения сам по себе операцию не отменяет. В обработчике ОбработкаПроверкиЗаполнения или ОбработкаПроведения установите параметр Отказ = Истина. Для критических ошибок вне этих обработчиков используйте ВызватьИсключение — транзакция будет откачена.