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