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