Переключение на Главную Страницу Страницы: 1 ... 4 5 [6] 7 8 ... 11 ОтправитьПечать
Очень популярная тема (более 25 ответов) Перехватчик. Для каких событий необходим ручной вызов оригинального? (число прочтений - 78255 )
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #75 - 20. Декабря 2010 :: 18:07
Печать  
2 Dmitry The Wing
Dmitry The Wing писал(а) 20. Декабря 2010 :: 08:39:
...
Попробуй включить перехват СобытиеГМ_ВводНаОсновании и НЕ вызывать ВыполнитьОригинальноеСобытиеГК ... увидишь, что ввод на основании документов не сломается ... о чем это говорит? - о том, что ввод уже случился,а потом ты дополнительно насильно его повторяешь вызовом ВыполнитьОригинальноеСобытиеГК.
...

Вот здесь я не понимаю.
СобытиеГМ_ВводНаОсновании и СобытиеГМ_ВводНового я сейчас не использую, т.к. прочел здесь на форуме рекомендации использовать только СобытиеГМ_СозданиеКонтекста, а все остальное делать через события группового контекста.
Так вот, если я моем классе в методе Событие_ВводНаОсновании не вызывать ВыполнитьОригинальноеСобытиеГК, то ввод на основании не происходит.Если переделать процедуру Событие_ВводНаОсновании на функцию и возвращять 0, то до метода документа ВводНаОсновании даже не доходит.
Не понимаю, где двойной вызов. Пожалуста, обьясни, где у меня ошибка?
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #76 - 21. Декабря 2010 :: 02:14
Печать  
zk96 писал(а) 20. Декабря 2010 :: 18:07:
Вот здесь я не понимаю.
СобытиеГМ_ВводНаОсновании и СобытиеГМ_ВводНового я сейчас не использую, т.к. прочел здесь на форуме рекомендации использовать только СобытиеГМ_СозданиеКонтекста, а все остальное делать через события группового контекста.
Так вот, если я моем классе в методе Событие_ВводНаОсновании не вызывать ВыполнитьОригинальноеСобытиеГК, то ввод на основании не происходит.Если переделать процедуру Событие_ВводНаОсновании на функцию и возвращять 0, то до метода документа ВводНаОсновании даже не доходит.
Не понимаю, где двойной вызов. Пожалуста, обьясни, где у меня ошибка?

Извиняюсь, мои глазки меня подвели ... почему-то я увидел СобытиеГМ_ВводНаОсновании там, где реально было Событие_ВводНаОсновании. С ним все в порядке. То, что я имел в виду - особенность перехвата именно для СобытиеГМ_ВводНаОсновании и СобытиеГМ_ВводНового...
  
Наверх
 
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #77 - 21. Декабря 2010 :: 06:49
Печать  
2 Dmitry The Wing
Понял. Спасибо.



  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Перехватчик. Задан NameEng. Как найти NameRus?
Ответ #78 - 21. Января 2011 :: 02:38
Печать  
Словил неприятный эффект при перехвате Событие_ПриОткрытии при использовании в форме варианта OnOpen.
Событие срабатывает, но как вызвать оригинальное событие без явного использования этого варианта в коде?
Дело в том, что в этом случае функция информатора ПолучитьТаблицуМетодов не заполняет русский вариант имени метода...
Пока вижу только вариант с прописыванием обоих вариантом именования в коде, что не считаю правильным...

Кроме того, есть еще один подводный камень:
Для правильного вызова оригинального события необходимо определить число параметров метода. Если это делать поиском по ТЗ, то можно наткнуться на несоответствие регистра ... пока вижу только вариант:
  • Сначала ищется NameEng. Если найдено - возвращаем число параметров.
  • Ищется NameRus. Если найдено - возвращаем число параметров.
  • Перебор всей таблицы методов с построчным сравнением приведенных к одному регистру исходных значений и полей NameEng и NameRus таблицы методов. Если найдено - возвращаем число параметров.
  • Возвращаем 0. (Вызов ВыполнитьОригинальноеСобытиеГК пройдет успешно, т.к. метод в форме не описан)
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Задан NameEng. Как найти NameRus?
Ответ #79 - 21. Января 2011 :: 08:36
Печать  
Dmitry The Wing писал(а) 21. Января 2011 :: 02:38:
Словил неприятный эффект при перехвате Событие_ПриОткрытии при использовании в форме варианта OnOpen.
Событие срабатывает, но как вызвать оригинальное событие без явного использования этого варианта в коде?
Дело в том, что в этом случае функция информатора ПолучитьТаблицуМетодов не заполняет русский вариант имени метода...

Если возможно использование как русскоязычного, так и англоязычного наименования обработчика события, то можно использовать двойной вызов
сначала в коде пишем
Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтФормы, "ПриОткрытии", ...)
и сразу за ним
Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтФормы, "OnOpen", ...)
  

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: Перехватчик. Задан NameEng. Как найти NameRus?
Ответ #80 - 21. Января 2011 :: 08:38
Печать  
Dmitry The Wing писал(а) 21. Января 2011 :: 02:38:
Кроме того, есть еще один подводный камень:
Для правильного вызова оригинального события необходимо определить число параметров метода.

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

  

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Задан NameEng. Как найти NameRus?
Ответ #81 - 21. Января 2011 :: 08:59
Печать  
artbear писал(а) 21. Января 2011 :: 08:38:
Dmitry The Wing писал(а) 21. Января 2011 :: 02:38:
Кроме того, есть еще один подводный камень:
Для правильного вызова оригинального события необходимо определить число параметров метода.

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

Проблема в том, что иногда метод можно найти только перебором всего списка, т.к. функция НайтиЗначение у ТЗ чуствительна к регистру... ибо некоторые разработчики не следят за красотой кода, что дает методы в различных регистрах + комбинации русско- и англо-язычных вариантов именований...

P.S.: Скорее даже не за красотой, а читабельностью кода...



artbear писал(а) 21. Января 2011 :: 08:36:
Dmitry The Wing писал(а) 21. Января 2011 :: 02:38:
Словил неприятный эффект при перехвате Событие_ПриОткрытии при использовании в форме варианта OnOpen.
Событие срабатывает, но как вызвать оригинальное событие без явного использования этого варианта в коде?
Дело в том, что в этом случае функция информатора ПолучитьТаблицуМетодов не заполняет русский вариант имени метода...

Если возможно использование как русскоязычного, так и англоязычного наименования обработчика события, то можно использовать двойной вызов
сначала в коде пишем
Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтФормы, "ПриОткрытии", ...)
и сразу за ним
Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтФормы, "OnOpen", ...)

Это верно, но в некоторых случаях необходимо предусмотреть возможно разное число параметров, а метода кроме
Код
Выбрать все
		Если ЧислоПараметров = 0 Тогда
			Рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтОбъекта, ИмяСобытия);
		ИначеЕсли ЧислоПараметров = 1 Тогда
			Рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтОбъекта, ИмяСобытия, Парам1);
		ИначеЕсли ЧислоПараметров = 2 Тогда
			Рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтОбъекта, ИмяСобытия, Парам1, Парам2);
		КонецЕсли; 

пока не вижу ... если еще и имена туда совать - как-то совсем громоздко выходит.

Необходимость проверки числа параметров вытекает из того, что в ВыполнитьОригинальноеСобытиеГК необходимо передавать ПРАВИЛЬНОЕ число параметров, ни больше, ни меньше...
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Задан NameEng. Как найти NameRus?
Ответ #82 - 21. Января 2011 :: 09:04
Печать  
Dmitry The Wing писал(а) 21. Января 2011 :: 08:59:
artbear писал(а) 21. Января 2011 :: 08:38:
Dmitry The Wing писал(а) 21. Января 2011 :: 02:38:
Кроме того, есть еще один подводный камень:
Для правильного вызова оригинального события необходимо определить число параметров метода.

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

Проблема в том, что иногда метод можно найти только перебором всего списка, т.к. функция НайтиЗначение у ТЗ чуствительна к регистру... ибо некоторые разработчики не следят за красотой кода, что дает методы в различных регистрах + комбинации русско- и англо-язычных вариантов именований...

P.S.: Скорее даже не за красотой, а читабельностью кода...

А зачем искать в ТЗ конкретного модуля? я же говорю, не нужно получать инфу об уже имеющихся обработчиках в модуля конкретной формы.
У тебя есть метаданные, они известны еще до начала работы Предприятия, на этапе разработки, из них и контекста формы (типа контекста формы) нужно получать данные о количестве параметров + использовать двуязычный вызов оригинального события.
  

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Задан NameEng. Как найти NameRus?
Ответ #83 - 21. Января 2011 :: 09:06
Печать  
artbear писал(а) 21. Января 2011 :: 09:04:
А зачем искать в ТЗ конкретного модуля? я же говорю, не нужно получать инфу об уже имеющихся обработчиках в модуля конкретной формы.
У тебя есть метаданные, они известны еще до начала работы Предприятия, на этапе разработки, из них и контекста формы (типа контекста формы) нужно получать данные о количестве параметров + использовать двуязычный вызов оригинального события.

Поясни. пока ничего не понял.

Предопределенное событие ПриОткрытии может иметь любое число параметров (в своей конфе я нашел от 0 до 2) ... как я могу из метаданных получить это число, без обращения к конкретному контексту?
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Задан NameEng. Как найти NameRus?
Ответ #84 - 21. Января 2011 :: 09:06
Печать  
Dmitry The Wing писал(а) 21. Января 2011 :: 08:59:
Это верно, но в некоторых случаях необходимо предусмотреть возможно разное число параметров, а метода кроме
Код
Выбрать все
		Если ЧислоПараметров = 0 Тогда
			Рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтОбъекта, ИмяСобытия);
		ИначеЕсли ЧислоПараметров = 1 Тогда
			Рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтОбъекта, ИмяСобытия, Парам1);
		ИначеЕсли ЧислоПараметров = 2 Тогда
			Рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтОбъекта, ИмяСобытия, Парам1, Парам2);
		КонецЕсли; 

пока не вижу ... если еще и имена туда совать - как-то совсем громоздко выходит.

Нормально выглядит - добавить по одной строчке на каждый вызов Улыбка
Понимаешь, Перехватчик ничего не знает о событиях, поэтому данные о событиях должен получить разработчик. лучше их получать из метаданных, как я уже написал.
  

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Задан NameEng. Как найти NameRus?
Ответ #85 - 21. Января 2011 :: 09:09
Печать  
artbear писал(а) 21. Января 2011 :: 09:06:
Dmitry The Wing писал(а) 21. Января 2011 :: 08:59:
Это верно, но в некоторых случаях необходимо предусмотреть возможно разное число параметров, а метода кроме
Код
Выбрать все
		Если ЧислоПараметров = 0 Тогда
			Рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтОбъекта, ИмяСобытия);
		ИначеЕсли ЧислоПараметров = 1 Тогда
			Рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтОбъекта, ИмяСобытия, Парам1);
		ИначеЕсли ЧислоПараметров = 2 Тогда
			Рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтОбъекта, ИмяСобытия, Парам1, Парам2);
		КонецЕсли; 

пока не вижу ... если еще и имена туда совать - как-то совсем громоздко выходит.

Нормально выглядит - добавить по одной строчке на каждый вызов Улыбка
Понимаешь, Перехватчик ничего не знает о событиях, поэтому данные о событиях должен получить разработчик. лучше их получать из метаданных, как я уже написал.

Но для определения числа параметров все равно необходимо перебрать весь список методов, если разработчик "некрасиво" описал обработчик события (не в том регистре буковки). А при таком поиске имя определяется автоматически - потому второй вызов теряет смысл...
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Задан NameEng. Как найти NameRus?
Ответ #86 - 21. Января 2011 :: 13:50
Печать  
Dmitry The Wing писал(а) 21. Января 2011 :: 09:09:
Но для определения числа параметров все равно необходимо перебрать весь список методов, если разработчик "некрасиво" описал обработчик события (не в том регистре буковки). А при таком поиске имя определяется автоматически - потому второй вызов теряет смысл...

Вот с чего ты взял, что нужно делать поиск по таблице конкретных методов конкретного модуля формы?
Еще раз - на этапе разработки, как правило, уже известны данные о событиях и их обработчиках. можно юзать эту инфу.
Даже для универсального перехватчика, который должен уметь работать не только со штатными событиями 1С, но и с событиями других ВК, можно юзать не просто поиск по ТЗ, а загрузить ТЗ Информатора в ИТЗ, сделать индекс без учета регистра и выполнить поиск уже по ИТЗ.
Двойной вызов все-таки нужен для обработки разноязычных наименований обработчиков событий.
  

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Задан NameEng. Как найти NameRus?
Ответ #87 - 24. Января 2011 :: 02:02
Печать  
artbear писал(а) 21. Января 2011 :: 13:50:
Dmitry The Wing писал(а) 21. Января 2011 :: 09:09:
Но для определения числа параметров все равно необходимо перебрать весь список методов, если разработчик "некрасиво" описал обработчик события (не в том регистре буковки). А при таком поиске имя определяется автоматически - потому второй вызов теряет смысл...

Вот с чего ты взял, что нужно делать поиск по таблице конкретных методов конкретного модуля формы?
Еще раз - на этапе разработки, как правило, уже известны данные о событиях и их обработчиках. можно юзать эту инфу.
Даже для универсального перехватчика, который должен уметь работать не только со штатными событиями 1С, но и с событиями других ВК, можно юзать не просто поиск по ТЗ, а загрузить ТЗ Информатора в ИТЗ, сделать индекс без учета регистра и выполнить поиск уже по ИТЗ.
Двойной вызов все-таки нужен для обработки разноязычных наименований обработчиков событий.

Ранее в этой теме уже говорилось о том, что у меня перехват всех событий любых форм ведется одним универсальным классом перехвата, и только после этого уже раздается подписчикам. Т.е. нет перехвата только конкретного набора форм - перехватываются все, только не все обрабатываются. Однако, оригинальную версию вызвать надо, а для этого и требуется знать число параметров...
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Хотелось бы все-таки решить проблему с Событие_ПриИзмененииРазмераОкна
Ответ #88 - 25. Января 2011 :: 09:13
Печать  
Dmitry The Wing писал(а) 30. Ноября 2010 :: 04:18:
Вложена MD тестовой конфы.
Порядок тестирования:
  • В папке конфы следует создать папку ВК и положить туда 1CPP.dll (3.2.3.1) и FormEx.dll (2.0.5.101).
  • Открыть конфу в конфигураторе, что-нибудь поправить и сохранить - появятся файлы конфы.
  • Открыть общий журнал, создать пару документов и провести - важно, чтобы их было больше одного, ибо как иначе проверить позиционирование?
  • Открыть отчет (он там один), сформировать и кликнуть по любому номеру документа - произойдет открытие журнала и ... ожидается позиционирование на документе, которого не происходит (выбирайте не первый документ, на первый оно попадает до позиционирования).

Однако, если закомментировать в обработке ФабрикаСобытий функцию Событие_ПриИзмененииРазмераОкна - позиционирование будет работать замечательно.

Изменения с тех пор небольшие: Переват разделен на глобальный и контекстный, следовательно комментировать надо функцию Событие_ПриИзмененииРазмераОкна класса ФабрикаСобытийФормы. Версия 1с++ использовалась уже 3.2.3.8.

Поправил запись в багзилле.
  

test_hook_001.zip ( 14 KB | Загрузки )
Наверх
 
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #89 - 25. Января 2011 :: 19:10
Печать  
2 Dmitry The Wing
Активизируй документ в журнале ПослеСозданияФормы.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 4 5 [6] 7 8 ... 11
ОтправитьПечать