При разработке функционала в среде 1С:Предприятие часто возникает задача программного создания напоминаний для пользователей. Однако разработчики нередко сталкиваются с проблемой: запись в регистр сведений НапоминанияПользователя произведена успешно, но заветное окно уведомления появляется не сразу, а с задержкой в 5, 10 или даже 15 минут. Рассмотрим подробно, почему так происходит, как работает механизм оповещений и как правильно использовать программный интерфейс Библиотеки стандартных подсистем (БСП) для решения этой задачи.
Проанализируем пример кода, который часто используют начинающие разработчики для создания напоминания напрямую через менеджер записи регистра. На первый взгляд он кажется логичным, но содержит несколько критических недочетов:
НапоминаниеПользователю = РегистрыСведений.НапоминанияПользователя.СоздатьМенеджерЗаписи();
НапоминаниеПользователю.Пользователь = ДокВРегистре; // Ошибка 1
НапоминаниеПользователю.ВремяСобытия = ТекущаяДата() + 30; // Ошибка 2
НапоминаниеПользователю.СрокНапоминания = ТекущаяДата() + 30;
НапоминаниеПользователю.Описание = "Необходимо выйти";
НапоминаниеПользователю.СпособУстановкиВремениНапоминания = Перечисления.СпособыУстановкиВремениНапоминания.ВУказанноеВремя;
НапоминаниеПользователю.ИнтервалВремениНапоминания = 0;
НапоминаниеПользователю.Записать();
Выясним причины некорректной работы этого кода:
Пользователь: В коде выше в качестве пользователя передается ссылка на документ (ДокВРегистре). Однако это измерение должно содержать исключительно ссылку на справочник Пользователи. Если записать в это поле другой объект, система просто не «увидит» это напоминание для текущего авторизованного сотрудника.НапоминанияПользователя есть реквизит Источник. Именно туда следует записывать ссылку на документ или задачу, к которой относится напоминание, чтобы пользователь мог открыть этот объект из окна уведомления.Проанализируем ситуацию с точки зрения архитектуры платформы. В 1С (особенно в решениях на базе БСП) не реализована технология мгновенной доставки Push-уведомлений от сервера к клиенту для этого регистра. Вместо этого используется механизм опроса (polling).
Клиентское приложение периодически «спрашивает» сервер: «Нет ли для текущего пользователя новых напоминаний?». За этот процесс отвечает обработчик ожидания, который подключается в глобальном модуле НапоминанияПользователяГлобальный. Вызов осуществляется через процедуру ПроверитьТекущиеНапоминания.
Важные нюансы работы обработчика ожидания:
Вместо прямой записи в регистр сведений, настоятельно рекомендуется использовать методы программного интерфейса, предоставляемые Библиотекой стандартных подсистем. Это гарантирует правильное заполнение всех служебных полей и корректное поведение системы уведомлений. Рассмотрим использование метода ПодключитьНапоминание общего модуля НапоминанияПользователяСлужебный (или аналогичного в вашей версии БСП).
Пример правильного кода:
ПараметрыНапоминания = Новый Структура;
ПараметрыНапоминания.Вставить("Пользователь", Пользователи.ТекущийПользователь());
ПараметрыНапоминания.Вставить("ВремяСобытия", ТекущаяДата() + 600; // Напоминание через 10 минут
ПараметрыНапоминания.Вставить("СпособУстановкиВремениНапоминания", Перечисления.СпособыУстановкиВремениНапоминания.ВУказанноеВремя);
ПараметрыНапоминания.Вставить("Описание", "Срочно проверить статус отгрузки!");
ПараметрыНапоминания.Вставить("Источник", СсылкаНаДокумент);
ПараметрыНапоминания.Вставить("ИмяИнтервала", "");
НапоминанияПользователяСлужебный.ПодключитьНапоминание(ПараметрыНапоминания);
Использование этого метода позволяет избежать ошибок с типами данных и автоматически обновляет кэш напоминаний в текущем сеансе, что может ускорить появление окна.
Проанализируем ситуацию, когда администратор или автоматическая система создает напоминание для другого сотрудника. В этом случае задержка практически неизбежна. Когда вы записываете данные в регистр, вы меняете состояние базы данных. Но сеанс другого пользователя, открытый на другом компьютере, ничего не знает об этих изменениях до тех пор, пока у него не сработает его собственный цикл проверки.
Если вам требуется мгновенное уведомление другого пользователя, стандартный механизм напоминаний БСП для этого не предназначен. В таких случаях лучше рассмотреть использование Системы взаимодействия (встроенный мессенджер 1С), которая работает по протоколу WebSocket и доставляет сообщения мгновенно.
Если задержка в 5-10 минут критична для бизнес-процесса, можно попробовать изменить настройки интервала проверки. Рассмотрим, где это можно сделать:
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("НастройкиНапоминаний", "ИнтервалПроверкиНапоминаний", НужноеЗначениеВСекундах).НапоминанияПользователяГлобальный, найдя вызов ПодключитьОбработчикОжидания. Однако помните, что слишком частый опрос (например, каждые 5 секунд) может существенно замедлить работу клиентского приложения на слабых ПК.Чтобы выяснить точную причину, почему напоминание не появляется, рекомендуем выполнить следующие шаги:
РегистрСведений.НапоминанияПользователя через «Все функции» (или «Функции для технического специалиста») и убедитесь, что запись создана, поле Пользователь заполнено верно, а ВремяСобытия находится в будущем, но не слишком далеко.ПроверитьТекущиеНапоминания модуля НапоминанияПользователяГлобальный. Посмотрите, с какой периодичностью туда заходит отладчик. Если он не заходит вовсе — значит, какой-то процесс блокирует состояние покоя системы.Подводя итог, можно сказать, что механизм напоминаний в 1С — это удобный инструмент для планирования работы, но он не является системой реального времени. Для корректной работы всегда используйте штатные методы БСП, следите за типами данных в измерениях регистров и учитывайте естественные задержки, связанные с архитектурой клиент-серверного взаимодействия.