Разберем одну из самых популярных задач в разработке на платформе 1С:Предприятие — программную отправку уведомления конкретному пользователю так, чтобы оно отобразилось в стандартном центре оповещений (значок «колокольчика»). Стандартный метод ПоказатьОповещениеПользователя имеет существенное ограничение: он работает только в текущем клиентском сеансе. Если вызвать его на сервере или в сеансе одного пользователя, другой пользователь ничего не увидит.
Рассмотрим подробнее доступные механизмы решения этой задачи, начиная от современных штатных инструментов и заканчивая классическими обходными путями.
Это наиболее правильный и современный способ организации мгновенных уведомлений между пользователями. Система взаимодействия позволяет пересылать сообщения напрямую в интерфейс программы. Для реализации этого метода необходимо, чтобы в информационной базе была настроена Система взаимодействия — в качестве альтернативы подойдёт согласование задач с уведомлениями в Telegram.
Проанализируем программный код, который позволяет создать неинтерактивное обсуждение и отправить сообщение конкретному адресату:
// Получаем обсуждение (можно создать специальное системное обсуждение)
Обсуждение = СистемаВзаимодействия.ПолучитьОбсуждение("КлючСобытияИлиИдентификатор");
// Создаем новое сообщение
Сообщение = СистемаВзаимодействия.СоздатьСообщение(Обсуждение);
Сообщение.Текст = "У вас новое задание по счету №123";
// Определяем получателя (используем ИдентификаторПользователяИБ)
ИдентификаторПользователяИБ = ПользовательСсылка.ИдентификаторПользователяИБ;
ИдентификаторСВ = СистемаВзаимодействия.ПолучитьИдентификаторПользователя(ИдентификаторПользователяИБ);
// Добавляем получателя и записываем сообщение
Сообщение.Получатели.Добавить(ИдентификаторСВ);
Сообщение.Записать();
Важный нюанс: при таком подходе у пользователя загорится индикатор в панели обсуждений или «колокольчик», в зависимости от настроек программы. Это работает мгновенно («Push-технология»), не нагружая сервер постоянными запросами.
Выясним причину, почему разработчики долго ждали версию 8.3.26. Именно в этом релизе платформа получила штатный объект МенеджерУведомленийКлиента. Теперь нам не обязательно использовать Систему взаимодействия для простых оповещений.
Посмотрим, как работает этот механизм. Он позволяет отправить уведомление с сервера в конкретный клиентский сеанс. Основные преимущества этого способа:
Этот метод станет стандартом для всех конфигураций, работающих на актуальных версиях платформы, так как он минимизирует затраты на написание кастомных «велосипедов» с регистрами и таймерами — для этого есть универсальная настройка оповещений по произвольным условиям.
Если ваша платформа ниже версии 8.3.26 и Система взаимодействия не подключена, разберем проверенный временем «обходной путь». Суть заключается в реализации модели «Pull» (клиент сам забирает данные с сервера).
Пошагово это выглядит следующим образом:
ОчередьОповещений. В нем должны быть измерения Пользователь и ресурсы ТекстСообщения, СсылкаНаОбъект, ДатаСоздания и флаг Прочитано (по аналогии с механизмами хранения истории данных).ПриНачалеРаботыСистемы, подключаем обработчик ожидания или используем готовые алгоритмы и регламентные задания из расширений.Проанализируем пример кода для подключения обработчика:
Процедура ПриНачалеРаботыСистемы()
// Проверка новых уведомлений каждые 5 минут (300 секунд)
ПодключитьОбработчикОжидания("ПроверитьНовыеУведомления", 300);
КонецПроцедуры
Процедура ПроверитьНовыеУведомления() Экспорт
// Вызываем серверный метод для проверки регистра
ДанныеОповещения = РаботаСУведомлениямиВызовСервера.ПолучитьНовоеУведомление();
Если ДанныеОповещения <> Неопределено Тогда
ПоказатьОповещениеПользователя(
"Внимание!",
ДанныеОповещения.НавигационнаяСсылка,
ДанныеОповещения.Текст,
БиблиотекаКартинок.Важно
);
КонецЕсли;
КонецПроцедуры
Важный момент: не ставьте слишком маленький интервал (например, 1 секунду). Это может создать избыточную нагрузку на сервер БД, если в системе работает много пользователей. Оптимальный интервал — от 1 до 5 минут.
Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), рекомендуется не изобретать свои механизмы, а использовать подсистему «Текущие дела» или «Заметки». В БСП реализованы стандарты разработки (например, стандарт #std487), которые описывают правильное взаимодействие с пользователем.
Рассмотрим подробнее использование бизнес-процессов. Вместо простого уведомления часто эффективнее создать объект Задача. Она автоматически появится в списке задач пользователя на рабочем столе и будет висеть там до тех пор, пока пользователь её не выполнит или не отметит прочитанной. Это гарантирует, что важное событие не будет пропущено в потоке всплывающих окон.
Выясним, какой метод выбрать именно вам:
МенеджерУведомленийКлиента.Каждый из этих подходов имеет свои плюсы, но общая цель одна: обеспечить доставку информации нужному сотруднику в нужное время.