Как динамически изменять интервал вызова в Форма.ОбработкаОжидания в 1С 7.7

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

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

Рассмотрим, как устроена работа с фоновыми процедурами формы, какие технические ограничения есть у платформы 7.7 и какими способами можно реализовать изменение интервала вызова.

Ограничения и особенности работы ОбработкаОжидания в 1С 7.7

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

  1. Один таймер на форму: платформа позволяет хранить только один активный обработчик ожидания для каждой конкретной формы (и один для глобального модуля). Повторный вызов метода Форма.ОбработкаОжидания() с тем же или другим именем процедуры не запускает параллельный процесс, а замещает предыдущие настройки.
  2. Дискретность интервала: значение интервала задается исключительно в целых секундах. Дробные значения и интервалы меньше 1 секунды встроенными средствами платформы не поддерживаются.
  3. Остановка таймера: для полного отключения вызова фоновой процедуры передается число 0 в качестве второго параметра.
  4. Блокировка модальными окнами: обработчик вызывается только тогда, когда платформа переходит в состояние покоя (Idle). Если открыто модальное окно или идет выполнение длительного алгоритма, вызов приостанавливается до завершения операции.

Способ 1. Перезапуск обработчика с новым интервалом из вызываемой процедуры

Прямой способ изменить интервал вызова — вызвать метод Форма.ОбработкаОжидания() с обновленным временем непосредственно в теле самой процедуры-обработчика. Предварительно отключать таймер вызовом с нулем не требуется: новый вызов сразу перезапускает отсчет с обновленным значением.

Разберем пример реализации, в котором интервал вызова увеличивается на 1 секунду при каждом исполнении алгоритма:


Перем ИнтервалВызова;

Процедура МояПроцедура()
    // Увеличиваем интервал на 1 секунду
    ИнтервалВызова = ИнтервалВызова + 1;
    
    // Выполняем необходимую бизнес-логику
    Сообщить("Вызов процедуры. Следующий интервал: " + ИнтервалВызова + " сек.");
    
    // Перезапускаем обработчик ожидания с новым временем
    Форма.ОбработкаОжидания("МояПроцедура", ИнтервалВызова);
КонецПроцедуры

// Первоначальный запуск процедуры в модуле формы
ИнтервалВызова = 2;
Форма.ОбработкаОжидания("МояПроцедура", ИнтервалВызова);

Способ 2. Запуск с постоянным минимальным интервалом и проверка времени

Альтернативный подход заключается в том, чтобы не переподключать таймер формы постоянно, а запустить обработчик с минимальным интервалом (например, 1 секунда) и контролировать реальную необходимость выполнения операций внутри процедуры.

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

Посмотрим на пример реализации с проверкой времени:


Перем ВремяПоследнегоВыполнения;
Перем ТекущийИнтервал;

Процедура МояПроцедура()
    // Проверяем, прошло ли достаточное количество времени
    Если РабочееВремя() < (ВремяПоследнегоВыполнения + ТекущийИнтервал) Тогда
        Возврат;
    КонецЕсли;
    
    // Фиксируем время выполнения и увеличиваем интервал для следующего шага
    ВремяПоследнегоВыполнения = РабочееВремя();
    ТекущийИнтервал = ТекущийИнтервал + 2; // Увеличиваем задержку на 2 секунды
    
    // Выполняем логику обработки
    Сообщить("Операция выполнена в " + ВремяПоследнегоВыполнения);
КонецПроцедуры

// Инициализация при открытии формы
ВремяПоследнегоВыполнения = РабочееВремя();
ТекущийИнтервал = 2;
// Запускаем таймер с минимальной дискретностью в 1 секунду
Форма.ОбработкаОжидания("МояПроцедура", 1);

Способ 3. Использование внешних компонент (FormEx и 1С++)

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

  1. Расширение FormEx: предоставляет специальный объект Сервис и собственный метод обработки ожидания, поддерживающий отсчет в миллисекундах и параллельные таймеры.
  2. Компонента 1С++: позволяет использовать класс Таймер или напрямую обращаться к Windows API, обеспечивая фоновые вызовы независимо от состояния покоя формы.

Выбор конкретного решения зависит от требований к точности интервалов и допустимой нагрузки на клиентский сеанс.

← На главную