При работе с платформой 1С:Предприятие 7.7 и компонентой FormEx многие разработчики сталкиваются с необходимостью выполнения определенных действий по расписанию с высокой точностью. Одним из ключевых инструментов для этого является метод ОбработкаОжидания. Однако, часто возникает путаница между штатной функцией 1С и методом, предоставляемым FormEx, особенно в части задания интервала. Давайте подробно разберем, как правильно использовать ОбработкаОжидания в FormEx для установки интервала в миллисекундах.
Изначально, разработчики могут столкнуться с тем, что, несмотря на описание в документации FormEx, указывающее на интервал в миллисекундах, вызов процедуры через ОбработкаОжидания, казалось бы, работает только с интервалом в секундах. Например, код:
Форма.ОбработкаОжидания("НужнаяПроцедура", 1);
может приводить к вызову НужнаяПроцедура с интервалом в 1 секунду. Попытки задать значения вроде 0.5 или 500 (предполагая 500 миллисекунд) приводят либо к ошибкам, либо к значительно более длительным интервалам (например, 500 секунд вместо 0.5).
Причина такого поведения кроется в том, что в системе 1С:Предприятие 7.7 существует штатная, недокументированная функция Форма.ОбработкаОжидания. Эта функция, при ее использовании, действительно оперирует интервалами в секундах. Ее точность ограничена десятыми долями секунды, и минимально корректное значение для многократного вызова обычно составляет 1 секунду. При этом, она может прекращать работу при открытии некоторых системных модальных диалогов (например, открытия/сохранения файла).
Компонента FormEx, в свою очередь, предоставляет собственный метод ОбработкаОжидания через объект РасширениеФормы. Именно этот метод позволяет задавать интервал вызова процедуры в миллисекундах. Это ключевое отличие, которое позволяет добиться гораздо более точной и частой реакции на события.
Таким образом, основной ошибкой является попытка вызвать метод ОбработкаОжидания напрямую от объекта Форма, когда требуется функциональность FormEx. Мы должны явно использовать объект РасширениеФормы.
Для того чтобы задать интервал вызова процедуры в миллисекундах с помощью FormEx, необходимо выполнить следующие шаги:
РасширениеФормы: В модуле формы или в глобальном модуле необходимо создать экземпляр объекта РасширениеФормы. Этот объект является интерфейсом к расширенным возможностям FormEx для конкретной формы.ОбработкаОжидания через созданный объект: Используйте метод ОбработкаОжидания, вызванный от экземпляра РасширениеФормы, передав ему имя процедуры и желаемый интервал в миллисекундах.Рассмотрим конкретный пример кода, который демонстрирует правильное использование РасширениеФормы.ОбработкаОжидания:
// В модуле формы объявляем переменные для хранения объекта РасширениеФормы
// и для управления состоянием (в данном случае для мигания)
Перем ТекСост;
Перем ФФ;
// Процедура, которая будет вызываться по таймеру
Процедура Мигать()
// Делаем надпись видимой (если она была скрыта)
Форма.надпПодч.Видимость(1);
// Переключаем цвет надписей для создания эффекта мигания
Если ТекСост = 1 Тогда
Форма.надпМарк.Цвет(255, 0, 0); // Красный
Форма.надпПодч.Цвет(255, 0, 0); // Красный
ТекСост = 0;
Иначе
Форма.надпМарк.Цвет(255, 127, 0); // Оранжевый
Форма.надпПодч.Цвет(255, 127, 0); // Оранжевый
ТекСост = 1;
КонецЕсли;
КонецПроцедуры
// Процедура для запуска ОбработкиОжидания
Процедура Сформировать()
// Запускаем процедуру "Мигать" с интервалом 100 миллисекунд
// Важно: вызываем от объекта ФФ (РасширениеФормы), а не от Форма
ФФ.ОбработкаОжидания("Мигать", 100);
КонецПроцедуры
// Процедура, выполняемая при открытии формы
Процедура ПриОткрытии()
// Изначально скрываем одну из надписей
Форма.надпПодч.Видимость(0);
КонецПроцедуры
// Процедура, выполняемая после открытия формы
Процедура ПослеОткрытия()
// Создаем объект РасширениеФормы
ФФ = СоздатьОбъект("РасширениеФормы");
// Запускаем обработку ожидания
Сформировать();
КонецПроцедуры
В приведенном примере мы видим, что:
ФФ объявляется и инициализируется как СоздатьОбъект("РасширениеФормы").ОбработкаОжидания вызывается от объекта ФФ: ФФ.ОбработкаОжидания("Мигать", 100);. Здесь 100 означает 100 миллисекунд, что соответствует 0.1 секунды.Такой подход позволяет нам достичь желаемой точности в миллисекундах.
Для остановки ранее запущенного процесса ОбработкаОжидания необходимо вызвать его с интервалом 0:
ФФ.ОбработкаОжидания("Мигать", 0);
Это позволит корректно прекратить выполнение фоновой процедуры, освободив ресурсы.
При выборе интервала в миллисекундах, важно учитывать цель вашей обработки:
РасширениеФормы.ОбработкаОжидания (FormEx)Помимо возможности задавать интервал в миллисекундах, метод РасширениеФормы.ОбработкаОжидания обладает еще одним важным преимуществом:
ОбработкиОжидания 1С 7.7 (и некоторых аналогов в 1С 8.x), версия FormEx способна продолжать вызывать процедуру даже при открытых модальных формах 1С:Предприятия. Это критически важно для сценариев, где требуется выполнение фоновых задач (например, отслеживание состояния, синхронизация) пока пользователь взаимодействует с модальным окном.Таймер FormExДля более сложных сценариев, компонента FormEx предлагает также объект Таймер. Этот объект предоставляет ряд дополнительных возможностей по сравнению с РасширениеФормы.ОбработкаОжидания:
Таймер, каждый со своим интервалом и процедурой-обработчиком. Это позволяет параллельно выполнять несколько фоновых задач, не конфликтуя друг с другом.Таймер могут быть созданы и использоваться не только в модулях форм, но и в глобальном модуле или даже в объектах 1С++, что делает их более гибкими для реализации фоновых процессов на уровне всего приложения.Если для нашей задачи достаточно одного таймера и его функционала в контексте одной формы, то использование РасширениеФормы.ОбработкаОжидания вполне приемлемо и может быть более простым в реализации. Однако, если требуется более сложная система фоновых задач с разными интервалами и областями действия, объект Таймер FormEx станет более мощным и предпочтительным решением.
ПодключитьОбработчикОжидания в 1С 8.x (для полноты картины)Хотя основная тема касается 1С 7.7 и FormEx, важно упомянуть, что в 1С:Предприятии 8.x существует аналогичный документированный метод ПодключитьОбработчикОжидания. Мы также рассмотрим его особенности для более полного понимания контекста фоновых обработок:
ОтключитьОбработчикОжидания().ЗаблокироватьРаботуПользователя().Мы выяснили, что основная путаница при работе с ОбработкаОжидания заключается в различии между штатной функцией 1С 7.7 (работающей в секундах) и методом, предоставляемым компонентой FormEx (работающим в миллисекундах). Для использования миллисекундных интервалов и преимуществ FormEx (включая работу в модальном режиме), необходимо использовать объект РасширениеФормы. Для более сложных сценариев, FormEx также предлагает объект Таймер, который предоставляет расширенные возможности для управления множественными фоновыми процессами. Выбирая подходящий инструмент, мы можем эффективно реализовать требуемый функционал в наших приложениях на 1С.