Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Горячая тема (более 10 ответов) Как перехватить и обработать процедуру модуля проведения не меняя конфигура (число прочтений - 9874 )
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Как перехватить и обработать процедуру модуля проведения не меняя конфигура
Ответ #15 - 31. Августа 2010 :: 10:40
Печать  
Переход темы отсюда http://www.1cpp.ru/forum/YaBB.pl?num=1281695278/15#27
artbear писал(а) 31. Августа 2010 :: 07:48:
К сожалению, это общая системная проблема Перехватчика:
не отслеживаются исключения в оригинальных обработчиках событий.
Например, если в форме документа написать
Процедура ПриОткрытии()
     рез = 1/0;
КонецПроцедуры
установить перехват на эту форму/контекст
и выполнить
     Перехватчик=СоздатьОбъект("Перехватчик");      
     рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтФормы,"ПриОткрытии");
     Сообщить("рез = "+рез);

всегда будет возвращена 1 Печаль
Таки да!  Ужас А раньше не замечал .... типа не доставало так как в модуле документа ...
Цитата:
ЗЫ это системная проблема - у 1С по умолчанию исключения не передаются за границы модуля.
В классах 1С++ и для ВыполняемогоМодуля для обхода этого была написан спец.код.

В общем, еще подумаю.


Подумай pls!  Нерешительный А то перехват проведения в таких условиях пользовать практически невозможно
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как перехватить и обработать процедуру модуля проведения не меняя конфигура
Ответ #16 - 31. Августа 2010 :: 14:21
Печать  
В общем, решение все-таки оказалось довольно простым Улыбка
Выкладываю специальную тестовую версию для проверки.

Если в оригинальном обработчике события группового контекста, глобального модуля или модуля документа было выброшено исключение, метод ВыполнитьОригинальноеСобытие также вернет 0, т.е. СтатусВозврата() = 0.

В старых версиях метод всегда возвращал 1 Печаль

Думаю, что этого будет достаточно для подавляющего большинства случаев работы.

Если будет нужно, могу подумать, как также выкинуть исключение в модуле-перехватчике вслед за оригинальным обработчиком события.

ЗЫ это дебаг-версия, не рекомендуется для реальной работы

ЗЗЫ в этой версии забыл вставить аналогичную проверку на исключения при вызове оригинальных обработчиков из глобального модуля. Так что ГМ в этой версии пока без исключений, перехват ГМ можете не проверять.
  

icpp_3_2_2_3_Interceptor_Exception.7z ( 596 KB | Загрузки )

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



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Как перехватить и обработать процедуру модуля проведения не меняя конфигура
Ответ #17 - 01. Сентября 2010 :: 11:58
Печать  
artbear писал(а) 31. Августа 2010 :: 14:21:
В общем, решение все-таки оказалось довольно простым Улыбка
Выкладываю специальную тестовую версию для проверки.

Если в оригинальном обработчике события группового контекста, глобального модуля или модуля документа было выброшено исключение, метод ВыполнитьОригинальноеСобытие также вернет 0, т.е. СтатусВозврата() = 0.

В старых версиях метод всегда возвращал 1 Печаль
"Ураааа!!! Заработало!!!"  (с) Кот Матроскин Очень довольный
Проверил и в модуле проведения и в модуле формы "ПриОткрытии"
Цитата:
Думаю, что этого будет достаточно для подавляющего большинства случаев работы.

Если будет нужно, могу подумать, как также выкинуть исключение в модуле-перехватчике вслед за оригинальным обработчиком события.
Ну не знаю для чего это может понадобится даже .... мне пока вроде как без надобности. может кто выскажется в поддержку надобности...
Цитата:
ЗЫ это дебаг-версия, не рекомендуется для реальной работы
Да заметили уже .... на один из классов чего-то гнусно поругалось .....
А когда будет 3.2.2.6 с внесенными изменениями?  Подмигивание
Цитата:
ЗЗЫ в этой версии забыл вставить аналогичную проверку на исключения при вызове оригинальных обработчиков из глобального модуля. Так что ГМ в этой версии пока без исключений, перехват ГМ можете не проверять.

Пасиб огромный!!!! Ну а то что два года ждали .... главное что дождались!  Подмигивание
У меня с некоторыми идеями/задачами тоже так бывает - нужно чтобы они "отлежались" и потом решение как-бы само собой приходит
  
Наверх
ICQ  
IP записан
 
shmalevoz
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 55
Зарегистрирован: 23. Апреля 2009
Re: Как перехватить и обработать процедуру модуля проведения не меняя конфигура
Ответ #18 - 19. Сентября 2010 :: 18:42
Печать  
Вот вроде рабочий вариант. Проверь у себя. Версия 1С++ 3.0.1.23
  

action.txt ( 4 KB | Загрузки )
Наверх
 
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Как перехватить и обработать процедуру модуля проведения не меняя конфигура
Ответ #19 - 20. Сентября 2010 :: 07:01
Печать  
shmalevoz писал(а) 19. Сентября 2010 :: 18:42:
Вот вроде рабочий вариант. Проверь у себя. Версия 1С++ 3.0.1.23

Да не хотелось-бы такое страшненькое извращение в рабочей базе применять Улыбка Не.... чисто академический интерес это конечно представляет. Типа "можно-ли с помощью кувалды и какой-то матери решить проблему СтатусаВозврата "   Смех
Тем более что Артур вроде как решил эту проблему нормальным способом. Осталось только дождаться включения изменений в ближайшую сборку....
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как перехватить и обработать процедуру модуля проведения не меняя конфигура
Ответ #20 - 25. Сентября 2010 :: 06:06
Печать  
artbear писал(а) 31. Августа 2010 :: 14:21:
Выкладываю специальную тестовую версию для проверки.

Если в оригинальном обработчике события группового контекста, глобального модуля или модуля документа было выброшено исключение, метод ВыполнитьОригинальноеСобытие также вернет 0, т.е. СтатусВозврата() = 0.

В старых версиях метод всегда возвращал 1 Печаль

Код исправления сегодня занесен в общий репозитарий 1С++.
Т.е. исправление будет в ночной сборке и в очередной сборке 1С++
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать