Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Перехватчик: падает при обработке события... (число прочтений - 11716 )
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Перехватчик: падает при обработке события...
14. Января 2008 :: 17:18
Печать  
Приветствую, уважаемые!
Может кто поможет с решением моей проблемы!

Платформа: 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;
КонецФункции
 


и "Система.Перехватчик.Документ"  (код не привожу, так проблема возникает при перехвате форм журналов).

Суть  проблемы: при открытии журналов документов все работает нормально, обработка событий происходит как и задумано, но если журнал документов открывается из формы документа, все сворачивается в коврик.
Например это можно проверить на типовой бухгалтерии, если создать документ "Выписка" и попытаться заполнить реквизит "Платежный документ", при этом журнал "Платежные документы" через меню открывается нормально.
Дополнительно проверял на аналогичный косяк в других документах, и выяснил, что глюк перехвата формы журнала похоже проявляется только при открытии журнала для выбора реквизита типа "документ".
Путем отладочной печати удалось выяснить, что вылет происходит при возврате из функции-обработчика события, т.е. внутри него все отрабатывается, в том числе вызов оригинального события.
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик: падает при обработке события...
Ответ #1 - 14. Января 2008 :: 18:36
Печать  
Я уже неоднократно постил на форуме как "правильно" перехватить открываемую форму.

к примеру у тебя она может перехватываться трижды (соответственно трижды вызывается конструктор, а оно тебе надо?)
в СобытиеГМ_ПриОткрытии, СобытиеГМ_ВводНового и в СобытиеГМ_ВводНаОсновании

Слона то я и не увидел.


А по ошибке - сделал бы лучше тестовую конфу.
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик: падает при обработке события...
Ответ #2 - 14. Января 2008 :: 18:39
Печать  
Не знаю что у тебя в _РасшифровкаОбъекта = _СистемаСервис.ПолучитьРасшифровкуКонтекста(Конт);
Не проще использовать РасширениеФормы::ПолныйТипОбъекта?
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик: падает при обработке события...
Ответ #3 - 15. Января 2008 :: 04:26
Печать  
Да, из описания место возникновения бага не понятно Печаль
Жду тестовую конфу
Без нее помочь не смогу Улыбка
ЗЫ на всякий случай, я - разработчик Перехватчика Улыбка

PPS Еще ошибка: твой деструктор никогда не будет выполнен, т.е. перехват ГМ не будет снят никогда, потому что 1С++ внутри себя хранит доп.ссылку на твой объект и деструктор может быть вызван только после вызова Перехватчик.СнятьПерехватГМ... Печаль
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик: падает при обработке события...
Ответ #4 - 15. Января 2008 :: 04:28
Печать  
Использование ВК FormEx и RWidjets очень важно.
Нужна верная последовательность загрузки ВК Улыбка
1С++ всегда сначала, и перехватить желательно включать до загрузки вышеуказанных ВК.
Короче, много чего может повлиять, поэтому давай тест !! Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик: падает при обработке события...
Ответ #5 - 15. Января 2008 :: 04:31
Печать  
В архив с тестовой конфой не нужно класть используемые ВК 1С++, ФормЕкс, РВиджется, только мд + данные + инструкция по получению бага Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик: падает при обработке события...
Ответ #6 - 15. Января 2008 :: 05:18
Печать  
artbear писал(а) 15. Января 2008 :: 04:31:
В архив с тестовой конфой не нужно класть используемые ВК 1С++, ФормЕкс, РВиджется, только мд + данные + инструкция по получению бага Улыбка

О! прилепить бы данный пост, а то постоянно выкладывают с длл-ками.
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: Перехватчик: падает при обработке события...
Ответ #7 - 15. Января 2008 :: 08:14
Печать  
Очень радует такая оперативность реакции разработчиков! Улыбка
Спасибо!
[офтоп]Давно читаю форум, периодически проскакивают высказывания, что проект де загибается, но на мой взгляд стороннего достаточно человека, очень даже живет! Улыбка[/офтоп]

Вчера весь вечер думал, действительно без пустой тестовой конфы глюк очень сложно отловить, сегодня нарисую.
По коментариям:
1. _РасшифровкаОбъекта - это и есть по сути обертка для метода "РасширениеФормы::ПолныйТипОбъекта"
2. насчет деструкора - если четно долго изучал вопрос в форуме, но так до конца этот вопрос и не уяснил, как работать с деструктором в случае перехватчика, и судя по всему, определенные грабли имею, но правда не в контексте описанной проблемы
3. по поводу загрузки ВК вроде соблюдал ваши рекомендации в форуме: в глобальнике грузится 1cpp.dll, создается Перехватчик, сразу включается перехват, потом в предопределенной "ПриНачалеРаботыСистемы" грузятся остальные ВК в сл. порядке: rwidjets.dll, затем formex.dll.


  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик: падает при обработке события...
Ответ #8 - 15. Января 2008 :: 09:00
Печать  
1. По деструктору для перехватчика ГМ - просто нужно самостоятельно вызывать Перехватчик.СнятьПерехват для правильного срабатывания деструктора.
Вызывать любым способом - из самого класса, из внешнего класса и т.д. Улыбка

2. Порядок загрузки ВК (давно проверен)
1С++
ФормЕкс !!
а затем все остальные
иначе могут быть баги с событиями 1С++ и ФормЕкс Улыбка

3. Я лично гружу 1С++ не в теле глобальника, а в ПриНачалеРаботыСистемы. Впрочем, это не должно иметь значение Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик: падает при обработке события...
Ответ #9 - 15. Января 2008 :: 09:02
Печать  
Ну и для совсем правильной работы версия ФормЕкс должна быть >= 2.0.5.60 Улыбка
Рекомендую юзать 2.0.5.82
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: Перехватчик: падает при обработке события...
Ответ #10 - 15. Января 2008 :: 09:22
Печать  
formex.dll версия 2.0.5.77
рисую тестовую конфу, пока воспроизвести глюк не получилось Печаль
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: Перехватчик: падает при обработке события...
Ответ #11 - 15. Января 2008 :: 09:44
Печать  
а гружу я 1cpp.dll в глобальнике для того, что бы перехватить саму "ПриНачалеРаботыСистемы" Улыбка
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик: падает при обработке события...
Ответ #12 - 15. Января 2008 :: 10:03
Печать  
CaBaT писал(а) 15. Января 2008 :: 09:22:
formex.dll версия 2.0.5.77
рисую тестовую конфу, пока воспроизвести глюк не получилось Печаль

Уже хорошо Улыбка
Значит, косяк в чем-то другом Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик: падает при обработке события...
Ответ #13 - 15. Января 2008 :: 10:04
Печать  
CaBaT писал(а) 15. Января 2008 :: 09:22:
formex.dll версия 2.0.5.77
рисую тестовую конфу, пока воспроизвести глюк не получилось Печаль

В этой сборке есть довольно серьезные ошибки, см.описание.
Юзай лучше 82.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: Перехватчик: падает при обработке события...
Ответ #14 - 15. Января 2008 :: 10:36
Печать  
гут, попробую сейчас проверить на основной базе поиграть с порядком загрузки и версией ВК

честно говоря, как и ожидал, порядок загрузки и версия 82 formex.dll проблему не решили, копаю дальше...
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 
ОтправитьПечать