Как задать интервал вызова процедуры ОбработкаОжидания в FormEx в миллисекундах?

Программист 1С v7.7
← На главную

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

Суть проблемы: секунды или миллисекунды?

Изначально, разработчики могут столкнуться с тем, что, несмотря на описание в документации FormEx, указывающее на интервал в миллисекундах, вызов процедуры через ОбработкаОжидания, казалось бы, работает только с интервалом в секундах. Например, код:

Форма.ОбработкаОжидания("НужнаяПроцедура", 1);

может приводить к вызову НужнаяПроцедура с интервалом в 1 секунду. Попытки задать значения вроде 0.5 или 500 (предполагая 500 миллисекунд) приводят либо к ошибкам, либо к значительно более длительным интервалам (например, 500 секунд вместо 0.5).

Ключевое различие: штатная 1С против FormEx

Причина такого поведения кроется в том, что в системе 1С:Предприятие 7.7 существует штатная, недокументированная функция Форма.ОбработкаОжидания. Эта функция, при ее использовании, действительно оперирует интервалами в секундах. Ее точность ограничена десятыми долями секунды, и минимально корректное значение для многократного вызова обычно составляет 1 секунду. При этом, она может прекращать работу при открытии некоторых системных модальных диалогов (например, открытия/сохранения файла).

Компонента FormEx, в свою очередь, предоставляет собственный метод ОбработкаОжидания через объект РасширениеФормы. Именно этот метод позволяет задавать интервал вызова процедуры в миллисекундах. Это ключевое отличие, которое позволяет добиться гораздо более точной и частой реакции на события.

Таким образом, основной ошибкой является попытка вызвать метод ОбработкаОжидания напрямую от объекта Форма, когда требуется функциональность FormEx. Мы должны явно использовать объект РасширениеФормы.

Решение: Использование РасширенияФормы для ОбработкиОжидания в миллисекундах

Для того чтобы задать интервал вызова процедуры в миллисекундах с помощью FormEx, необходимо выполнить следующие шаги:

  1. Загрузить компоненту FormEx: Убедитесь, что компонента FormEx корректно установлена и загружена в вашей базе 1С. Обычно это делается в глобальном модуле или при запуске приложения.
  2. Создать объект РасширениеФормы: В модуле формы или в глобальном модуле необходимо создать экземпляр объекта РасширениеФормы. Этот объект является интерфейсом к расширенным возможностям FormEx для конкретной формы.
  3. Вызвать метод ОбработкаОжидания через созданный объект: Используйте метод ОбработкаОжидания, вызванный от экземпляра РасширениеФормы, передав ему имя процедуры и желаемый интервал в миллисекундах.

Рассмотрим конкретный пример кода, который демонстрирует правильное использование РасширениеФормы.ОбработкаОжидания:


// В модуле формы объявляем переменные для хранения объекта РасширениеФормы
// и для управления состоянием (в данном случае для мигания)
Перем ТекСост;
Перем ФФ;

// Процедура, которая будет вызываться по таймеру
Процедура Мигать()
    // Делаем надпись видимой (если она была скрыта)
    Форма.надпПодч.Видимость(1);
    
    // Переключаем цвет надписей для создания эффекта мигания
    Если ТекСост = 1 Тогда
        Форма.надпМарк.Цвет(255, 0, 0);       // Красный
        Форма.надпПодч.Цвет(255, 0, 0);       // Красный
        ТекСост = 0;
    Иначе
        Форма.надпМарк.Цвет(255, 127, 0);     // Оранжевый
        Форма.надпПодч.Цвет(255, 127, 0);     // Оранжевый
        ТекСост = 1;
    КонецЕсли;
КонецПроцедуры

// Процедура для запуска ОбработкиОжидания
Процедура Сформировать()
    // Запускаем процедуру "Мигать" с интервалом 100 миллисекунд
    // Важно: вызываем от объекта ФФ (РасширениеФормы), а не от Форма
    ФФ.ОбработкаОжидания("Мигать", 100); 
КонецПроцедуры

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

// Процедура, выполняемая после открытия формы
Процедура ПослеОткрытия()
    // Создаем объект РасширениеФормы
    ФФ = СоздатьОбъект("РасширениеФормы");
    
    // Запускаем обработку ожидания
    Сформировать();    
КонецПроцедуры

В приведенном примере мы видим, что:

  1. Переменная ФФ объявляется и инициализируется как СоздатьОбъект("РасширениеФормы").
  2. Метод ОбработкаОжидания вызывается от объекта ФФ: ФФ.ОбработкаОжидания("Мигать", 100);. Здесь 100 означает 100 миллисекунд, что соответствует 0.1 секунды.

Такой подход позволяет нам достичь желаемой точности в миллисекундах.

Остановка ОбработкиОжидания

Для остановки ранее запущенного процесса ОбработкаОжидания необходимо вызвать его с интервалом 0:

ФФ.ОбработкаОжидания("Мигать", 0);

Это позволит корректно прекратить выполнение фоновой процедуры, освободив ресурсы.

Практические советы по выбору интервала

При выборе интервала в миллисекундах, важно учитывать цель вашей обработки:

Преимущества РасширениеФормы.ОбработкаОжидания (FormEx)

Помимо возможности задавать интервал в миллисекундах, метод РасширениеФормы.ОбработкаОжидания обладает еще одним важным преимуществом:

Альтернатива: Объект Таймер FormEx

Для более сложных сценариев, компонента FormEx предлагает также объект Таймер. Этот объект предоставляет ряд дополнительных возможностей по сравнению с РасширениеФормы.ОбработкаОжидания:

Если для нашей задачи достаточно одного таймера и его функционала в контексте одной формы, то использование РасширениеФормы.ОбработкаОжидания вполне приемлемо и может быть более простым в реализации. Однако, если требуется более сложная система фоновых задач с разными интервалами и областями действия, объект Таймер FormEx станет более мощным и предпочтительным решением.

Обзор ПодключитьОбработчикОжидания в 1С 8.x (для полноты картины)

Хотя основная тема касается 1С 7.7 и FormEx, важно упомянуть, что в 1С:Предприятии 8.x существует аналогичный документированный метод ПодключитьОбработчикОжидания. Мы также рассмотрим его особенности для более полного понимания контекста фоновых обработок:

Заключение

Мы выяснили, что основная путаница при работе с ОбработкаОжидания заключается в различии между штатной функцией 1С 7.7 (работающей в секундах) и методом, предоставляемым компонентой FormEx (работающим в миллисекундах). Для использования миллисекундных интервалов и преимуществ FormEx (включая работу в модальном режиме), необходимо использовать объект РасширениеФормы. Для более сложных сценариев, FormEx также предлагает объект Таймер, который предоставляет расширенные возможности для управления множественными фоновыми процессами. Выбирая подходящий инструмент, мы можем эффективно реализовать требуемый функционал в наших приложениях на 1С.

← На главную