При работе в крупных корпоративных системах часто возникает ситуация, когда при старте программы на пользователя «высыпается» ворох уведомлений: просроченные задачи, новые сообщения, напоминания. Это не только замедляет запуск системы, но и раздражает пользователя, вынуждая его закрывать десятки окон или ждать прогрузки центра оповещений. В этой статье мы разберем, как перенести процесс проверки и вывода уведомлений в фоновый режим, чтобы интерфейс оставался отзывчивым, а информация актуальной.
Проанализируем классический подход, который обсуждался на форуме. Основная идея заключается в том, что клиентское приложение (тонкий или толстый клиент) должно периодически самостоятельно «спрашивать» сервер о наличии новых данных. Поскольку сервер в классической архитектуре 1С не может принудительно вызвать клиентскую процедуру, нам необходимо инициировать это действие со стороны клиента.
Для реализации этого механизма рассмотрим работу с методом ПодключитьОбработчикОжидания. Этот метод позволяет запускать экспортную процедуру модуля управляемого приложения или формы через заданный интервал времени.
Разберем по шагам, как это внедрить в общую логику системы:
ПриНачалеРаботыСистемы.Рассмотрим пример кода:
Процедура ПриНачалеРаботыСистемы()
// Подключаем обработчик, который будет срабатывать раз в 5 минут (300 секунд)
ПодключитьОбработчикОжидания("ПроверитьНовыеЗадачиИОповестить", 300);
КонецПроцедуры
Процедура ПроверитьНовыеЗадачиИОповестить() Экспорт
// Здесь вызываем серверную функцию для проверки данных
СписокЗадач = СерверныеПроцедуры.ПолучитьАктуальныеЗадачиПользователя(ПараметрыСеанса.ТекущийПользователь);
Если СписокЗадач.Количество() > 0 Тогда
// Выводим уведомление в системный "колокольчик"
ПоказатьОповещениеПользователя("У вас есть задачи!", , "Просрочено задач: " + СписокЗадач.Количество());
КонецЕсли;
КонецПроцедуры
Важный нюанс: если ваша проверка на сервере выполняется долго (например, сложный запрос по иерархии задач), это может «подвешивать» интерфейс клиента в момент выполнения. Чтобы этого избежать, выясним причину задержек и оптимизируем запрос или увеличим интервал опроса.
Представим ситуацию: в базе работают 500 пользователей. Если каждый из них каждые 60 секунд будет выполнять тяжелый запрос к таблице задач, сервер БД начнет испытывать серьезную нагрузку. Проанализируем, как сделать эту схему более элегантной.
Вместо того чтобы заставлять каждого клиента делать расчеты, мы перенесем их на сторону регламентного задания. Рассмотрим алгоритм:
ОчередьУведомлений), где измерениями будут Пользователь, а ресурсом — КоличествоЗадач.ИмениПользователя.Такой подход минимизирует нагрузку на серверную часть, так как чтение одной записи по индексу в сотни раз быстрее, чем выполнение аналитического запроса.
Выясним, есть ли более современный способ. Да, начиная с платформы 8.3.10, в 1С доступна Система взаимодействия. Это механизм, который позволяет серверу отправлять сообщения клиенту в режиме реального времени (push-уведомления).
Рассмотрим, почему это лучше:
Для реализации программного оповещения через систему взаимодействия используется объект СообщенияСистемыВзаимодействия. Вы можете отправить «невидимое» сообщение, которое будет перехвачено обработчиком на клиенте и вызовет открытие нужной формы или обновление счетчика задач.
Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), рекомендуем не изобретать велосипед, а использовать подсистему ТекущиеДела или ОрганизацияОповещений.
Разберем преимущества интеграции с БСП:
Чтобы вывести оповещение через БСП, часто достаточно добавить запись в регистр сведений ОчередьСобытийДляОповещений. Система сама подхватит эти данные и отобразит их пользователю в ближайший цикл обновления.
При реализации фонового вызова процедур важно не перегружать пользователя визуальным шумом. Посмотрим на пример правильного использования метода ПоказатьОповещениеПользователя:
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьНажатиеНаУведомление", ЭтотОбъект);
ПоказатьОповещениеПользователя(
"Новые задачи",
ОписаниеОповещения,
"Нажмите здесь, чтобы открыть список",
БиблиотекаКартинок.ИнформационныйСборка
);
Использование ОписаниеОповещения позволяет сделать уведомление интерактивным. Проанализируем ситуацию: пользователь видит всплывающее окно, нажимает на него, и у него автоматически открывается форма списка задач или конкретный документ. Это значительно повышает удобство работы по сравнению с модальными окнами, которые прерывают ввод данных.
Подводя итог, отметим, что для простых задач достаточно ПодключитьОбработчикОжидания, но для высоконагруженных систем следует смотреть в сторону Системы взаимодействия или оптимизированных очередей на базе фоновых заданий.