Как реализовать механизм оповещения пользователей при добавлении файла в базу 1С

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

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

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

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

Для начала проанализируем структуру подсистемы. Она базируется на регистре сведений НапоминанияПользователя. Чтобы оповестить коллег, нам необходимо программно создать записи в этом регистре для каждого пользователя. Рассмотрим пример кода, который можно разместить в подписке на событие ПриЗаписи справочника присоединенных файлов (например, ДоговорыКонтрагентовПрисоединенныеФайлы):


// Процедура-обработчик подписки на событие
Процедура СоздатьНапоминанияОФайле(Источник, Отказ) Экспорт
    
    Если Источник.ОбменДанными.Загрузка Или НЕ Источник.ЭтоНовый() Тогда
        Возврат;
    КонецЕсли;

    // Определяем список пользователей, которым нужно отправить уведомление
    // Например, выбираем всех активных пользователей или определенную роль
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	Пользователи.Ссылка КАК Пользователь
        |ИЗ
        |	Справочник.Пользователи КАК Пользователи
        |ГДЕ
        |	НЕ Пользователи.ПометкаУдаления
        |	И НЕ Пользователи.Недействителен";
    
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();

    Пока Выборка.Следующий() Цикл
        // Пропускаем автора файла, чтобы он не получал уведомление о своем действии
        Если Выборка.Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь() Тогда
            Продолжить;
        КонецЕсли;

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

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

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

Вариант 2. Применение Системы взаимодействия

Разберем современный подход с использованием Системы взаимодействия. Это встроенный в платформу 1С механизм, который позволяет пользователям общаться внутри программы, а разработчикам — программно управлять сообщениями. Это гораздо эффективнее обычного чата, так как позволяет привязывать обсуждения к конкретным объектам базы данных.

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

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


// В обработчике добавления файла
Контекст = СистемаВзаимодействия.ПолучитьКонтекст(Источник.ВладелецФайла);
Обсуждение = СистемаВзаимодействия.СоздатьОбсуждение(Контекст);
Обсуждение.КраткоеОписание = "Новые файлы по договору";
Обсуждение.Записать();

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

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

Вариант 3. Собственная очередь уведомлений (Регистр + Обработчик ожидания)

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

  1. Создаем новый Регистр сведений ОчередьОповещений с измерениями Пользователь (СправочникСсылка.Пользователи) и Объект (ЛюбаяСсылка), а также ресурсом Прочитано (Булево).
  2. При добавлении файла через подписку на событие создаем записи в этом регистре для всех нужных пользователей.
  3. В модуле управляемого приложения в процедуре ПриНачалеРаботыСистемы подключаем обработчик ожидания: ПодключитьОбработчикОжидания("ПроверитьНовыеФайлы", 300); (раз в 5 минут).
  4. В процедуре ПроверитьНовыеФайлы выполняем запрос к регистру по текущему пользователю, где Прочитано = Ложь.

Для визуализации уведомления используем метод платформы ПоказатьОповещениеПользователя. Этот метод выводит небольшое окно в углу экрана, которое не блокирует работу программы.


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

Вариант 4. Механизм Задач пользователя

Если добавление файла требует от других пользователей не просто ознакомления, а конкретного действия (например, проверки или внесения правок в учет), проанализируем использование объекта Задачи. В 1С:Бухгалтерии есть стандартный механизм «Мои задачи».

Этот подход гарантирует, что пользователь не просто увидит всплывающее окно, которое может исчезнуть, а получит задачу, которая будет висеть в его списке дел до тех пор, пока он не нажмет кнопку «Выполнено». Это критически важно для соблюдения бизнес-процессов.

Сравнительный анализ решений

Разберем, какой метод выбрать в зависимости от условий:

Важное замечание по производительности: при реализации собственного обработчика ожидания старайтесь не устанавливать слишком частый интервал (например, каждые 10 секунд). Оптимальный интервал — 5-10 минут. Это позволит не создавать избыточную нагрузку на сервер приложений 1С и СУБД, особенно если в базе одновременно работает большое количество сотрудников.

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

← На главную