Как настроить оповещение конкретного пользователя в 1С:Предприятие 8.3?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Разберем типичные ошибки начинающих разработчиков, контекстные ограничения платформы 1С и надежные способы реализации оповещений.

Почему не работают стандартные методы в фоновых и регламентных заданиях?

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

Платформа «1С:Предприятие» строго разграничивает контексты выполнения:

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

Рассмотрим рабочие варианты реализации задачи.

Вариант 1. Клиентский обработчик ожидания и всплывающее оповещение

Разберем по шагам наиболее прямолинейный способ: периодическая проверка условия в сеансе нужного пользователя.

Логика работы строится следующим образом:

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

Посмотрим на пример реализации в модуле управляемого приложения:


&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
    Если ЭтоОтветственныйЗаВыгрузку() Тогда
        // Интервал проверки в секундах (например, раз в 10 минут)
        ПодключитьОбработчикОжидания("ПроверитьНевыгруженныеДанные", 600, Ложь);
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьНевыгруженныеДанные() Экспорт
    Если ЕстьНевыгруженныеЗаписиНаСервере() Тогда
        ТекстОповещения = "Обнаружены новые данные для выгрузки. Нажмите для запуска обработки.";
        ПоказатьОповещениеПользователя("Требуется выгрузка", "e1cib/app/Обработка.ВыгрузкаДанных", ТекстОповещения);
    КонецЕсли;
КонецПроцедуры

Серверная функция проверки должна быть максимально легковесной, чтобы не создавать избыточную нагрузку на СУБД:


&НаСервере
Функция ЕстьНевыгруженныеЗаписиНаСервере()
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |   1
        |ИЗ
        |   РегистрСведений.ИзменениеСправ КАК Изменения
        |ГДЕ
        |   Изменения.Выгружен = ЛОЖЬ";
    
    Результат = Запрос.Выполнить();
    Возврат НЕ Результат.Пустой();
КонецФункции

Вариант 2. Использование Системы взаимодействия платформы 1С

Рассмотрим современный встроенный механизм платформы 1С:Предприятие 8.3 — Систему взаимодействия. Она позволяет отправлять адресные сообщения пользователям непосредственно из серверного кода и фоновых заданий.

Разберем пример отправки уведомления из регламентного задания:


// Серверный код (выполняется в регламентном задании)
Если ЕстьНевыгруженныеЗаписиНаСервере() Тогда
    // Получаем пользователя Системы взаимодействия
    ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени("Иванов");
    ИДПользователяСВ = СистемаВзаимодействия.ПолучитьИдентификатор(ПользовательИБ.УникальныйИдентификатор);
    
    Если ИДПользователяСВ <> Неопределено Тогда
        Сообщение = СистемаВзаимодействия.СоздатьСообщение();
        Сообщение.Текст = "Внимание: в регистре присутствуют невыгруженные записи! Запустите обработку выгрузки.";
        Сообщение.Получатели.Добавить(ИДПользователяСВ);
        Сообщение.Записать();
    КонецЕсли;
КонецЕсли;

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

Вариант 3. Использование типовых подсистем БСП

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

  1. Подсистема «Напоминания пользователей»: позволяет программно создавать записи в регистре сведений НапоминанияПользователей с указанием адресата и времени срабатывания. БСП автоматически выведет типовую панель напоминаний нужного сотрудника.
  2. Подсистема «Бизнес-процессы и задачи»: если регламентное задание находит необработанные записи, оно создает объект Задача на конкретного исполнителя или роль. Пользователь увидит задачу на своем рабочем столе.
  3. Подсистема «Текущие дела»: на начальную страницу ответственного пользователя выводится индикатор с числом невыгруженных записей, при клике на который открывается нужная форма.

Рекомендации по оптимизации запросов к регистру

При организации периодического контроля важно соблюдать правила оптимизации:

  1. Не использовать полную выборку: конструкции вида Запрос.Выполнить().Выбрать().Количество() заставляют СУБД считывать все строки. Используйте ВЫБРАТЬ ПЕРВЫЕ 1 и проверяйте условие НЕ Результат.Пустой().
  2. Индексация: если реквизит Выгружен является обычным реквизитом, а не измерением регистра сведений, обязательно установите для него свойство «Индексировать» в конфигураторе, чтобы поиск по условию ГДЕ Выгружен = ЛОЖЬ выполнялся по индексу, а не путем полного сканирования таблицы.
← На главную