При разработке корпоративных систем на платформе «1С:Предприятие» часто возникает задача своевременно уведомить пользователя о различных событиях. Это может быть приближение крайнего срока выполнения задачи, проведение важного документа, назначение нового бизнес-процесса или изменение статуса заказа. Основная сложность заключается в архитектурном ограничении классического клиент-серверного взаимодействия: сервер 1С не может самостоятельно вызвать метод на клиенте без предварительного запроса со стороны клиентского приложения.
Разберем основные подходы к построению системы оповещений: от типового механизма Библиотеки Стандартных Подсистем (БСП) на обработчиках ожидания до использования современных push-технологий платформы.
Наиболее распространенным решением в типовых конфигурациях (таких как 1С:УНФ, 1С:ERP, 1С:КА, 1С:УТ) является подсистема напоминаний пользователя. Чтобы опрос сервера не создавал лишней нагрузки при работе сотен пользователей, в БСП применяется адаптивный динамический интервал опроса и отключение обработчика для нецелевых пользователей.
Проанализируем логику инициализации обработчика при старте системы. Обработчик подключается только в том случае, если в настройках пользователя включена функциональность напоминаний:
#Область СлужебныйПрограммныйИнтерфейс
// Активизирует обработчик ожидания, проверяющий текущие напоминания пользователя.
Процедура ПослеНачалаРаботыСистемы Экспорт
ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске;
Если НЕ ПараметрыРаботыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда
Возврат;
КонецЕсли;
Если ПараметрыРаботыКлиента.НастройкиНапоминаний.ИспользоватьНапоминания Тогда
// Первый запуск через минуту после старта клиента
ПодключитьОбработчикОжидания("ПроверитьТекущиеНапоминания", 60, Истина);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
Рассмотрим процедуру проверки текущих оповещений. Обратите внимание на то, что обработчик ожидания подключается как однократный (параметр Истина), а время следующей проверки рассчитывается динамически в зависимости от времени наступления ближайшего события:
Процедура ПроверитьТекущиеНапоминания Экспорт
ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента;
ИнтервалПроверкиНапоминаний = ПараметрыРаботыКлиента.НастройкиНапоминаний.ИнтервалПроверкиНапоминаний;
ВремяБлижайшего = Неопределено;
ИнтервалСледующейПроверки = ИнтервалПроверкиНапоминаний * 60;
// Получаем список актуальных оповещений и время следующего ближайшего события
Если НапоминанияПользователяКлиент.ПолучитьТекущиеОповещения(ВремяБлижайшего).Количество > 0 Тогда
НапоминанияПользователяКлиент.ОткрытьФормуОповещения;
ИначеЕсли ЗначениеЗаполнено(ВремяБлижайшего) Тогда
// Рассчитываем интервал до ближайшего напоминания, но не более стандартного интервала
ИнтервалСледующейПроверки = Макс(Мин(ВремяБлижайшего - ОбщегоНазначенияКлиент.ДатаСеанса, ИнтервалСледующейПроверки), 1);
КонецЕсли;
// Переподключаем обработчик на вычисленное время
ПодключитьОбработчикОжидания("ПроверитьТекущиеНапоминания", ИнтервалСледующейПроверки, Истина);
КонецПроцедуры
Такой подход обеспечивает минимальную нагрузку:
Если требуется уведомлять пользователей о событиях, требующих сложных вычислений (например, приближение дедлайна по сложным формулам графиков работ или проверка условий проведения документов), переносить эту логику в клиентский опрос категорически нельзя. Разберем правильную схему организации очереди:
ОчередьОповещений с ведущим измерением Пользователь и реквизитом ДатаОповещения.ГДЕ Пользователь = &ТекущийПользователь И ДатаОповещения <= &ТекущаяДата, считывая только готовые факты без расчетов.Начиная с версии платформы 8.3.10, платформа предоставляет встроенную технологию push-доставки сообщений — Систему взаимодействия. Это единственный способ мгновенно отправить уведомление с сервера на клиент без постоянного циклического опроса базы данных тонким клиентом.
Особенности использования Системы взаимодействия:
Если пользователям не обязательно находиться в активном сеансе 1С, целесообразно вынести доставку уведомлений во внешние сервисы. В этом случае сервер 1С в подписке на событие проведения документа или регламентном задании обращается к REST API корпоративного мессенджера (например, Telegram-бота) или почтовому серверу.
Преимущества данного подхода: