Как реализовать систему оповещений между пользователями в 1С:УПП 1.3?

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

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

Способ 1. Использование типового механизма через документ «Событие»

Проанализируем самый простой и «штатный» путь, который не требует написания сложного кода с нуля. В конфигурации УПП предусмотрен документ Событие, который является частью CRM-системы. Процесс настройки выглядит следующим образом:

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

Рассмотрим, почему это работает. В типовом решении УПП уже настроен глобальный обработчик, который периодически проверяет наличие актуальных событий для текущего пользователя. Это позволяет избежать написания собственного «велосипеда» для мониторинга базы данных.

Способ 2. Реестр «Напоминания пользователя»

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

Рассмотрим алгоритм программной реализации:


МенеджерЗаписи = РегистрыСведений.НапоминанияПользователя.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Пользователь = НужныйПользователь;
МенеджерЗаписи.ВремяНапоминания = ТекущаяДата();
МенеджерЗаписи.Содержание = "Вам поступила новая задача по заказу №" + НомерЗаказа;
МенеджерЗаписи.Источник = СсылкаНаДокумент;
МенеджерЗаписи.Записать();

Преимущества этого метода:

Способ 3. Реализация через обработчик ожидания

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

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

  1. В процедуре ПриНачалеРаботыСистемы подключаем обработчик.
  2. Описываем саму процедуру проверки в глобальном модуле (или модуле обычного приложения).

Пример кода для подключения:


Процедура ПриНачалеРаботыСистемы()
    // Проверяем, что это не фоновое задание и не внешнее соединение
    #Если Клиент Тогда
        ПодключитьОбработчикОжидания("ПроверитьНовыеСообщенияДляМеня", 60); // Проверка раз в минуту
    #КонецЕсли
КонецПроцедуры

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


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

Способ 4. Механизм задач и бизнес-процессов

С точки зрения архитектуры 1С, если действие одного человека требует реакции другого, — это классическая Задача. В УПП есть встроенные бизнес-процессы. Мы можем программно создавать объект ЗадачаПользователя.

Посмотрим, в чем выгода такого подхода:

Технические нюансы и ограничения

При реализации системы оповещений в обычном приложении 1С важно учитывать несколько критических моментов:

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

2. Блокировки базы данных. Если вы создаете свой регистр для уведомлений, обязательно устанавливайте режим управления блокировками данных в значение Управляемый. Если используется автоматический режим, запись уведомления для одного пользователя может временно заблокировать чтение для другого, что при большом количестве сотрудников создаст очереди (deadlocks).

3. Внешние интеграции. Если требуется мгновенное уведомление, которое пользователь увидит, даже если 1С свернута, рассмотрим использование HTTP-запросов к мессенджерам (например, Telegram). При проведении документа в 1С выполняется простая функция:


Процедура ОтправитьВТелеграм(Текст)
    Соединение = Новый HTTPСоединение("api.telegram.org", 443,,,,, Новый ЗащищенноеСоединениеOpenSSL());
    Запрос = Новый HTTPЗапрос("/bot" + Токен + "/sendMessage?chat_id=" + ID + "&text=" + Текст);
    Соединение.Получить(Запрос);
КонецПроцедуры

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

← На главную