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