Как реализовать напоминание по дате и времени в 1С:Предприятие 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При разработке прикладных решений на платформе 1С:Предприятие 7.7 нередко возникает задача создания системы оповещений и напоминаний для пользователей: например, напомнить о звонке клиенту, наступлении даты оплаты или приближении срока выполнения задачи. Разберем по шагам, как правильно спроектировать архитектуру хранения таких данных и организовать периодическую проверку условий без снижения производительности базы данных.

Архитектура хранения данных: почему не стоит использовать регистры

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

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

Спроектируем реквизиты такого справочника:

  1. Пользователь — тип значения Справочник.Пользователи. Обязательно включим флажок «Сортировка» (создание индекса в базе данных) для быстрого отбора по владельцу.
  2. ДатаНапоминания — тип Дата, также с включенным признаком сортировки.
  3. ВремяНапоминания — тип Строка (формат "ЧЧ:ММ:СС") или число секунд от начала суток.
  4. ДокументОснование — ссылка на документ или неопределенный тип (Документ).
  5. ТекстНапоминания — тип Строка неограниченной или фиксированной длины.
  6. Выполнено — тип Число (длина 1), где 0 — активно, 1 — выполнено.

Организация проверки при старте системы

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


Процедура ПриНачалеРаботыСистемы()
    // Базовая инициализация системы
    // ...
    
    // Проверяем наличие напоминаний при входе
    ПроверитьНапоминанияПриВходе();
КонецПроцедуры

Реализуем процедуру проверки. Поскольку реквизит Пользователь проиндексирован, мы можем использовать быструю выборку элементов по реквизиту:


Процедура ПроверитьНапоминанияПриВходе()
    Перем Спр;
    Спр = СоздатьОбъект("Справочник.Напоминания");
    
    // Выбираем только актуальные напоминания для текущего пользователя
    Спр.ВыбратьЭлементыПоРеквизиту("Пользователь", глТекущийПользователь, 1, 0);
    Пока Спр.ПолучитьЭлемент() = 1 Цикл
        Если Спр.Выполнено = 0 Тогда
            Если Спр.ДатаНапоминания <= ТекущаяДата() Тогда
                // Открываем форму оповещения
                ОткрытьФорму("Обработка.Оповещение", Спр.ТекущийЭлемент());
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Периодический опрос по таймеру через ОбработкаОжидания

Если требуется отслеживать точное время наступления события в течение рабочего дня, используем штатную функцию платформы ОбработкаОжидания(). Запуск фоновой проверки также выполняется в процедуре ПриНачалеРаботыСистемы().

Синтаксис метода:

ОбработкаОжидания(<ИмяПроцедуры>, <ИнтервалВСекундах>);

Настроим регулярный вызов процедуры каждые 60 секунд:


Процедура ПриНачалеРаботыСистемы()
    // Запускаем фоновую проверку с интервалом 60 секунд
    ОбработкаОжидания("глПроверитьНапоминанияПоВремени", 60);
КонецПроцедуры

Разберем процедуру диспетчеризации в Глобальном модуле:


Процедура глПроверитьНапоминанияПоВремени() Экспорт
    Перем Спр, ВремяСравнения;
    
    Спр = СоздатьОбъект("Справочник.Напоминания");
    ВремяСравнения = ТекущееВремя();
    
    Спр.ВыбратьЭлементыПоРеквизиту("Пользователь", глТекущийПользователь, 1, 0);
    Пока Спр.ПолучитьЭлемент() = 1 Цикл
        Если Спр.Выполнено = 0 Тогда
            // Проверяем соответствие даты и наступление нужного времени
            Если Спр.ДатаНапоминания = ТекущаяДата() Тогда
                Если Спр.ВремяНапоминания <= ВремяСравнения Тогда
                    // Выводим напоминание
                    ОткрытьФорму("Обработка.Оповещение", Спр.ТекущийЭлемент());
                КонецЕсли;
            ИначеЕсли Спр.ДатаНапоминания < ТекущаяДата() Тогда
                // Просроченное напоминание за прошлые дни
                ОткрытьФорму("Обработка.Оповещение", Спр.ТекущийЭлемент());
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Важные платформенные ограничения и тонкости реализации

Проанализируем технические особенности платформы 1С:Предприятие 7.7, которые необходимо учитывать при эксплуатации таймеров:

  1. Единственный обработчик ожидания на сеанс. В платформе 7.7 может работать только один обработчик ожидания. Если в конфигурации уже используется вызов функции ОбработкаОжидания() (например, для проверки почты или автоматического завершения работы пользователей), повторный вызов с другим именем процедуры перезапишет предыдущий. В таких случаях создается общая процедура-диспетчер, внутри которой по очереди вызываются все нужные подсистемы. Вызов ОбработкаОжидания("", 0) полностью отключает таймер.
  2. Блокировка модальными окнами. Таймер ожидания полностью приостанавливает отсчет и выполнение, если у пользователя открыто любое модальное окно (функции Предупреждение(), Вопрос(), окно выбора значения или модальная печатная форма). Поэтому оповещение сработает только тогда, когда пользователь закроет модальный диалог.
  3. Срыв фокуса ввода. Не используйте блокирующие команды Предупреждение() внутри циклов проверки: если окно появится в момент быстрого набора текста пользователем, фокус собьется, а введенные данные могут быть потеряны. Рекомендуется использовать немодальную форму обработки оповещения через ОткрытьФорму() либо предварительно выводить информацию в строку состояния методом Статус().
  4. Нагрузка на базу данных. При многопользовательской работе в файловом режиме (DBF) слишком частый запуск опроса (например, каждые 5–10 секунд) приводит к постоянным блокировкам таблиц. Интервал от 60 до 300 секунд является оптимальным для большинства сценариев напоминаний.
← На главную