В процессе разработки на платформе 1С:Предприятие 7.7 с использованием внешней компоненты FormEx программисты часто сталкиваются с необходимостью расширения стандартного функционала. Одним из таких расширений является возможность запуска обработки ожидания непосредственно в модуле формы, что недоступно штатными средствами платформы. Однако при использовании метода ОбработкаОжидания расширения формы может возникнуть ситуация, когда невозможно программно получить имя текущей запущенной процедуры. Рассмотрим, почему это происходит и как решить данную проблему.
Разберем типичный сценарий использования расширения формы для управления периодическими процессами. Программист создает объект РасширениеФормы, инициализирует его и пытается запустить мониторинг. Рассмотрим пример кода, который часто приводит к затруднениям:
Перем ФормаРасш;
Процедура ПослеСозданияФормы()
// Создаем объект расширения и привязываем его к текущей форме
ФормаРасш = СоздатьОбъект("РасширениеФормы");
ФормаРасш.УстановитьФорму(Форма);
КонецПроцедуры
Процедура Мониторинг()
// Включаем обработку ожидания.
// В FormEx интервал задается в МИЛЛИСЕКУНДАХ!
ФормаРасш.ОбработкаОжидания("МояОбработка", 1000);
КонецПроцедуры
Процедура МояОбработка()
Сообщить("Сработало");
КонецПроцедуры
Процедура СообщитьТекущуюОбработку()
// Пытаемся получить имя текущей процедуры
НашаПроцедура = ФормаРасш.ОбработкаОжидания();
Сообщить(НашаПроцедура); // Получаем ПУСТУЮ строку
КонецПроцедуры
В данном примере, несмотря на то что процедура МояОбработка() успешно выполняется каждую секунду (выводя сообщение в окно сообщений), попытка прочитать ее имя через вызов ФормаРасш.ОбработкаОжидания() возвращает пустой результат. Проанализируем причины такого поведения системы.
Проблема, описанная выше, не связана с ошибками в логике кода программиста. Это классический пример внутреннего бага внешней компоненты. В версиях FormEx ниже 2.0.5.151 (например, в популярных в свое время 2.0.5.123 и 2.0.5.148) метод ОбработкаОжидания при вызове без параметров не возвращал имя установленной ранее процедуры. Разработчик компоненты (АЛьФ) подтвердил наличие этой ошибки и выпустил исправление.
Важный момент: если вы используете старые сборки FormEx, никакие манипуляции с параметрами (передача пустых кавычек, запятых и т.д.) не помогут получить результат. Решением является только обновление FormEx.dll до версии 151 или выше.
Кроме исправления работы метода чтения процедуры, в версии 2.0.5.151 были внесены критически важные изменения для стабильности системы:
Окна в сочетании с открытыми контекстными меню.Проанализируем более надежный способ организации периодических событий, который предоставляет FormEx — использование специализированного объекта Таймер. Опытные разработчики рекомендуют отказываться от использования ОбработкаОжидания в пользу таймеров по нескольким причинам.
Преимущества объекта Таймер:
ОбработкаОжидания().Рассмотрим, как реализовать ту же задачу с помощью таймера:
Перем МойТаймер;
Процедура ПослеСозданияФормы()
// Создаем объект Таймер
МойТаймер = СоздатьОбъект("Таймер");
// Указываем процедуру и интервал (в мс)
// Таймер может работать как с глобальным модулем, так и с формой
МойТаймер.Установить("МояОбработка", 1000);
КонецПроцедуры
Процедура МояОбработка()
Сообщить("Таймер сработал");
КонецПроцедуры
Процедура ПроверитьТаймер()
// Мы всегда можем проверить статус
Если МойТаймер.Запущен() = 1 Тогда
Сообщить("Текущий процесс: " + МойТаймер.ИмяПроцедуры);
КонецЕсли;
КонецПроцедуры
Посмотрим внимательнее на разницу между штатными средствами 1С и расширенными возможностями FormEx. Это критически важно для производительности системы.
Штатная команда ОбработкаОжидания("Процедура", 1) принимает интервал в секундах. Минимальный интервал — 1 секунда.
Методы FormEx (как в расширении формы, так и в объекте Таймер) принимают интервал в миллисекундах.
Это означает, что если вы по привычке напишете 1, процедура будет вызываться 1000 раз в секунду, что мгновенно приведет к "зависанию" интерфейса 1С из-за перегрузки очереди сообщений Windows.
Рекомендации по выбору интервала:
Если в вашем проекте необходимо использовать именно ФормаРасш.ОбработкаОжидания() и вы столкнулись с возвратом пустой строки:
FormEx.dll в свойствах файла или через Сервис -> О программе (если компонента выводит туда данные).Помните, что использование локальных обработок ожидания (в модуле формы) через FormEx — это мощный инструмент, который делает интерфейс 1С 7.7 более отзывчивым, но требует аккуратного обращения с памятью и ресурсами процессора.