Переключение на Главную Страницу Страницы: 1 [2] 3 4 ... 11 ОтправитьПечать
Очень популярная тема (более 25 ответов) Перехватчик. Для каких событий необходим ручной вызов оригинального? (число прочтений - 71199 )
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #15 - 29. Ноября 2010 :: 07:52
Печать  
artbear писал(а) 29. Ноября 2010 :: 06:46:
1. Пример таких документов в студию, слабо верится Печаль
2. Каким образом вызывается данное событие? системой/1С или вручную, пользовательским кодом?

Это сделано из ограничения 1С7.7 по количеству ТЧ. При проведении документа (точнее перед этим) автоматически создаются и проводятся (или перепроводятся) еще два. Для того, чтобы отличить программный вызов сохранения / проверения от интерактивного и избежать рекурсивного зацикливания и добавлены эти параметры: проведение (доп.ф-я "НаПроведение") вызывает сохранение, а сохранение вызывает проведение при условии, что они не были вызваны ранее. Механизм работает уже не один год, хотя по началу полностью правильным было сделать непросто.
artbear писал(а) 29. Ноября 2010 :: 06:46:
1. Встроенный класс Информатор из 1С++ поможет Улыбка

А можно где-то увидеть пример? В доке вижу, что функция ПолучитьТаблицуМетодов должна вернуть таблицу, но будет ли в ней количество параметров?
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #16 - 29. Ноября 2010 :: 08:15
Печать  
Dmitry The Wing писал(а) 29. Ноября 2010 :: 07:52:
artbear писал(а) 29. Ноября 2010 :: 06:46:
1. Пример таких документов в студию, слабо верится Печаль
2. Каким образом вызывается данное событие? системой/1С или вручную, пользовательским кодом?

Это сделано из ограничения 1С7.7 по количеству ТЧ. При проведении документа (точнее перед этим) автоматически создаются и проводятся (или перепроводятся) еще два. Для того, чтобы отличить программный вызов сохранения / проверения от интерактивного и избежать рекурсивного зацикливания и добавлены эти параметры: проведение (доп.ф-я "НаПроведение") вызывает сохранение, а сохранение вызывает проведение при условии, что они не были вызваны ранее. Механизм работает уже не один год, хотя по началу полностью правильным было сделать непросто.

Причем здесь твой личный механизм и собственная реализация? Перехватчик работает со штатными событиями 1С и перехватывает момент штатного вызова событий из самой 1С, которая ничего не знает и никогда не узнает о твоих добавках Печаль
Делаешь механизм сам, сам и пожинай его последствия Улыбка

Dmitry The Wing писал(а) 29. Ноября 2010 :: 07:52:
artbear писал(а) 29. Ноября 2010 :: 06:46:
1. Встроенный класс Информатор из 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: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #17 - 29. Ноября 2010 :: 08:26
Печать  
artbear писал(а) 29. Ноября 2010 :: 08:15:
Причем здесь твой личный механизм и собственная реализация? Перехватчик работает со штатными событиями 1С и перехватывает момент штатного вызова событий из самой 1С, которая ничего не знает и никогда не узнает о твоих добавках Печаль
Делаешь механизм сам, сам и пожинай его последствия Улыбка

При том, что не только я меняю число параметров в предопределенных процедурах. И в типовых встречается, и не только.

По поводу числа параметров - Информатор выручил. Спасибо!


К сожалению, вопрос про перехват события
Dmitry The Wing писал(а) 26. Ноября 2010 :: 02:10:
Событие_ПриИзмененииРазмераОкна

так и остался без ответа, а он портит штатную работу 1С.

Неужели ни у кого такого глюка не происходит? Если так - подскажите, что неверно в моем коде перехвата...
« Последняя редакция: 29. Ноября 2010 :: 09:36 - Dmitry The Wing »  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #18 - 29. Ноября 2010 :: 10:16
Печать  
Dmitry The Wing писал(а) 29. Ноября 2010 :: 08:26:
К сожалению, вопрос про перехват события
Dmitry The Wing писал(а) 26. Ноября 2010 :: 02:10:
Событие_ПриИзмененииРазмераОкна

так и остался без ответа, а он портит штатную работу 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: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #19 - 29. Ноября 2010 :: 10:21
Печать  
artbear писал(а) 29. Ноября 2010 :: 10:16:
Dmitry The Wing писал(а) 29. Ноября 2010 :: 08:26:
К сожалению, вопрос про перехват события
Dmitry The Wing писал(а) 26. Ноября 2010 :: 02:10:
Событие_ПриИзмененииРазмераОкна

так и остался без ответа, а он портит штатную работу 1С.

Неужели ни у кого такого глюка не происходит? Если так - подскажите, что неверно в моем коде перехвата...

Простейшую тестовую конфу выложи, в которой можно легко повторить ошибку.


Постараюсь сделать это завтра (примерно через 16 часов)
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #20 - 30. Ноября 2010 :: 04:18
Печать  
Вложена MD тестовой конфы.
Порядок тестирования:
  • В папке конфы следует создать папку ВК и положить туда 1CPP.dll (3.2.3.1) и FormEx.dll (2.0.5.101).
  • Открыть конфу в конфигураторе, что-нибудь поправить и сохранить - появятся файлы конфы.
  • Открыть общий журнал, создать пару документов и провести - важно, чтобы их было больше одного, ибо как иначе проверить позиционирование?
  • Открыть отчет (он там один), сформировать и кликнуть по любому номеру документа - произойдет открытие журнала и ... ожидается позиционирование на документе, которого не происходит (выбирайте не первый документ, на первый оно попадает до позиционирования).

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

test_hook.zip ( 20 KB | Загрузки )
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #21 - 30. Ноября 2010 :: 04:46
Печать  
Дабы не плодить новую тему:

делаю перехват событий документа.
Перехватчик вешается непосредственно на контекст формы документа.
Дальше такая заморочка:
Перехватываю событие ВводНового(фКопирование, Объект).
В функции перехватчика оба параметра определены и нормально содержат значения.
А вот при попытке вызвать выполнение оригинального события документа - получаю отбрык "неверное число параметров".
Эге - событие ВводНового в контексте формы отчета параметров не имеет.
Ладно - в документе делаю этим параметрам значения по умолчанию.. Но проблемы это не решает - при передачи выполнения в стандартный обработчик документа значения этих параметров "теряется".

Из способов решения пока вижу только ручками вызывать Конт.ВводНового(фКопирование, Объект);
Но тогда теряется отслеживание изменения СтатусВозврата() в стандартном обработчике...
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #22 - 30. Ноября 2010 :: 05:51
Печать  
Satans Claws писал(а) 30. Ноября 2010 :: 04:46:
Дабы не плодить новую тему:

делаю перехват событий документа.
Перехватчик вешается непосредственно на контекст формы документа.
Дальше такая заморочка:
Перехватываю событие ВводНового(фКопирование, Объект).
В функции перехватчика оба параметра определены и нормально содержат значения.
А вот при попытке вызвать выполнение оригинального события документа - получаю отбрык "неверное число параметров".
Эге - событие ВводНового в контексте формы отчета параметров не имеет.
Ладно - в документе делаю этим параметрам значения по умолчанию.. Но проблемы это не решает - при передачи выполнения в стандартный обработчик документа значения этих параметров "теряется".

Из способов решения пока вижу только ручками вызывать Конт.ВводНового(фКопирование, Объект);
Но тогда теряется отслеживание изменения СтатусВозврата() в стандартном обработчике...

Покажи, как вызываешь оригинальное? (я тоже не сразу правильно вызывал Улыбка)
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #23 - 30. Ноября 2010 :: 06:24
Печать  
Dmitry The Wing писал(а) 30. Ноября 2010 :: 05:51:
Покажи, как вызываешь оригинальное? (я тоже не сразу правильно вызывал Улыбка)


Перехватчик.ВыполнитьОригинальноеСобытиеГК (КонтФормы, "ВводНового");

Хотя сейчас качнул свежий хелп - там в описании метода появилось многоточие после второго параметра.
Видимо, нужно написать
Перехватчик.ВыполнитьОригинальноеСобытиеГК (КонтФормы, "ВводНового", фКопирование, Объект);
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #24 - 30. Ноября 2010 :: 06:29
Печать  
Кстати, в свежем хелпе, кажется, есть ошибка:

с версии v.3.0.1.14 английское название, вроде как, изменено с Hooker на Intercepter
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #25 - 30. Ноября 2010 :: 06:43
Печать  
Satans Claws писал(а) 30. Ноября 2010 :: 06:24:
Видимо, нужно написать
Перехватчик.ВыполнитьОригинальноеСобытиеГК (КонтФормы, "ВводНового", фКопирование, Объект);


Параметры передаются. А вот на изменение СтатусаВозврата в оригинальном обработчике реагировать не хотим.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #26 - 30. Ноября 2010 :: 06:51
Печать  
Satans Claws писал(а) 30. Ноября 2010 :: 06:29:
Кстати, в свежем хелпе, кажется, есть ошибка:

с версии v.3.0.1.14 английское название, вроде как, изменено с Hooker на Intercepter

По имени файла самой справки это не заметно: http://www.1cpp.ru/docum/icpp/html/Hooker.html , хотя в содержимом написано Intercepter, что не есть верно по смыслу класса.
Intercepter прерывает работу не важно чего, а Hooker лишь цепляется.

Satans Claws писал(а) 30. Ноября 2010 :: 06:43:
Satans Claws писал(а) 30. Ноября 2010 :: 06:24:
Видимо, нужно написать
Перехватчик.ВыполнитьОригинальноеСобытиеГК (КонтФормы, "ВводНового", фКопирование, Объект);


Параметры передаются. А вот на изменение СтатусаВозврата в оригинальном обработчике реагировать не хотим.


Как работаешь со статусом возврата?
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #27 - 30. Ноября 2010 :: 07:05
Печать  
Dmitry The Wing писал(а) 30. Ноября 2010 :: 06:51:
По имени файла самой справки это не заметно: http://www.1cpp.ru/docum/icpp/html/Hooker.html , хотя в содержимом написано Intercepter, что не есть верно по смыслу класса.
Intercepter прерывает работу не важно чего, а Hooker лишь цепляется.

Я про chm-хелп

Цитата:
Как работаешь со статусом возврата?


В модуле формы документа:
Процедура ВводНового(фКопирование, Объект)
СтатусВозврата(0);
КонецПроцедуры
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #28 - 30. Ноября 2010 :: 07:17
Печать  
Satans Claws писал(а) 30. Ноября 2010 :: 07:05:
Я про chm-хелп

chm-хелп оттуда и генерится Улыбка
Satans Claws писал(а) 30. Ноября 2010 :: 07:05:
Цитата:
Как работаешь со статусом возврата?


В модуле формы документа:
Процедура ВводНового(фКопирование, Объект)
СтатусВозврата(0);
КонецПроцедуры


Плохо читал справку: Цитата:
ВыполнитьОригинальноеСобытиеГК / RunOriginalEventOfGroupContext

   Синтаксис: ВыполнитьОригинальноеСобытиеГК(ГрупповойКонтекстФормы, ИмяСобытия, ...)

   Возвращает: тип: Число - статус возврата модуля указанного контекста.
  
Наверх
 
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #29 - 01. Декабря 2010 :: 11:32
Печать  
Satans Claws писал(а) 30. Ноября 2010 :: 06:43:
Satans Claws писал(а) 30. Ноября 2010 :: 06:24:
Видимо, нужно написать
Перехватчик.ВыполнитьОригинальноеСобытиеГК (КонтФормы, "ВводНового", фКопирование, Объект);


Параметры передаются. А вот на изменение СтатусаВозврата в оригинальном обработчике реагировать не хотим.

Кстати версию 1с++ приведи. А то это проблему Артур решил совсем недавно и в старых версиях действительно не работал СтатусВозврата(0)
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 4 ... 11
ОтправитьПечать