Почему перестали срабатывать напоминания в 1С (БСП) и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Механизм напоминаний в Библиотеке стандартных подсистем (БСП) — это крайне удобный инструмент для пользователей, позволяющий не забыть о важных задачах, звонках или документах. Однако многие разработчики и администраторы систем сталкиваются с ситуацией, когда этот функционал начинает работать некорректно: еженедельные или ежедневные напоминания не всплывают в назначенное время, а появляются «пачкой» только при утреннем запуске программы или вообще игнорируются системой. В этой статье мы подробно разберем причины такого поведения и проанализируем способы исправления этой ошибки.

Суть проблемы и симптомы

Рассмотрим типичную ситуацию, описанную пользователями: в системе настроены напоминания, которые должны срабатывать в течение рабочего дня. Но в реальности происходит следующее: напоминание, установленное на 10:00, не появляется. Но если пользователь закроет программу и запустит её снова, окно с напоминанием сразу же отобразится. Также часто наблюдается проблема с программно формируемыми напоминаниями — они «засыпают» и активируются только после перезапуска сеанса.

Давайте выясним причину такого поведения. Проблема чаще всего кроется не в ошибках кода конкретной конфигурации (ЗУП, ERP или самописной), а в архитектурных особенностях взаимодействия клиента и сервера в БСП, а также в изменениях работы платформы «1С:Предприятие» последних версий.

Причина №1: Механизм кеширования данных на клиенте

Для оптимизации производительности БСП не запрашивает данные из базы данных (регистра сведений НапоминанияПользователя) каждую минуту. Вместо этого в системе реализован механизм локального кеширования. При запуске клиентского приложения или при первом срабатывании обработчика ожидания формируется временная структура в памяти клиента, содержащая список ближайших событий.

Проанализируем ситуацию: если новое напоминание создается программно на сервере или другим пользователем (или даже самим пользователем, но в другом окне), текущий сеанс об этом может не узнать. Клиент «спит», ориентируясь на старую таблицу кеша, и не видит необходимости обращаться к серверу. Обновление этого кеша происходит либо при определенных интерактивных действиях, либо при перезапуске, что и объясняет «пакетное» появление уведомлений утром.

Причина №2: Особенности платформы 8.3.20 и выше

Начиная с версий платформы 8.3.20, 8.3.21 и 8.3.22, механизмы работы фоновых заданий и клиентских обработчиков ожидания претерпели изменения. Выясним, как это влияет на нашу задачу:

  1. Блокирующие окна: Если в системе открыто модальное окно или окно, блокирующее интерфейс, метод ПодключитьОбработчикОжидания может приостановить свою работу.
  2. Энергосбережение и спящий режим: На современных операционных системах (Windows 10/11) при уходе компьютера в спящий режим сеанс 1С может «зависнуть» в плане выполнения фоновых скриптов. После пробуждения обработчик не всегда корректно восстанавливает цикл проверки.
  3. Динамический интервал: В ряде версий БСП интервал следующей проверки рассчитывается динамически. Например, если ближайшее напоминание должно быть через 2 часа, система может установить обработчик ожидания именно на это время. Если в течение этих двух часов появится новое, более срочное напоминание, система его просто «прозевает».

Причина №3: Часовые пояса

БСП активно использует функцию ТекущаяДатаСеанса(). Если время на сервере 1С, сервере баз данных и локальной рабочей станции пользователя различается (даже на несколько минут или из-за неправильной настройки смещения часового пояса), логика сравнения дат в запросе может давать сбои. Напоминание может считаться «будущим» для сервера и «прошедшим» для клиента одновременно.

Пошаговое решение проблемы через расширение

Наиболее эффективным способом исправления является корректировка логики обновления кеша в общем модуле НапоминанияПользователяКлиент. Мы воспользуемся механизмом расширений, чтобы не снимать конфигурацию с поддержки.

Нам необходимо доработать процедуру ПолучитьТекущиеОповещения. Основная идея заключается в том, чтобы принудительно сбрасывать флаг актуальности кеша или добавлять проверку на необходимость обращения к серверу, если прошло определенное время с момента последнего обновления.

Рассмотрим пример кода, который необходимо внедрить в расширение:


&Вместо("ПолучитьТекущиеОповещения")
Процедура Ипр_ПолучитьТекущиеОповещения()
    
    // Определим время последнего обновления кеша (локальная переменная модуля или параметр)
    // В оригинальном коде БСП часто стоит жесткое условие: 
    // если таблица заполнена, сервер не опрашивается.
    
    ПараметрыНапоминаний = НапоминанияПользователяСлужебныйКлиент.ПараметрыРаботыНапоминаний();
    
    // Нам нужно заставить систему вызвать серверный метод 
    // НапоминанияПользователяВызовСервера.ПолучитьНапоминанияПользователя()
    // даже если система считает, что данные актуальны.
    
    // Принудительно очищаем время следующего оповещения, чтобы спровоцировать обновление
    ПараметрыНапоминаний.ДатаСледующегоОповещения = '00010101000000';
    
    // Вызываем оригинальную логику или переписываем получение данных
    ПродолжитьВызов();
    
КонецПроцедуры

Разберем по шагам, что мы сделали:

  1. Мы перехватили выполнение процедуры получения уведомлений на клиенте.
  2. Мы принудительно «обнулили» дату следующего запланированного оповещения в структуре параметров. Это заставляет алгоритм БСП думать, что данные устарели.
  3. В результате при следующем цикле обработчика ожидания система гарантированно обратится к серверу и получит актуальные записи из регистра, включая те, что были созданы программно или в других сеансах.

Рекомендация по настройке интервала

Проанализируем настройки интервала. В общем модуле НапоминанияПользователяСлужебныйКлиент обычно задан стандартный интервал проверки (например, 60 секунд). Если в вашей версии БСП используется динамический расчет, мы рекомендуем изменить его на фиксированный. Это гарантирует, что даже если компьютер «заснул» и «проснулся», проверка базы произойдет не позднее чем через минуту.

Также проверьте настройки в регистре сведений НапоминанияПользователя. Иногда записи могут блокироваться из-за незавершенных транзакций в фоновых заданиях, если напоминания создаются сложными бизнес-процессами. Убедитесь, что запись в регистр происходит с корректно указанным пользователем (именно по ИдентификаторПользователяИБ), иначе клиентское приложение просто не «узнает» свое напоминание.

Итоги

Подведем итог нашему исследованию. Проблема «заснувших» напоминаний в БСП — это следствие избыточной оптимизации кеширования на стороне клиента. Чтобы вернуть функционалу стабильность, выполните следующие действия:

Используя предложенный подход с принудительным обновлением кеша в процедуре ПолучитьТекущиеОповещения, вы обеспечите своевременное появление уведомлений и повысите эффективность работы пользователей в системе 1С.

← На главную