При разработке интерактивных форм в 1С:Предприятие 7.7 периодически возникает задача динамического изменения таймаута фоновой обработки. Например, при отсутствии действий пользователя или нераспределенных данных требуется увеличивать паузу между повторными вызовами, чтобы уменьшить нагрузку на клиентское приложение.
Рассмотрим, как устроена работа с фоновыми процедурами формы, какие технические ограничения есть у платформы 7.7 и какими способами можно реализовать изменение интервала вызова.
Перед тем как переходить к написанию кода, проанализируем базовые правила работы штатного таймера формы в платформе 1С 7.7:
Форма.ОбработкаОжидания() с тем же или другим именем процедуры не запускает параллельный процесс, а замещает предыдущие настройки.0 в качестве второго параметра.Прямой способ изменить интервал вызова — вызвать метод Форма.ОбработкаОжидания() с обновленным временем непосредственно в теле самой процедуры-обработчика. Предварительно отключать таймер вызовом с нулем не требуется: новый вызов сразу перезапускает отсчет с обновленным значением.
Разберем пример реализации, в котором интервал вызова увеличивается на 1 секунду при каждом исполнении алгоритма:
Перем ИнтервалВызова;
Процедура МояПроцедура()
// Увеличиваем интервал на 1 секунду
ИнтервалВызова = ИнтервалВызова + 1;
// Выполняем необходимую бизнес-логику
Сообщить("Вызов процедуры. Следующий интервал: " + ИнтервалВызова + " сек.");
// Перезапускаем обработчик ожидания с новым временем
Форма.ОбработкаОжидания("МояПроцедура", ИнтервалВызова);
КонецПроцедуры
// Первоначальный запуск процедуры в модуле формы
ИнтервалВызова = 2;
Форма.ОбработкаОжидания("МояПроцедура", ИнтервалВызова);
Альтернативный подход заключается в том, чтобы не переподключать таймер формы постоянно, а запустить обработчик с минимальным интервалом (например, 1 секунда) и контролировать реальную необходимость выполнения операций внутри процедуры.
Простой подсчет количества срабатываний может давать погрешность из-за задержек системы или паузы при открытии диалогов. Поэтому для точного отслеживания временных отрезков рекомендуется фиксировать системное время последнего выполнения через переменную или реквизит формы.
Посмотрим на пример реализации с проверкой времени:
Перем ВремяПоследнегоВыполнения;
Перем ТекущийИнтервал;
Процедура МояПроцедура()
// Проверяем, прошло ли достаточное количество времени
Если РабочееВремя() < (ВремяПоследнегоВыполнения + ТекущийИнтервал) Тогда
Возврат;
КонецЕсли;
// Фиксируем время выполнения и увеличиваем интервал для следующего шага
ВремяПоследнегоВыполнения = РабочееВремя();
ТекущийИнтервал = ТекущийИнтервал + 2; // Увеличиваем задержку на 2 секунды
// Выполняем логику обработки
Сообщить("Операция выполнена в " + ВремяПоследнегоВыполнения);
КонецПроцедуры
// Инициализация при открытии формы
ВремяПоследнегоВыполнения = РабочееВремя();
ТекущийИнтервал = 2;
// Запускаем таймер с минимальной дискретностью в 1 секунду
Форма.ОбработкаОжидания("МояПроцедура", 1);
Если возможностей штатного механизма 1С 7.7 недостаточно (например, требуются интервалы менее 1 секунды или обработка должна продолжать работать при открытых модальных диалогах), применяют внешние компоненты:
Сервис и собственный метод обработки ожидания, поддерживающий отсчет в миллисекундах и параллельные таймеры.Таймер или напрямую обращаться к Windows API, обеспечивая фоновые вызовы независимо от состояния покоя формы.Выбор конкретного решения зависит от требований к точности интервалов и допустимой нагрузки на клиентский сеанс.