Разработка и Конфигурация · 9 мин
Как в 1С вывести сообщение определенному пользователю
Способы вывести сообщение конкретному пользователю в 1С: СообщениеПользователю, система взаимодействия, привязка к полям формы. Примеры кода и типичные ошибки.
Встроенный язык 1С предлагает несколько механизмов вывода сообщений, и они ведут себя по-разному: одни показывают текст всем, кто работает в текущем сеансе, другие позволяют адресовать сообщение конкретному пользователю базы. Выбор зависит от того, где выполняется код — на клиенте или на сервере, — и от того, работает ли получатель в этот момент в системе.
Ключевой объект для адресных сообщений — СообщениеПользователю. Он умеет не только выводить текст в панель сообщений, но и привязываться к полям формы, подсвечивая ошибочный реквизит. Для мгновенной доставки другому пользователю в другом сеансе используется система взаимодействия, доступная в управляемом приложении.
Ниже разобраны все рабочие варианты: от простого Сообщить() до отправки личных сообщений через систему взаимодействия, с примерами кода, ограничениями и проверкой результата.
Чем отличаются способы вывода сообщений в 1С
В платформе существует три принципиально разных подхода. Процедура Сообщить() выводит текст в окно сообщений текущего сеанса — это самый простой вариант, но он не умеет ни адресовать сообщение, ни привязывать его к форме. Он подходит для отладки и простых уведомлений в толстом клиенте.
Объект СообщениеПользователю — стандартный инструмент управляемого приложения. Сообщения накапливаются в специальном буфере и показываются пользователю текущего сеанса в панели сообщений формы. Именно через этот объект платформа выводит ошибки проверки заполнения.
Система взаимодействия — единственный штатный способ отправить сообщение другому пользователю, работающему в другом сеансе или даже на другом компьютере. Она требует регистрации информационной базы в сервисе взаимодействия и работает только в управляемом приложении.
Сравнение вариантов
Только текущий сеанс, без привязки к форме. Подходит для отладки и простых случаев.
Текущий сеанс, привязка к полям формы, статусы сообщений. Стандарт для управляемого приложения.
Доставка конкретному пользователю в другом сеансе. Требует регистрации базы в сервисе и работает только в управляемом приложении.
Как вывести сообщение через СообщениеПользователю
Базовый сценарий занимает три строки: создать объект, заполнить текст, вызвать метод Сообщить(). Сообщение увидит пользователь, в сеансе которого выполняется код.
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Документ не может быть проведен: не заполнен склад.";
Сообщение.Сообщить();
У объекта есть полезные свойства. СтатусСообщения принимает значения Обычное, Информация, Важное и ВажноеОчень — от этого зависит оформление. Свойство КлючДанных позволяет связать сообщение с объектом базы, чтобы при двойном щелчке по сообщению открывалась форма этого объекта.
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Укажите дату отгрузки";
Сообщение.СтатусСообщения = СтатусСообщения.Важное;
Сообщение.КлючДанных = ДокументСсылка;
Сообщение.Поле = "ДатаОтгрузки";
Сообщение.ПутьКДанным = "Объект";
Сообщение.Сообщить();Привязка сообщения к полю формы
Чтобы платформа подсветила ошибочный реквизит красной рамкой, заполните свойства Поле и ПутьКДанным. В ПутьКДанным указывается имя основного реквизита формы (обычно «Объект»), а в Поле — имя реквизита объекта. Для табличной части используется составной путь вида «Товары[0].Цена», где индекс строки задается через свойство Строка (первый индекс — нулевой).
Как отправить сообщение другому пользователю через систему взаимодействия
Если нужно, чтобы сообщение получил конкретный сотрудник, работающий в базе прямо сейчас или позже, используется менеджер системы взаимодействия. Получатель определяется через идентификатор пользователя информационной базы.
Если ИнформационнаяБазаЗарегистрирована() Тогда
Получатель = ПользователиИнформационнойБазы.НайтиПоИмени("ИвановИИ");
Если Получатель <> Неопределено Тогда
СообщениеСВ = Новый СообщениеСистемыВзаимодействия;
СообщениеСВ.Текст = "Проверьте документ реализации № 125.";
СообщениеСВ.Получатели.Добавить(Получатель.УникальныйИдентификатор);
МенеджерСистемыВзаимодействия.ОтправитьСообщение(СообщениеСВ);
КонецЕсли;
КонецЕсли;
Получатель увидит сообщение в приложении «Обсуждения». Если пользователь не в сети, сообщение будет доставлено при следующем входе. Метод ИнформационнаяБазаЗарегистрирована() менеджера системы взаимодействия обязательно проверяется перед отправкой — иначе вызов завершится исключением.
- 1Убедитесь, что база зарегистрирована в системе взаимодействия: ИнформационнаяБазаЗарегистрирована()
- 2Найдите пользователя через ПользователиИнформационнойБазы.НайтиПоИмени() или по уникальному идентификатору
- 3Создайте СообщениеСистемыВзаимодействия, заполните Текст и добавьте идентификатор в Получатели
- 4Вызовите МенеджерСистемыВзаимодействия.ОтправитьСообщение()
- 5Проверьте доставку в приложении Обсуждения у получателя
Как показать сообщение пользователю на клиенте из серверного кода
Частая ситуация: проверка выполняется на сервере (например, при записи документа), а показать результат нужно пользователю, который инициировал действие. Для этого не нужны никакие «адресные» механизмы — сообщения, созданные на сервере через СообщениеПользователю, автоматически передаются в вызвавший сеанс и отображаются в его панели сообщений при возврате управления на клиента.
Если требуется модальное окно, которое блокирует работу до подтверждения, используйте на клиенте ПоказатьПредупреждение() или ПоказатьОповещениеПользователя(). Второй вариант выводит ненавязчивое всплывающее окно в углу экрана и подходит для информационных уведомлений, не требующих реакции.
Ограничения и типичные ошибки
Самая распространенная ошибка — попытка использовать систему взаимодействия в базе, не зарегистрированной в сервисе. Регистрация выполняется администратором через функциональность «Обсуждения» в настройках программы или программно. Без регистрации вызовы менеджера приводят к исключению.
Вторая ошибка — неверный путь к данным при привязке к полю. Если ПутьКДанным или Поле указаны неправильно, сообщение просто не подсветит реквизит, а иногда и вовсе не отобразится в нужной форме. Проверяйте имена реквизитов формы, а не объекта метаданных.
Как проверить, что сообщение доставлено
Для СообщениеПользователю признак успеха — появление текста в панели сообщений под формой после выполнения серверного вызова. Если сообщения нет, убедитесь, что метод Сообщить() действительно вызван и что между созданием сообщения и возвратом на клиента не произошло исключения, откатившего выполнение.
Для системы взаимодействия проверка выполняется на стороне получателя: сообщение должно появиться в приложении «Обсуждения». Учтите, что доставка в фоновом режиме может занимать некоторое время, а при отключенном уведомлении пользователь увидит сообщение только при открытии обсуждений.
Как проверить результат
Текст появился после серверного вызова, поле подсвечено при указании ПутьКДанным
Сообщения нет — проверить вызов Сообщить() и отсутствие исключений
Сообщение видно в личной переписке
Пусто — проверить регистрацию базы и идентификатор получателя
Нет исключений при вызове МенеджерСистемыВзаимодействия
Исключение о незарегистрированной базе — выполнить регистрацию
FAQ
Можно ли отправить сообщение пользователю, который сейчас не в базе?
Да, через систему взаимодействия. Сообщение сохраняется на сервере сервиса и будет показано пользователю при следующем входе в базу. Обычный СообщениеПользователю такой возможности не дает — он работает только в рамках активного сеанса.
Как получить идентификатор текущего пользователя?
Используйте ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор. Для поиска другого пользователя — методы НайтиПоИмени() или НайтиПоУникальномуИдентификатору() коллекции ПользователиИнформационнойБазы.
Почему Сообщить() не показывает текст в управляемом приложении?
В тонком клиенте глобальный метод Сообщить() имеет ограниченное поведение и в ряде контекстов выводит текст только на сервере или в журнал. В управляемом приложении стандартом является объект СообщениеПользователю, который корректно передает сообщения между сервером и клиентом.
Можно ли отправить сообщение сразу нескольким пользователям?
Да. В коллекцию Получатели объекта СообщениеСистемыВзаимодействия добавьте идентификаторы всех нужных пользователей — каждый получит копию сообщения. Альтернатива — создать групповое обсуждение и писать в него.
Как сделать, чтобы по клику на сообщение открывался документ?
Заполните у СообщениеПользователю свойство КлючДанных, передав туда ссылку на объект. При двойном щелчке по такому сообщению в панели сообщений платформа откроет форму связанного объекта.
Что важно запомнить
Для сообщений в текущем сеансе используйте СообщениеПользователю с привязкой к полям формы через ПутьКДанным и Поле. Для доставки конкретному пользователю в другом сеансе — систему взаимодействия с обязательной проверкой регистрации базы. Всегда проверяйте результат поиска пользователя и факт появления сообщения у получателя.