Приветствую, уважаемые!
Может кто поможет с решением моей проблемы!
Платформа: WinXP SP2 Prof, 1C 7.70.025 DBF
1cpp.dll 2.5.0.5
еще используется formex.dll и RWidjets.dll, но они вроде на рассматриваемую проблему влиять не должны.
Пытаюсь осваивать перехватчик, вроде все путем, но сегодня наткнулся на непонятный косяк!
Есть основной класс "Система.Перехватчик", несущественный на мой взгляд код опущен:
Процедура Конструктор()
УправлениеНастройками = СоздатьОбъект("УправлениеНастройками");
УправлениеНастройками.Включить("ПерехватитьСобытияГК");
_ПерехватчикГМ = СоздатьОбъект("Перехватчик");
_ПерехватчикГМ.ПерехватитьСобытияГлобальногоМодуля(Контекст);
КонецПроцедуры
Процедура Деструктор()
_ПерехватчикГМ.СнятьПерехватСобытийГлобальногоМодуля();
_ПерехватчикГМ = "";
КонецПроцедуры
Процедура ВключитьПерехватСобытийГК(Конт)
// Здесь включается перехват ГК для объектов
// - журнал документов
// - документ
// - форма списка справочника
// - форма элемента справочника
Если ПустоеЗначение(Конт) = 0 Тогда
Перехватчик = СоздатьОбъект("Перехватчик");
ПерехватчикСобытий = Перехватчик.ПолучитьПерехватчикСобытийГК(Конт);
Если ПустоеЗначение(ПерехватчикСобытий) = 1 Тогда
_РасшифровкаОбъекта = _СистемаСервис.ПолучитьРасшифровкуКонтекста(Конт);
_ОписаниеОбъекта = _СистемаСтроки.РазбитьНаПодстроки(_РасшифровкаОбъекта,".");
_Лог.ДобавитьВЛог("Перехват: " + СокрЛП(_РасшифровкаОбъекта),1);
// перехват журналов
Если Нрег(_ОписаниеОбъекта.ПолучитьЗначение(1)) = "журнал" Тогда
ПерехватчикСобытий = СоздатьОбъект("Система.Перехватчик.Журнал");
ПерехватчикСобытий.Инициализация(Конт);
//ПерехватчикСобытий.ВключитьОтладку();
КонецЕсли;
// перехват документов
Если Нрег(_ОписаниеОбъекта.ПолучитьЗначение(1)) = "документ" Тогда
ПерехватчикСобытий = СоздатьОбъект("Система.Перехватчик.Документ");
ПерехватчикСобытий.Инициализация(Конт);
//ПерехватчикСобытий.ВключитьОтладку();
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры //ВключитьПерехватСобытийГК
Функция СообщитьОПерехвате(Объект,Событие)
Если _Отладка = 1 Тогда
Сообщить("ПерехватчикГМ " + _СистемаСервис.ПолучитьРасшифровкуКонтекста(Объект) + ":" + Событие);
КонецЕсли;
КонецФункции
Функция СобытиеГМ_ПриОткрытии(Конт) Экспорт
СообщитьОПерехвате(Конт,"ГМ_ПриОткрытии");
ВключитьПерехватСобытийГК(Конт);
Возврат 1; // Можно открывать форму
КонецФункции
Функция СобытиеГМ_ВводНового(Конт) Экспорт
СообщитьОПерехвате(Конт,"ГМ_ВводНового");
ВключитьПерехватСобытийГК(Конт);
Возврат 1; // Можно открывать форму
КонецФункции
Функция СобытиеГМ_ВводНаОсновании(Конт) Экспорт
СообщитьОПерехвате(Конт,"ГМ_ВводНаОсновании");
ВключитьПерехватСобытийГК(Конт);
Возврат 1; // Можно открывать форму
КонецФункции
Перехватываю формы журналов и документов, соответственно для них есть два класа "Система.Перехватчик.Журнал":
Процедура Конструктор()
КонецПроцедуры
Процедура Деструктор()
_Перехватчик = "";
КонецПроцедуры
Процедура Инициализация(Конт) Экспорт
_Контекст = Конт;
_РасшифровкаОбъекта = _СистемаСервис.ПолучитьРасшифровкуКонтекста(_Контекст);
_КонтекстТипВид = _СистемаСтроки.РазбитьНаПодстроки(_РасшифровкаОбъекта,".");
Если _КонтекстТипВид.РазмерСписка() > 0 Тогда _КонтекстТип = _КонтекстТипВид.ПолучитьЗначение(1);
иначе _КонтекстТип = ""; КонецЕсли;
Если _КонтекстТипВид.РазмерСписка() > 1 Тогда _КонтекстВид = _КонтекстТипВид.ПолучитьЗначение(2);
иначе _КонтекстВид = ""; КонецЕсли;
_Перехватчик = СоздатьОбъект("Перехватчик");
_Перехватчик.ПерехватитьСобытияГК(_Контекст, Контекст);
КонецПроцедуры
Функция СообщитьОПерехвате(Событие)
Если _Отладка = 1 Тогда Сообщить("Система.Перехватчик.Журнал:" + _КонтекстТипВид + ":" + Событие); КонецЕсли;
_Лог.ДобавитьВЛог("Перехват: " + СокрЛП(_РасшифровкаОбъекта) + " -> " + Событие,1);
КонецФункции
Функция Событие_ПриОткрытии() Экспорт
СообщитьОПерехвате("ПриОткрытии");
_Перехватчик.ВыполнитьОригинальноеСобытиеГК(_Контекст,"ПриОткрытии");
_СистемаИнтерфейс.ПодменитьСписокДействий(_Контекст,_КонтекстТип,_КонтекстВид);
_СистемаИнтерфейс.ПодменитьКнопкуДействия(_Контекст,_КонтекстТип,_КонтекстВид);
Возврат 1;
КонецФункции
и "Система.Перехватчик.Документ" (код не привожу, так проблема возникает при перехвате форм журналов).
Суть проблемы: при открытии журналов документов все работает нормально, обработка событий происходит как и задумано, но если журнал документов открывается из формы документа, все сворачивается в коврик.
Например это можно проверить на типовой бухгалтерии, если создать документ "Выписка" и попытаться заполнить реквизит "Платежный документ", при этом журнал "Платежные документы" через меню открывается нормально.
Дополнительно проверял на аналогичный косяк в других документах, и выяснил, что глюк перехвата формы журнала похоже проявляется только при открытии журнала для выбора реквизита типа "документ".
Путем отладочной печати удалось выяснить, что вылет происходит при возврате из функции-обработчика события, т.е. внутри него все отрабатывается, в том числе вызов оригинального события.