Механизм напоминаний в Библиотеке стандартных подсистем (БСП) — это крайне удобный инструмент для пользователей, позволяющий не забыть о важных задачах, звонках или документах. Однако многие разработчики и администраторы систем сталкиваются с ситуацией, когда этот функционал начинает работать некорректно: еженедельные или ежедневные напоминания не всплывают в назначенное время, а появляются «пачкой» только при утреннем запуске программы или вообще игнорируются системой. В этой статье мы подробно разберем причины такого поведения и проанализируем способы исправления этой ошибки.
Рассмотрим типичную ситуацию, описанную пользователями: в системе настроены напоминания, которые должны срабатывать в течение рабочего дня. Но в реальности происходит следующее: напоминание, установленное на 10:00, не появляется. Но если пользователь закроет программу и запустит её снова, окно с напоминанием сразу же отобразится. Также часто наблюдается проблема с программно формируемыми напоминаниями — они «засыпают» и активируются только после перезапуска сеанса.
Давайте выясним причину такого поведения. Проблема чаще всего кроется не в ошибках кода конкретной конфигурации (ЗУП, ERP или самописной), а в архитектурных особенностях взаимодействия клиента и сервера в БСП, а также в изменениях работы платформы «1С:Предприятие» последних версий.
Для оптимизации производительности БСП не запрашивает данные из базы данных (регистра сведений НапоминанияПользователя) каждую минуту. Вместо этого в системе реализован механизм локального кеширования. При запуске клиентского приложения или при первом срабатывании обработчика ожидания формируется временная структура в памяти клиента, содержащая список ближайших событий.
Проанализируем ситуацию: если новое напоминание создается программно на сервере или другим пользователем (или даже самим пользователем, но в другом окне), текущий сеанс об этом может не узнать. Клиент «спит», ориентируясь на старую таблицу кеша, и не видит необходимости обращаться к серверу. Обновление этого кеша происходит либо при определенных интерактивных действиях, либо при перезапуске, что и объясняет «пакетное» появление уведомлений утром.
Начиная с версий платформы 8.3.20, 8.3.21 и 8.3.22, механизмы работы фоновых заданий и клиентских обработчиков ожидания претерпели изменения. Выясним, как это влияет на нашу задачу:
ПодключитьОбработчикОжидания может приостановить свою работу.БСП активно использует функцию ТекущаяДатаСеанса(). Если время на сервере 1С, сервере баз данных и локальной рабочей станции пользователя различается (даже на несколько минут или из-за неправильной настройки смещения часового пояса), логика сравнения дат в запросе может давать сбои. Напоминание может считаться «будущим» для сервера и «прошедшим» для клиента одновременно.
Наиболее эффективным способом исправления является корректировка логики обновления кеша в общем модуле НапоминанияПользователяКлиент. Мы воспользуемся механизмом расширений, чтобы не снимать конфигурацию с поддержки.
Нам необходимо доработать процедуру ПолучитьТекущиеОповещения. Основная идея заключается в том, чтобы принудительно сбрасывать флаг актуальности кеша или добавлять проверку на необходимость обращения к серверу, если прошло определенное время с момента последнего обновления.
Рассмотрим пример кода, который необходимо внедрить в расширение:
&Вместо("ПолучитьТекущиеОповещения")
Процедура Ипр_ПолучитьТекущиеОповещения()
// Определим время последнего обновления кеша (локальная переменная модуля или параметр)
// В оригинальном коде БСП часто стоит жесткое условие:
// если таблица заполнена, сервер не опрашивается.
ПараметрыНапоминаний = НапоминанияПользователяСлужебныйКлиент.ПараметрыРаботыНапоминаний();
// Нам нужно заставить систему вызвать серверный метод
// НапоминанияПользователяВызовСервера.ПолучитьНапоминанияПользователя()
// даже если система считает, что данные актуальны.
// Принудительно очищаем время следующего оповещения, чтобы спровоцировать обновление
ПараметрыНапоминаний.ДатаСледующегоОповещения = '00010101000000';
// Вызываем оригинальную логику или переписываем получение данных
ПродолжитьВызов();
КонецПроцедуры
Разберем по шагам, что мы сделали:
Проанализируем настройки интервала. В общем модуле НапоминанияПользователяСлужебныйКлиент обычно задан стандартный интервал проверки (например, 60 секунд). Если в вашей версии БСП используется динамический расчет, мы рекомендуем изменить его на фиксированный. Это гарантирует, что даже если компьютер «заснул» и «проснулся», проверка базы произойдет не позднее чем через минуту.
Также проверьте настройки в регистре сведений НапоминанияПользователя. Иногда записи могут блокироваться из-за незавершенных транзакций в фоновых заданиях, если напоминания создаются сложными бизнес-процессами. Убедитесь, что запись в регистр происходит с корректно указанным пользователем (именно по ИдентификаторПользователяИБ), иначе клиентское приложение просто не «узнает» свое напоминание.
Подведем итог нашему исследованию. Проблема «заснувших» напоминаний в БСП — это следствие избыточной оптимизации кеширования на стороне клиента. Чтобы вернуть функционалу стабильность, выполните следующие действия:
НапоминанияПользователяКлиент, как мы рассмотрели выше.Используя предложенный подход с принудительным обновлением кеша в процедуре ПолучитьТекущиеОповещения, вы обеспечите своевременное появление уведомлений и повысите эффективность работы пользователей в системе 1С.