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

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

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

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

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

В 1С:Предприятии 8.3 есть несколько способов доставить сообщение адресно: процедура ПоказатьОповещениеПользователя(), система взаимодействия (обсуждения), регистрация событий в журнале с последующей обработкой, а также внешние каналы — email, SMS, мессенджеры. У каждого варианта свои условия применения, ограничения и требования к настройке базы.

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

Почему Сообщить() не подходит для адресной отправки

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

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

ПоказатьОповещениеПользователя() — всплывающее уведомление в активном сеансе

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

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

Процедура ОтправитьСообщениеПользователю(Получатель, Текст) Экспорт

Запись = РегистрыСведений.СообщенияПользователям.СоздатьМенеджерЗаписи();

Запись.Период = ТекущаяДатаСеанса();

Запись.Пользователь = Получатель; // СправочникСсылка.Пользователи

Запись.ТекстСообщения = Текст;

Запись.Прочитано = Ложь;

Запись.Записать();

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

На клиенте в модуле управляемого приложения подключается обработчик ожидания, который раз в 30–60 секунд запрашивает непрочитанные сообщения текущего пользователя и выводит их:

&НаКлиенте

Процедура ПроверитьНовыеСообщения()

МассивСообщений = ПолучитьНепрочитанныеСообщения(); // серверный вызов

Для Каждого Сообщение Из МассивСообщений Цикл

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

"Новое сообщение",

,

Сообщение.Текст,

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

КонецЦикла;

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

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

Порядок действий для своего механизма оповещений
  1. 1
    Создайте регистр сведений с измерением «Пользователь» и ресурсами «ТекстСообщения», «Прочитано»
  2. 2
    Напишите серверную процедуру записи сообщения с указанием получателя
  3. 3
    В модуле управляемого приложения подключите обработчик ожидания с интервалом 30–60 секунд
  4. 4
    В обработчике вызовите серверную функцию получения непрочитанных сообщений текущего пользователя
  5. 5
    Выведите каждое сообщение через ПоказатьОповещениеПользователя и отметьте его прочитанным
  6. 6
    Проверьте: войдите под двумя пользователями и убедитесь, что сообщение видит только адресат

Система взаимодействия (обсуждения) — штатная адресная доставка

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

// Требуется: Администрирование → Обсуждения → включены

ИдентификаторПользователя = ПользовательИБ.УникальныйИдентификатор;

ПользовательСВ = СистемаВзаимодействия.ПолучитьПользователя(ИдентификаторПользователя);

Обсуждение = СистемаВзаимодействия.СоздатьОбсуждение();

Обсуждение.Заголовок = "Уведомление от системы";

Обсуждение.Участники.Добавить(ПользовательСВ.Идентификатор);

Обсуждение.Записать();

Сообщение = СистемаВзаимодействия.СоздатьСообщение(Обсуждение.Идентификатор);

Сообщение.Текст = "Вам назначена задача: проверить поступление № 154";

Сообщение.Записать();

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

Email, SMS и мессенджеры — когда пользователь не в программе

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

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

Для мессенджеров (Telegram и подобных) используется HTTP-запрос к API бота: методом POST передаётся идентификатор чата пользователя и текст. Это требует хранения соответствия «пользователь 1С — идентификатор чата» и доступа сервера 1С в интернет.

Сравнение способов адресной отправки

ПоказатьОповещениеПользователя + регистр

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

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

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

Email через типовую подсистему

Доставляет сообщение даже вне программы. Зависит от настройки почтовой учётной записи и заполненности адресов пользователей.

Мессенджеры через HTTP API

Мгновенная доставка на телефон. Нужен бот, хранение идентификаторов чатов и доступ сервера в интернет.

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

Адресат во всех механизмах задаётся либо ссылкой на справочник «Пользователи», либо объектом ПользовательИнформационнойБазы. Частая задача — найти пользователя по имени или по текущему сеансу:

// По имени пользователя ИБ

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

// Текущий пользователь сеанса

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

// Ссылка справочника (в типовых конфигурациях — БСП)

ПользовательСсылка = Пользователи.НайтиПоИмени("ИвановИП");

Не путайте справочник «Пользователи» и пользователей информационной базы: это разные сущности, связанные через реквизит «ИдентификаторПользователяИБ». Для системы взаимодействия нужен именно идентификатор пользователя ИБ, для своих регистров удобнее хранить ссылку справочника.

Типичные ошибки
01
Вызов Сообщить() в регламентном задании в надежде, что увидит конкретный пользователь — сообщение теряется, так как у фонового сеанса нет интерфейса
02
Отбор сообщений по имени пользователя строкой вместо ссылки — при переименовании пользователя механизм ломается
03
Слишком частый опрос регистра с клиента (каждые 2–5 секунд) — лишняя нагрузка на сервер, достаточно 30–60 секунд
04
Отправка сообщения без проверки, что пользователь активен — у уволенных или отключённых учёток сообщения копятся мёртвым грузом
05
Хранение текста сообщения без признака прочтения — пользователь получает одно и то же оповещение при каждом входе

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

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

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

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

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

Запись в регистре сообщений
Норма

Строка с нужным получателем и текстом создана, признак «Прочитано» = Ложь

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

Записи нет или получатель пустой — ошибка в процедуре отправки

Оповещение у адресата
Норма

Всплывающее окно появилось в течение интервала опроса

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

Окна нет — проверьте обработчик ожидания и отбор по текущему пользователю

Видимость у других пользователей
Норма

Другие пользователи сообщение не видят

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

Сообщение видят все — нарушен отбор по получателю

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

Сообщение появилось в обсуждении и центре оповещений

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

Сообщение записано, но оповещения нет — проверьте настройки обсуждений у пользователя

FAQ

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

Напрямую — нет, если он не в сеансе, оповещение показать некуда. Решения: сохранить сообщение в регистре и показать при следующем входе, либо отправить через email или мессенджер. Система взаимодействия также хранит сообщения и покажет их при входе.

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

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

Работает ли система взаимодействия в файловой базе?

Работает с ограничениями и зависит от версии платформы и режима совместимости. Для полноценной работы в многопользовательском режиме рекомендуется клиент-серверный вариант с регистрацией в сервере системы взаимодействия. Перед выбором этого механизма проверьте его доступность именно в вашей конфигурации.

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

Получите список пользователей ИБ методом ПользователиИнформационнойБазы.ПолучитьПользователей(), отфильтруйте по роли через Роли.Содержит() и в цикле отправьте сообщение каждому выбранным механизмом. Учитывайте, что у части пользователей роль может быть назначена через группы доступа — тогда отбор надо вести по справочнику пользователей.

Почему оповещение появляется несколько раз подряд?

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

Можно ли в сообщении дать ссылку на документ, чтобы пользователь открыл его кликом?

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

Итог

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

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