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

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

В процессе разработки на платформе 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 были внесены критически важные изменения для стабильности системы:

  1. Исправлены "падения" (access violation) 1С 7.7 при закрытии программы, когда активны механизмы расширения формы.
  2. Устранена ошибка при программном управлении видимостью меню через объект Окна в сочетании с открытыми контекстными меню.

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

Проанализируем более надежный способ организации периодических событий, который предоставляет FormEx — использование специализированного объекта Таймер. Опытные разработчики рекомендуют отказываться от использования ОбработкаОжидания в пользу таймеров по нескольким причинам.

Преимущества объекта Таймер:

Рассмотрим, как реализовать ту же задачу с помощью таймера:


Перем МойТаймер;

Процедура ПослеСозданияФормы()
    // Создаем объект Таймер
    МойТаймер = СоздатьОбъект("Таймер");
    // Указываем процедуру и интервал (в мс)
    // Таймер может работать как с глобальным модулем, так и с формой
    МойТаймер.Установить("МояОбработка", 1000);
КонецПроцедуры

Процедура МояОбработка()
    Сообщить("Таймер сработал");
КонецПроцедуры

Процедура ПроверитьТаймер()
    // Мы всегда можем проверить статус
    Если МойТаймер.Запущен() = 1 Тогда
        Сообщить("Текущий процесс: " + МойТаймер.ИмяПроцедуры);
    КонецЕсли;
КонецПроцедуры

Технические нюансы использования интервалов

Посмотрим внимательнее на разницу между штатными средствами 1С и расширенными возможностями FormEx. Это критически важно для производительности системы.

Штатная команда ОбработкаОжидания("Процедура", 1) принимает интервал в секундах. Минимальный интервал — 1 секунда. Методы FormEx (как в расширении формы, так и в объекте Таймер) принимают интервал в миллисекундах. Это означает, что если вы по привычке напишете 1, процедура будет вызываться 1000 раз в секунду, что мгновенно приведет к "зависанию" интерфейса 1С из-за перегрузки очереди сообщений Windows.

Рекомендации по выбору интервала:

Итоги и выводы

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

  1. Проверьте версию файла FormEx.dll в свойствах файла или через Сервис -> О программе (если компонента выводит туда данные).
  2. Если версия ниже 2.0.5.151, обязательно обновите компоненту.
  3. Если обновление по каким-то причинам невозможно, используйте объект Таймер, который лишен данного недостатка и предоставляет гораздо более гибкие инструменты управления событиями в среде 1С:Предприятие 7.7.

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

← На главную