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

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

Как сделать вывод сообщения в 1С

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

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

Частая проблема начинающих разработчиков — сообщение, выведенное в серверной процедуре, «теряется» или не привязывается к нужному реквизиту формы. Это происходит потому, что разные механизмы по-разному работают в клиент-серверной архитектуре. Понимание этих различий позволяет выбрать правильный инструмент и избежать типичных ошибок.

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

Способы вывода сообщений: что и когда использовать

В платформе 1С:Предприятие 8 существует четыре основных механизма вывода информации пользователю. Они не взаимозаменяемы: каждый решает свою задачу и ведёт себя по-разному в тонком клиенте, веб-клиенте и при серверном вызове.

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

Объект СообщениеПользователю — основной инструмент для сообщений об ошибках. Он позволяет привязать сообщение к конкретному полю формы, задать объект данных и автоматически подсветить проблемный реквизит. Именно его используют стандартные проверки заполнения в типовых конфигурациях.

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

Сравнение способов вывода

Сообщить()

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

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

Привязка к полю формы и объекту, стандарт для ошибок заполнения. Требует больше кода.

ПоказатьПредупреждение()

Гарантированно заметно, блокирует работу до нажатия кнопки. Только на клиенте, раздражает при частом использовании.

ПоказатьОповещениеПользователя()

Ненавязчивое уведомление с возможностью навигационной ссылки. Только на клиенте, пользователь может не заметить.

Простой вывод через процедуру Сообщить

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

Сообщить("Документ успешно записан");

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

Сообщить("Не заполнен склад в строке 3", СтатусСообщения.Внимание);

Для формирования текста с подстановкой значений удобно использовать СтрШаблон() — так код читается легче, чем при конкатенации строк:

ТекстСообщения = СтрШаблон("Обработано %1 из %2 документов", Счетчик, ВсегоДокументов);

Сообщить(ТекстСообщения);

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

СообщениеПользователю: ошибки с привязкой к полям формы

Базовый пример

Объект СообщениеПользователю создаётся в коде, заполняется и выводится методом Сообщить():

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

Сообщение.Текст = "Не заполнено поле «Склад»";

Сообщение.Поле = "Склад";

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

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

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

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

Если ошибка находится в строке табличной части, укажите её имя и индекс строки:

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

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

Сообщение.Поле = "Товары[1].Количество";

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

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

Обратите внимание: индексация в пути к данным начинается с нуля, поэтому вторая строка табличной части имеет индекс 1. Это одна из самых частых причин «съехавшей» подсветки.

Свойство КлючДанных и отказ от проведения

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

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

Если Не ЗначениеЗаполнено(Склад) Тогда

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

Сообщение.Текст = "Поле «Склад» не заполнено";

Сообщение.Поле = "Склад";

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

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

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

КонецЕсли;

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

Типичные ошибки
01
Указание имени поля без УстановитьДанные() — сообщение не привяжется к форме и не подсветит реквизит.
02
Индексация строк табличной части с единицы вместо нуля — подсвечивается не та строка.
03
Вызов ПоказатьПредупреждение() в серверной процедуре — ошибка компиляции или выполнения, метод доступен только на клиенте.
04
Вывод сообщения об успехе внутри транзакции до её фиксации — при откате пользователь видит ложное подтверждение.

Предупреждения и оповещения на клиенте

Модальное предупреждение

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

&НаКлиенте

Процедура КомандаПроверить(Команда)

Если ОшибкиНайдены Тогда

ПоказатьПредупреждение(, "Обнаружены ошибки. Проверьте панель сообщений.");

КонецЕсли;

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

Первым параметром передаётся описание оповещения — процедура, которая выполнится после закрытия окна. Если продолжение не нужно, параметр опускают. Третьим параметром можно задать таймаут в секундах, по истечении которого окно закроется само.

Всплывающее оповещение

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

ПоказатьОповещениеПользователя(

"Заказ создан",

ПолучитьНавигационнуюСсылку(НовыйЗаказ),

СтрШаблон("Заказ № %1 от %2", НомерЗаказа, ДатаЗаказа),

БиблиотекаКартинок.Информация);

Вывод сообщений на сервере и в фоновых заданиях

В серверных процедурах (директивы &НаСервере, &НаСервереБезКонтекста) доступны только Сообщить() и СообщениеПользователю. Тексты накапливаются в буфере и передаются на клиент по завершении вызова. Пользователь увидит их все сразу, а не по мере выполнения — для индикации прогресса длительной операции это не подходит.

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

Для индикации прогресса в клиентской процедуре длительного цикла применяйте Состояние() — текст выводится в строку состояния и обновляется в реальном времени:

Для Сч = 1 По ВсегоДокументов Цикл

Состояние("Обработка документов", Окр(Сч * 100 / ВсегоДокументов));

// ... обработка

КонецЦикла;

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

Проверка результата и отладка вывода

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

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

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

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

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

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

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

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

Панель пуста — проверить условие вывода и контекст выполнения

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

Двойной щелчок по сообщению активирует нужный реквизит

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

Фокус не перемещается — не вызван УстановитьДанные() или неверный путь

Серверный вызов
Норма

Все сообщения появляются после завершения серверной процедуры

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

Ожидался вывод в реальном времени — так работает только Состояние() на клиенте

Частые вопросы о выводе сообщений в 1С

Почему сообщение, выведенное на сервере, не видно в форме?

Чаще всего серверный вызов завершился исключением до передачи буфера сообщений, либо дальше по коду вызван метод ОчиститьСообщения(). Также проверьте, что процедура действительно выполняется: поставьте точку останова в конфигураторе с включённой отладкой сервера.

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

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

Можно ли вывести сообщение пользователю из фонового задания?

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

Как вывести сообщение, чтобы пользователь обязательно его увидел?

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

Почему подсвечивается не та строка табличной части?

Проверьте индекс в пути к данным: в свойстве Поле индексация начинается с нуля. Строка с номером 2 для пользователя — это Товары[1] в коде. Также убедитесь, что вызван метод УстановитьДанные() с правильным объектом формы.

Как вывести сообщение на языке пользователя?

Для встроенного многоязычного интерфейса используйте функцию НСтр("ru = 'Текст сообщения'") — платформа подставит строку на языке текущего сеанса. Это стандартный подход во всех типовых конфигурациях.

Итог

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

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