Как реализовать оповещение пользователя в нетиповой конфигурации 1С на управляемых формах?

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

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

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

Способ 1. Организация очереди через регистр сведений и обработчик ожидания

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

Разберем по шагам создание такого механизма:

  1. Создание регистра сведений: создадим непериодический регистр сведений ОчередьОповещений со следующими реквизитами:

    – Измерения: Пользователь (тип СправочникСсылка.Пользователи) и Идентификатор (тип УникальныйИдентификатор или Число);

    – Ресурсы / Реквизиты: ТекстСообщения (тип Строка), Заголовок (тип Строка), НавигационнаяСсылка (тип Строка), ДатаСоздания (тип Дата).

  2. Запись события: при проведении документа перемещения или по нажатию кнопки формируем запись в регистре для целевого пользователя:
    
    Движение = РегистрыСведений.ОчередьОповещений.СоздатьМенеджерЗаписи();
    Движение.Пользователь = ОтветственныйСкладаПолучателя;
    Движение.Идентификатор = Новый УникальныйИдентификатор();
    Движение.Заголовок = "Поступление товара";
    Движение.ТекстСообщения = "Отправлен товар по документу № " + СокрЛП(Номер);
    Движение.НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(Ссылка);
    Движение.ДатаСоздания = ТекущаяДатаСеанса();
    Движение.Записать();
    
  3. Подключение клиентского обработчика: в модуле управляемого приложения или в глобальной невидимой общей форме подключаем периодический опрос через метод ПодключитьОбработчикОжидания:
    
    &НаКлиенте
    Процедура ПриНачалеРаботыСистемы()
        ПодключитьОбработчикОжидания("ПроверитьОповещенияПользователя", 15);
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ПроверитьОповещенияПользователя() Экспорт
        СписокОповещений = ПолучитьИУдалитьОповещенияНаСервере();
        Для Каждого Оповещение Из СписокОповещений Цикл
            ПоказатьОповещениеПользователя(
                Оповещение.Заголовок,
                Оповещение.НавигационнаяСсылка,
                Оповещение.ТекстСообщения,
                БиблиотекаКартинок.Информация32
            );
        КонецЦикла;
    КонецПроцедуры
    
  4. Серверная выборка с очисткой: серверная процедура считывает записи только для текущего пользователя и сразу удаляет их, чтобы исключить повторный показ:
    
    &НаСервереБезКонтекста
    Функция ПолучитьИУдалитьОповещенияНаСервере()
        Результат = Новый Массив;
        
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ
            |   Очередь.Заголовок КАК Заголовок,
            |   Очередь.ТекстСообщения КАК ТекстСообщения,
            |   Очередь.НавигационнаяСсылка КАК НавигационнаяСсылка,
            |   Очередь.Идентификатор КАК Идентификатор
            |ИЗ
            |   РегистрСведений.ОчередьОповещений КАК Очередь
            |ГДЕ
            |   Очередь.Пользователь = &ТекущийПользователь";
        
        Запрос.УстановитьПараметр("ТекущийПользователь", ПользователиИнформационнойБазы.ТекущийПользователь());
        Выборка = Запрос.Выполнить().Выбрать();
        
        Пока Выборка.Следующий() Цикл
            СтруктураОповещения = Новый Структура("Заголовок,ТекстСообщения,НавигационнаяСсылка");
            ЗаполнитьЗначенияСвойств(СтруктураОповещения, Выборка);
            Результат.Добавить(СтруктураОповещения);
            
            // Удаляем прочитанное оповещение
            МенеджерЗаписи = РегистрыСведений.ОчередьОповещений.СоздатьМенеджерЗаписи();
            МенеджерЗаписи.Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
            МенеджерЗаписи.Идентификатор = Выборка.Идентификатор;
            МенеджерЗаписи.Удалить();
        КонецЦикла;
        
        Возврат Результат;
    КонецФункции
    

Особенности использования метода ПоказатьОповещениеПользователя

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

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

Подводные камни реализации опроса

Разберем технические ограничения, о которых необходимо помнить при реализации опроса через обработчики ожидания:

  1. Работа в веб-клиенте: современные интернет-браузеры для экономии системных ресурсов принудительно замедляют таймеры на неактивных или свернутых вкладках. Если вкладка с 1С свернута у кладовщика, обработчик ожидания будет срабатывать с повышенным интервалом.
  2. Нагрузка на сервер: частый вызов серверных функций (раз в 1–3 секунды) от большого количества одновременно работающих сеансов создает постоянный поток запросов к СУБД. Рекомендуется устанавливать интервал опроса не менее 15–30 секунд и максимально оптимизировать выборку.
  3. Права доступа (RLS): если в базе действует разграничение прав на уровне записей, чтение и удаление служебных оповещений следует выполнять в общем модуле с установленным признаком «Привилегированный», чтобы исключить блокировку выполнения из-за ограничений прав на связанные объекты.

Способ 2. Использование штатной Системы взаимодействия

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

Главное достоинство этого механизма — работа по технологии Push, когда сервер 1С мгновенно доставляет уведомление на клиент без постоянных холостых запросов к базе.

Разберем пример программной отправки сообщения через Систему взаимодействия:


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

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

Способ 3. Отправка уведомлений через Telegram-бота

Если пользователи работают на удаленных складах или точках и не всегда держат открытой базу 1С, эффективным и легковесным решением является отправка прямых HTTP-запросов к Telegram Bot API.

Для такой реализации не нужны внешние компоненты. Достаточно использовать стандартные объекты HTTPСоединение и HTTPЗапрос. Код выполняется на сервере за доли секунды и одинаково стабильно работает под любым веб-сервером (Apache или IIS).

← На главную