Народ, в связи с ускорением работы ФормЕкс могут появиться некоторые проблемы в работе пользовательских классов Перехватчика.Например, след.схема перехвата перестала работать
Код формы отчета Процедура ПослеОткрытия()
ПерехватчикПользователя = СоздатьОбъект("ПользовательскийПерехватчик");
ОбъектПерехватчик=СоздатьОбъект("Перехватчик");
ОбъектПерехватчик.ПерехватитьСобытияГК(Контекст, ПерехватчикПользователя);
КонецПроцедуры
Процедура ПриНажатииКнопкиКлавиатуры(КодКлавиши, Alt, Shift, Ctrl, Символ, ФСО) Экспорт
Сообщить("Форма - КодКлавиши:" + КодКлавиши + " Alt:" + Alt + " Shift:" + Shift + " Ctrl:" + Ctrl + " Символ:" + Символ + " ФСО:" + ФСО);
КонецПроцедуры
Код класса Процедура ПриНажатииКнопкиКлавиатуры(КодКлавиши, Alt, Shift, Ctrl, Символ, ФСО) Экспорт
Сообщить("Класс - КодКлавиши:" + КодКлавиши + " Alt:" + Alt + " Shift:" + Shift + " Ctrl:" + Ctrl + " Символ:" + Символ + " ФСО:" + ФСО);
КонецПроцедуры
т.е. после открытия формы при нажатии любой клавиши будет выдаваться не сообщение класса, а сообщение из формы.
Проблема здесь в том, что перехват ставится
уже после того, как оптимизатор событий в ФормЕкс выполнит
в первый и последний раз поиск обработчиков событий в модуле формы.
В дальнейшем поиска не будет, т.е. Перехватчику не к чем будет подцепляться, в итоге наш класс перехвата перестанет работать.
РешениеНужно поставить перехват до того, как сработает оптимизатор ФормЕкс
Например,
Код формы отчета Процедура ВводНового() // вместо ПослеОткрытия
ПерехватчикПользователя = СоздатьОбъект("ПользовательскийПерехватчик");
ОбъектПерехватчик=СоздатьОбъект("Перехватчик");
ОбъектПерехватчик.ПерехватитьСобытияГК(Контекст, ПерехватчикПользователя);
КонецПроцедуры
и все будет ок, можете проверить.
или можно воспользоваться перехватчиками событий глобального модуля типа СобытиеГМ_ПриОткрытии, СобытиеГМ_ВводНового, СобытиеГМ_ВводНаОсновании.
Я лично пользуюсь только этими событиями для установки перехватов в своих конфигурациях.
В дальнейшем я планирую сделать такое универсальное решение, которое не будет зависеть от порядка установки перехвата.Схема -
1. добавить в ФормЕкс::Сервис или РасширениеФормы спец.метод типа ОбновитьМетодыМодуляФормы, чтобы Оптимизатор из ФормЕкс выполнил заново поиск обработчиков, и Перехватчик смог этот поиск перехватить.
2. При создании перехватчика можно будет создавать соответствующий объект формекс.
Если создание не удалось, то значит, ФормЕкс нет, и ничего не делаем.
Если же объект создан, вызываем указанный выше спец.метод, Оптимизатор заново ищет, а Перехватчик перехватывает, и перехват прекрасно работает.
Все это будет во внутренностях 1С++ и ФормЕкс, т.е. прозрачно для разработчика/пользователя 1С++, и не придется переделывать существующий код
ЗЫ по этой причине не будет работать в конфе классов 1С++ пример для класса РедакторТаблицыЗначений