Переключение на Главную Страницу Страницы: 1 2 3 [4] 5  ОтправитьПечать
Очень популярная тема (более 25 ответов) Перехватчик. У кого как? (число прочтений - 17669 )
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #45 - 09. Ноября 2007 :: 16:27
Печать  
mdzen писал(а) 09. Ноября 2007 :: 15:00:
Как определить при перехвате события есть у него параметры или нет? Плачущий

Как откуда? из доки на событие, конечно Улыбка
Т.е. если это стандартное событие 1С - типа ПриЗаписи, ПриЗакрытии, смотрим Синтакс-Помощник, там все описано.
Если это событие ФормЕкс - типа ПослеОткрытия, ПослеЗакрытия, тут нужно различать, это событие формы или событие ГМ. У события ГМ в ФормЕкс, как правило, есть доп.параметр КонтФормы.
Если это событие Перехватчика - например, для ГМ СобытиеГМ_ПриОткрытии, инфа на событие есть в доке на Перехватчик.
Все очень и очень просто.
ЗЫ запомните, Перехватчик сам не придумывает события (кроме СобытиеГМ_ПриОткрытии, СобытиеГМ_ВводНового, СобытиеГМ_ВводНаОсновании), он все берет из кода 1С, ФормЕкс и т.д.
  

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


Копм вам не для того чтоб
орехи колоть!

Сообщений: 35
Местоположение: Набережные Челны
Зарегистрирован: 18. Сентября 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #46 - 09. Ноября 2007 :: 16:31
Печать  
Код собственно от dnp. Вкратце выглядит так:
Код
Выбрать все
//В Классе ПерехватГМ  вызываю ПерехватчикСобытий  ПерехватГКДокументы :
//_____________________________________________________________________________
Процедура ВключитьПерехватСобытийГК(Конт)
	Если ПустоеЗначение(Конт) = 0 Тогда
		Перехватчик = СоздатьОбъект("Перехватчик");
		ПерехватчикСобытий = Перехватчик.ПолучитьПерехватчикСобытийГК(Конт);
		Если ПустоеЗначение(ПерехватчикСобытий) = 1 Тогда
			ФормаРасш = СоздатьОбъект("РасширениеФормы");
			ФормаРасш.УстановитьФорму(Конт.Форма);
			ЧтоЗаФорма = ФормаРасш.ТипОбъекта();
			Если ЧтоЗаФорма = "Документ" Тогда
				ПерехватчикСобытий = СоздатьОбъект("ПерехватГКДокументы");
			КонецЕсли;
			ПерехватчикСобытий.Инициализация(Конт);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры //ВключитьПерехватСобытийГК

Функция СобытиеГМ_ПриОткрытии(Конт) Экспорт
	ВключитьПерехватСобытийГК(Конт);
	Возврат 1; // Можно открывать форму
КонецФункции
 



В    классе  ПерехватГКДокументы следующий код:

Код
Выбрать все
Функция Событие_ПриОткрытии() Экспорт
Сообщить("Открыт "+лКонтФормы.ПредставлениеВида());
Возврат лПерехватчик.ВыполнитьОригинальноеСобытиеГК(лКонтФормы,"ПриОткрытии");
КонецФункции
 



Как в классе ПерехватГМ  в процедуре  ВключитьПерехватСобытийГК() определить есть у события параметры или нет и взависимости от этого назначить обработчик (с параметрами или без).
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #47 - 09. Ноября 2007 :: 16:39
Печать  
mdzen писал(а) 09. Ноября 2007 :: 16:31:
Как в классе ПерехватГМ  в процедуре  ВключитьПерехватСобытийГК() определить есть у события параметры или нет и взависимости от этого назначить обработчик (с параметрами или без).

Ты уж определись, что тебе нужно - параметры у события (это дока) ? или параметры у обработчика события? и где - в форме или в объекте-перехватчике?
Если в форме, то можешь юзать Информатор для определения нахождения обработчика события в форме и нахождения количества параметров у него.
ЗЫ вроде в хелпе для формы документа событие "ПриОткрытии" не имеет параметров вообще Улыбка
  

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


Копм вам не для того чтоб
орехи колоть!

Сообщений: 35
Местоположение: Набережные Челны
Зарегистрирован: 18. Сентября 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #48 - 09. Ноября 2007 :: 16:41
Печать  
artbear писал(а) 09. Ноября 2007 :: 16:27:
Как откуда? из доки на событие, конечно Улыбка
Т.е. если это стандартное событие 1С - типа ПриЗаписи, ПриЗакрытии, смотрим Синтакс-Помощник, там все описано.

Понятно. В торговле например при вызове процедуры ПриОткрытии параметр задается в одних обработках как ФлагВосстановленияНастройки, в других - ФлагЧтенияНастройки.
Когда вызываем стандартную обработку то значит надо писать для первого случая:
Код
Выбрать все
овленияНастройки); 


для второго
Код
Выбрать все
астройки); 



Т.е. программно определить состав параметров передаваемого события нельзя? Опять ручками под каждую конфу писать?
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #49 - 09. Ноября 2007 :: 16:42
Печать  
mdzen писал(а) 09. Ноября 2007 :: 16:31:
           ПерехватчикСобытий = Перехватчик.ПолучитьПерехватчикСобытийГК(Конт);
           Если ПустоеЗначение(ПерехватчикСобытий) = 1 Тогда
                 Если ЧтоЗаФорма = "Документ" Тогда
                       ПерехватчикСобытий = СоздатьОбъект("ПерехватГКДокументы");
                 КонецЕсли;
                 ПерехватчикСобытий.Инициализация(Конт);
           КонецЕсли;
     КонецЕсли;
[/code]

Кстати, приведенный тобой код будет падать на любых формах, кроме документов Печаль
Потому что для этих форм ПерехватчикСобытий будет равен неопределенному значению, у которого нет метода Инициализация Улыбка
  

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: Перехватчик. У кого как?
Ответ #50 - 09. Ноября 2007 :: 16:45
Печать  
mdzen писал(а) 09. Ноября 2007 :: 16:31:
В    классе  ПерехватГКДокументы следующий код:

Код
Выбрать все
Функция Событие_ПриОткрытии() Экспорт
Сообщить("Открыт "+лКонтФормы.ПредставлениеВида());	  
Возврат лПерехватчик.ВыполнитьОригинальноеСобытиеГК(лКонтФормы,"ПриОткрытии");
КонецФункции
 



Извини, но тупишь конкретно Печаль
Причем здесь наименование переменной Печаль
Все равно ведь метод в классе-Перехватчике будет выглядеть так для любой формы отчета/обработки
Код
Выбрать все
Функция Событие_ПриОткрытии(ФлагСЛюбымНазванием) Экспорт
  Сообщить("Открыт "+лКонтФормы.ПредставлениеВида());	  
  Возврат лПерехватчик.ВыполнитьОригинальноеСобытиеГК(лКонтФормы,"ПриОткрытии", ФлагСЛюбымНазванием);
КонецФункции
 


И совершенно неважно, как эта переменная называется в модуле формы Улыбка
  

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


Копм вам не для того чтоб
орехи колоть!

Сообщений: 35
Местоположение: Набережные Челны
Зарегистрирован: 18. Сентября 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #51 - 09. Ноября 2007 :: 16:45
Печать  
artbear писал(а) 09. Ноября 2007 :: 16:39:
Если в форме, то можешь юзать Информатор для определения нахождения обработчика события в форме и нахождения количества параметров у него.

Спасибо. Смотрим, учимся

artbear писал(а) 09. Ноября 2007 :: 16:39:
ЗЫ вроде в хелпе для формы документа событие "ПриОткрытии" не имеет параметров вообще Улыбка

Зато есть кривые руки "программеров" Печаль
  
Наверх
ICQ  
IP записан
 
mdzen
Junior Member
**
Отсутствует


Копм вам не для того чтоб
орехи колоть!

Сообщений: 35
Местоположение: Набережные Челны
Зарегистрирован: 18. Сентября 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #52 - 09. Ноября 2007 :: 17:01
Печать  
artbear, спасибо за терпение. Улыбка
Теперь более-менее ясно. Буду копать дальше.
Конец недели, туплю конкретно  Смущённый.
  
Наверх
ICQ  
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #53 - 12. Ноября 2007 :: 07:37
Печать  
artbear писал(а) 08. Ноября 2007 :: 13:11:
...
Поэтому, чтобы не менять каждый раз класс ПерехватГМ для каждой конфигурации или конфы, лучше сделать так:
1) Создаем базовый фабричный класс БазоваяФабрикаСозданияПерехватчиков
2) Определяем у него открытый метод ПерехватитьКонтекст(КонтФормы) Экспорт
Метод в классе ничего не делает или выдает исключение или создает пустой перехватчик. Типа этот класс является абстрактным, только для наследования Улыбка
Основное действие будет происходить в конкретных классах-наследниках Улыбка
3) для каждой различной конфы пишем код в ГМ
Код
Выбрать все
	ФабрикаСозданияПерехватчиков = СоздатьОбъект("ФабрикаСозданияПерехватчиковДляДаннойКонфы"); //твой класс перехвата всех форм
	НовыйПерехватчикГМ = ФабрикаСозданияПерехватчиков.ПерехватитьГМ(Конт); 


4) а в наследнике ФабрикаСозданияПерехватчиковДляДаннойКонфы в методе ПерехватитьКонтекст пишем код по созданию точных обработчиков для нужных форм в данной конфе

Т.е. ООП в действии Улыбка
Этот метод хорош тем, что происходит минимальное изменение существующего клиентского кода.


То есть ФабрикаСозданияПерехватчиковДляДаннойКонфы это получается тот самый ПерехватГМ судя по п.3?

Тогда в каком месте возникают его наследники? Ведь в данном случае он сам, в обработке "базовых" событий, вполне не абстрактно, должен решать, как с какой формой поступить, кому какой обормотчик назначить (предварительно создав его).

Собственно, для гибкости и отвязности этого ПерехватГМ (или "ФабрикаСозд..."), нужно придумать этот гибкий алгоритм, либо придется по любому поводу рихтовать "Если (...) Тогда ... ИначеЕсли (...) " в обработчиках этого класса.

Я так понимаю, что имелся в виду примерно такой вариант, что выясняется ТипВид открывающейся формы, проверяется наличие класса-наследника с именем (например)
   "ФабрикаСозданияПерехватчиковДляДаннойКонфы." + ТипВид
потом
   "ФабрикаСозданияПерехватчиковДляДаннойКонфы." + Тип
и, при наличии первого или второго, создается ОКОП и назначается на перехват для этой новой формы. Ты просто эту подробность опустил? Или имел ввиду что-то другое?
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #54 - 14. Ноября 2007 :: 09:55
Печать  
Нет, тебе нужно почитать про шаблоны проектирования - ФабрикаОбъектов и Фабричный метод. Например, здесь http://ooad.asf.ru/Patterns_title.aspx?IdKat=1
Вкратце, Фабрика или Фабричный метод - это класс или метод, который знает, как создавать объекты определенных типов.
  

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



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #55 - 04. Июня 2009 :: 09:30
Печать  
artbear писал(а) 09. Ноября 2007 :: 16:45:
Все равно ведь метод в классе-Перехватчике будет выглядеть так для любой формы отчета/обработки
Код
Выбрать все
Функция Событие_ПриОткрытии(ФлагСЛюбымНазванием) Экспорт
  Сообщить("Открыт "+лКонтФормы.ПредставлениеВида());	  
  Возврат лПерехватчик.ВыполнитьОригинальноеСобытиеГК(лКонтФормы,"ПриОткрытии", ФлагСЛюбымНазванием);
КонецФункции 


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


Зато теперь падает 1С при открытии формы списка какого-либо справочника.
Приедтся плюнуть на этот флаг, заморачиваться с Информатором, или это баг? Потому что если сделать:
Код
Выбрать все
Функция Событие_ПриОткрытии ( ФлагЧтенияНастройки = 0 ) Экспорт
	Возврат __Перехватчик.ВыполнитьОригинальноеСобытиеГК ( РодКонт, "ПриОткрытии", 0 );
КонецФункции 


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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #56 - 04. Июня 2009 :: 10:48
Печать  
У 1С для разных форм у некоторых событий, например, ПриОткрытии, разное число параметров.

Решение есть:
Либо делай на каждый тип формы свой класс-перехватчик, например, с помощью наследования

Либо в одном классе для подобных событий делай проверку на разные типы форм и в зависимости от типа используй/не используй параметры.

На форуме в свое время это уже обсуждали и решения приводились.
  

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: Перехватчик. У кого как?
Ответ #57 - 04. Июня 2009 :: 11:32
Печать  
artbear писал(а) 04. Июня 2009 :: 10:48:
Либо в одном классе для подобных событий делай проверку на разные типы форм и в зависимости от типа используй/не используй параметры.

ща как раз этот вариант обкатываю, пока вроде работает.
пришел к этому в результате желания перейти на механизм подписки при работе с перехватчиком.
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #58 - 04. Июня 2009 :: 13:20
Печать  
А в чем разница между:
Код
Выбрать все
Функция Событие_ПриОткрытии ( ФлагЧтенияНастройки = 0 ) Экспорт
	Возврат __Перехватчик.ВыполнитьОригинальноеСобытиеГК ( РодКонт, "ПриОткрытии", ФлагЧтенияНастройки );
КонецФункции 

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


В оибоих случаях праметр передается. В одном случае 0, в другом - значение переменной. В одном случае 1с валится, в другом - нет.
Жаль, конечно, что придется возиться с проверкой на тип формы.
  
Наверх
 
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #59 - 05. Июня 2009 :: 05:29
Печать  
CaBaT писал(а) 04. Июня 2009 :: 11:32:
artbear писал(а) 04. Июня 2009 :: 10:48:
Либо в одном классе для подобных событий делай проверку на разные типы форм и в зависимости от типа используй/не используй параметры.

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

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