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

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

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

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

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

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

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

Чем отличаются способы вывода сообщений в 1С

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

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

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

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

Сообщить()

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

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

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

Система взаимодействия

Доставка конкретному пользователю в другом сеансе. Требует регистрации базы в сервисе и работает только в управляемом приложении.

Как вывести сообщение через СообщениеПользователю

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

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

Сообщение.Текст = "Документ не может быть проведен: не заполнен склад.";

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

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

1c
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Укажите дату отгрузки";
Сообщение.СтатусСообщения = СтатусСообщения.Важное;
Сообщение.КлючДанных = ДокументСсылка;
Сообщение.Поле = "ДатаОтгрузки";
Сообщение.ПутьКДанным = "Объект";
Сообщение.Сообщить();

Привязка сообщения к полю формы

Чтобы платформа подсветила ошибочный реквизит красной рамкой, заполните свойства Поле и ПутьКДанным. В ПутьКДанным указывается имя основного реквизита формы (обычно «Объект»), а в Поле — имя реквизита объекта. Для табличной части используется составной путь вида «Товары[0].Цена», где индекс строки задается через свойство Строка (первый индекс — нулевой).

Как отправить сообщение другому пользователю через систему взаимодействия

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

Если ИнформационнаяБазаЗарегистрирована() Тогда

Получатель = ПользователиИнформационнойБазы.НайтиПоИмени("ИвановИИ");

Если Получатель <> Неопределено Тогда

СообщениеСВ = Новый СообщениеСистемыВзаимодействия;

СообщениеСВ.Текст = "Проверьте документ реализации № 125.";

СообщениеСВ.Получатели.Добавить(Получатель.УникальныйИдентификатор);

МенеджерСистемыВзаимодействия.ОтправитьСообщение(СообщениеСВ);

КонецЕсли;

КонецЕсли;

Получатель увидит сообщение в приложении «Обсуждения». Если пользователь не в сети, сообщение будет доставлено при следующем входе. Метод ИнформационнаяБазаЗарегистрирована() менеджера системы взаимодействия обязательно проверяется перед отправкой — иначе вызов завершится исключением.

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

Как показать сообщение пользователю на клиенте из серверного кода

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

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

Ограничения и типичные ошибки

Самая распространенная ошибка — попытка использовать систему взаимодействия в базе, не зарегистрированной в сервисе. Регистрация выполняется администратором через функциональность «Обсуждения» в настройках программы или программно. Без регистрации вызовы менеджера приводят к исключению.

Вторая ошибка — неверный путь к данным при привязке к полю. Если ПутьКДанным или Поле указаны неправильно, сообщение просто не подсветит реквизит, а иногда и вовсе не отобразится в нужной форме. Проверяйте имена реквизитов формы, а не объекта метаданных.

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

Как проверить, что сообщение доставлено

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

Для системы взаимодействия проверка выполняется на стороне получателя: сообщение должно появиться в приложении «Обсуждения». Учтите, что доставка в фоновом режиме может занимать некоторое время, а при отключенном уведомлении пользователь увидит сообщение только при открытии обсуждений.

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

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

Панель сообщений формы
Норма

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

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

Сообщения нет — проверить вызов Сообщить() и отсутствие исключений

Приложение Обсуждения у получателя
Норма

Сообщение видно в личной переписке

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

Пусто — проверить регистрацию базы и идентификатор получателя

Журнал ошибок
Норма

Нет исключений при вызове МенеджерСистемыВзаимодействия

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

Исключение о незарегистрированной базе — выполнить регистрацию

FAQ

Можно ли отправить сообщение пользователю, который сейчас не в базе?

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

Как получить идентификатор текущего пользователя?

Используйте ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор. Для поиска другого пользователя — методы НайтиПоИмени() или НайтиПоУникальномуИдентификатору() коллекции ПользователиИнформационнойБазы.

Почему Сообщить() не показывает текст в управляемом приложении?

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

Можно ли отправить сообщение сразу нескольким пользователям?

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

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

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

Итог

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

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