Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Как "включить" Перехватчик? (число прочтений - 2575 )
al-e-ks
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 4
Зарегистрирован: 22. Марта 2010
Как "включить" Перехватчик?
22. Марта 2010 :: 15:10
Печать  
Изначальная цель - перехват событий и запись/регистрация изменений пользователя.
Узнал, что компонента 1CPP.dll имеет тип "Перехватчик", с помощью которого можно добиться нужной цели. Но вот уже который день не могу понять как с этим работать. В документации описаны методы, но как и где их вызывать, не могу сообразить  Смущённый

Что я собственно сделал:
1. Установил OpenConf.
2. Подгрузил  1CPP.dll.
Код глобального модуля вглядит в общем виде:

Код
Выбрать все
Функция СобытиеГМ_ПриОткрытии(Конт, ФлагЧтенияНастройки) Экспорт Далее

...

Процедура ПриНачалеРаботыСистемы()
   ...
   ЗагрузитьВнешнююКомпоненту("1cpp.dll");

   УправлениеНастройками = СоздатьОбъект("УправлениеНастройками");
   УправлениеНастройками.Включить("ПерехватитьСобытияГК");

   Перехватчик = СоздатьОбъект("Перехватчик");  
   Перехватчик.ПерехватитьСобытияГлобальногоМодуля();
   ...
КонецПроцедуры

...

Функция СобытиеГМ_ПриОткрытии(Конт, ФлагЧтенияНастройки) Экспорт
	Сообщить("Перехват события ПриОткрытии");
	Возврат 1;
КонецФункции

...

 



Но при загрузке системы сразу появляется ошибка:
Перехватчик.ПерехватитьСобытияГлобальногоМодуля();
Недостаточное число параметров передано при вызове функции/процедуры объекта - а какой параметр нужно?
Пробовал передавать в качестве параметра "Контекст", тогда ошибка была следующая:
ПерехватитьСобытияГлобальногоМодуля: объект-перехватчик должен быть пользовательским классом 1С++

Помогите пожалуйста разобраться, как правильно и куда что писать? Я видимо совсем не понимаю чего-то...  Круглые глаза
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Как "включить" Перехватчик?
Ответ #1 - 22. Марта 2010 :: 20:20
Печать  
В глобальный модуль:
Код
Выбрать все
Перем __ОбработчикСобытийГМ Экспорт, __Перехватчик Экспорт; // 1С++

...

Процедура ПриНачалеРаботыСистемы ()

	Если ЗагрузитьВнешнююКомпоненту ( "1cpp.dll" ) = 0 Тогда
		Предупреждение ( "Не удалось загрузить внешнюю компоненту 1С++. Выходим из системы." );
		СтатусВозврата ( 0 );
		Возврат;
	КонецЕсли;

	// необходимые приготовления для учета разных событий и интерактивных изменений реквизитов документов и справочников
	УправлениеНастройками = СоздатьОбъект ( "УправлениеНастройками" );
	УправлениеНастройками.Сбросить ( "Отладчик" );
	УправлениеНастройками.Включить ( "ПерехватитьСобытияГК" );
	__ОбработчикСобытийГМ = СоздатьОбъект ( "ОбработчикСобытийГМ" );
	__Перехватчик = СоздатьОбъект ( "Перехватчик" );
	__Перехватчик.ПерехватитьСобытияГлобальногоМодуля ( __ОбработчикСобытийГМ );
 


Упоминается объект класса ОбработчикСобытийГМ. Класс:
Код
Выбрать все
//*************************************************************************
Функция я() Экспорт Возврат глВзятьКонтекст ( Контекст ) КонецФункции // : Контекст

//****************************************************************************
Процедура СобытиеГМ_СозданиеКонтекста ( Конт ) Экспорт
	Сообщить("Создан контекст формы");
КонецПроцедуры

//****************************************************************************
Процедура СобытиеГМ_ПриОткрытии ( Конт ) Экспорт
	ОбработчикГК = СоздатьОбъект ( "ОбработчикСобытийГК" );
	ОбработчикГК.РодКонт = Конт;
	__Перехватчик.ПерехватитьСобытияГК ( Конт, ОбработчикГК );
КонецПроцедуры

//****************************************************************************
Процедура Конструктор()
КонецПроцедуры //Конструктор 


Класс ОбработчикСобытийГК:
Код
Выбрать все
Перем РодКонт Экспорт; // контекст, события к-го перехватываются

//*************************************************************************
Функция я () Экспорт Возврат глВзятьКонтекст ( Контекст ) КонецФункции // : Контекст

//****************************************************************************
Функция Событие_ПриОткрытии ( ФлагЧтенияНастройки = 0 ) Экспорт
	Возврат __Перехватчик.ВыполнитьОригинальноеСобытиеГК ( РодКонт, "ПриОткрытии", 0 );
КонецФункции

//****************************************************************************
Процедура Событие_ПриЗаписи() Экспорт
	__Перехватчик.ВыполнитьОригинальноеСобытиеГК ( РодКонт, "ПриЗаписи" );
КонецПроцедуры

//****************************************************************************
Процедура Событие_ПриЗакрытии () Экспорт
	__ОбработчикСобытийГМ.Событие ( РодКонт, "ПриЗакрытии" );
КонецПроцедуры

... другие процедуры перехвата...

//****************************************************************************
Процедура Конструктор()
КонецПроцедуры //Конструктор
 

  
Наверх
 
IP записан
 
al-e-ks
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 4
Зарегистрирован: 22. Марта 2010
Re: Как "включить" Перехватчик?
Ответ #2 - 24. Марта 2010 :: 14:37
Печать  
Огромное спасибо!! Надо проверить... к сожалению сейчас повесили другие архи-важные задачи, как доберусь - отпишусь, что получилось Улыбка
Еще раз пасиба!   Круглые глаза
  
Наверх
 
IP записан
 
al-e-ks
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 4
Зарегистрирован: 22. Марта 2010
Re: Как "включить" Перехватчик?
Ответ #3 - 06. Апреля 2010 :: 10:35
Печать  
Повозился какое-то время, наконец дошло что нужно делать Улыбка

1. В каталоге базы создал файл "defcls.prm" со следующим содержанием:
Код
Выбрать все
// Мой первый класс
класс ОбработчикСобытийГМ = classes\ОбработчикСобытийГМ.ert
{
};

класс ОбработчикСобытийГК = classes\ОбработчикСобытийГК.ert
{
}; 



2. Там же, в каталоге с базой, создал папку "classes", куда поместил обработки "ОбработчикСобытийГМ.ert" и "ОбработчикСобытийГК.ert" с соответствующим кодом из поста blindvic.

Пока не проделал эти пункты, при запуске системы вылетала ошибка при создании "ОбработчикСобытийГМ", что мол не удается создать объект с таким классом...
Код
Выбрать все
__ОбработчикСобытийГМ = СоздатьОбъект ( "ОбработчикСобытийГМ" );// ошибка 



Все заработало!


Единственное, что я не понял, так это что в "ОбработчикСобытийГК.ert" возникала ошибка в этом месте:
Код
Выбрать все
Процедура Событие_ПриЗакрытии () Экспорт
	__ОбработчикСобытийГМ.Событие ( РодКонт, "ПриЗакрытии" );
КонецПроцедуры
 


Поэтому ничего другого не придумал как заменить действие как и в других процедурах:
Код
Выбрать все
Процедура Событие_ПриЗакрытии () Экспорт
	//__ОбработчикСобытийГМ.Событие ( РодКонт, "ПриЗакрытии" );
	__Перехватчик.ВыполнитьОригинальноеСобытиеГК  ( РодКонт, "ПриЗакрытии" );
КонецПроцедуры
 




Как я понял, то перехват событий по"ОбработчикСобытийГМ" происходит при действиях каким либо образом связанных с глобальным модулем, напр. при открытии журнала, справочников, внутренних отчётов и обработок.. и т.п.

А "ОбработчикСобытийГК" - самостоятельный контекст, такие как внешние отчеты к примеру.

Еще раз хочу поблагодарить blindvic, иначе бы не разобрался)
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Как "включить" Перехватчик?
Ответ #4 - 06. Апреля 2010 :: 19:11
Печать  
al-e-ks писал(а) 06. Апреля 2010 :: 10:35:
Единственное, что я не понял, так это что в "ОбработчикСобытийГК.ert" возникала ошибка в этом месте:
Код
Выбрать все
Процедура Событие_ПриЗакрытии () Экспорт
	__ОбработчикСобытийГМ.Событие ( РодКонт, "ПриЗакрытии" );
КонецПроцедуры
 


Поэтому ничего другого не придумал как заменить действие как и в других процедурах:
Код
Выбрать все
Процедура Событие_ПриЗакрытии () Экспорт
	//__ОбработчикСобытийГМ.Событие ( РодКонт, "ПриЗакрытии" );
	__Перехватчик.ВыполнитьОригинальноеСобытиеГК  ( РодКонт, "ПриЗакрытии" );
КонецПроцедуры
 



Извини, моя вина. У меня в __ОбработчикСобытийГМ есть публичная (экспорт) процедура с именем Событие, к-ю я для своих экспериментальных целей вызывал.
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Как "включить" Перехватчик?
Ответ #5 - 06. Апреля 2010 :: 19:15
Печать  
al-e-ks писал(а) 06. Апреля 2010 :: 10:35:
Повозился какое-то время, наконец дошло что нужно делать Улыбка

1. В каталоге базы создал файл "defcls.prm" со следующим содержанием:
Код
Выбрать все
// Мой первый класс
класс ОбработчикСобытийГМ = classes\ОбработчикСобытийГМ.ert
{
};

класс ОбработчикСобытийГК = classes\ОбработчикСобытийГК.ert
{
}; 



2. Там же, в каталоге с базой, создал папку "classes", куда поместил обработки "ОбработчикСобытийГМ.ert" и "ОбработчикСобытийГК.ert" с соответствующим кодом из поста blindvic.

Пока не проделал эти пункты, при запуске системы вылетала ошибка при создании "ОбработчикСобытийГМ", что мол не удается создать объект с таким классом...
Код
Выбрать все
__ОбработчикСобытийГМ = СоздатьОбъект ( "ОбработчикСобытийГМ" );// ошибка 



Или можно, как например у меня, классы держать в мд-шнике:
Создать обработку с именем defcls с содержимым:
Код
Выбрать все
класс ОбработчикСобытийГМ = defclsОбработчикСобытийГМ@MD{};
класс ОбработчикСобытийГК = defclsОбработчикСобытийГК@MD{};
 


И, соответственно, обработки defclsОбработчикСобытийГМ и defclsОбработчикСобытийГК в модулях к-х поместить текст классов.
  
Наверх
 
IP записан
 
al-e-ks
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 4
Зарегистрирован: 22. Марта 2010
Re: Как "включить" Перехватчик?
Ответ #6 - 09. Апреля 2010 :: 09:26
Печать  
Как оказалось в итоге, при попытке перехватить какую-либо еще процедуру/функцию ничего не получилось. Вот к примеру мне хотелось бы выполнить некоторые действия при сохранении элемента справочника или документа.. или при выполнении определенной функции из глобального модуля. Для этого я в "ОбработчикСобытийГМ.ert" (т.е. обработка описания класса, как я понимаю) добавил следующее:
Код
Выбрать все
//********************************************************
Процедура СобытиеГМ_ПриЗаписи ( Конт ) Экспорт
	ОбработчикГК = СоздатьОбъект ( "ОбработчикСобытийГК" );
	ОбработчикГК.РодКонт = Конт;
	__Перехватчик.ПерехватитьСобытияГК ( Конт, ОбработчикГК );
	Сообщить("Происходит запись контекста.");
КонецПроцедуры

//********************************************************
// своя глобальная функция
Процедура СобытиеГМ_глПриЗаписиОбъекта ( ) Экспорт
	ОбработчикГК = СоздатьОбъект ( "ОбработчикСобытийГК" );
	ОбработчикГК.РодКонт = Конт;
	__Перехватчик.ПерехватитьСобытияГК ( Конт, ОбработчикГК );
	Сообщить("Происходит обработка записи объекта.");
КонецПроцедуры
 



К сожалению перехват "ПриЗаписи" и "глПриЗаписиОбъекта" не происходит.
Разве я что-то делаю не правильно?  Смущённый
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как "включить" Перехватчик?
Ответ #7 - 09. Апреля 2010 :: 11:51
Печать  
al-e-ks писал(а) 09. Апреля 2010 :: 09:26:
К сожалению перехват "ПриЗаписи" и "глПриЗаписиОбъекта" не происходит.
Разве я что-то делаю не правильно?  Смущённый

Перехватчик перехватывает только штатные события 1С и события ВК.
Ни в одной ВК, а уж тем более в самой 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: Как "включить" Перехватчик?
Ответ #8 - 09. Апреля 2010 :: 11:55
Печать  
al-e-ks писал(а) 09. Апреля 2010 :: 09:26:
Вот к примеру мне хотелось бы выполнить некоторые действия при сохранении элемента справочника или документа.. или при выполнении определенной функции из глобального модуля.

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

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