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


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Как перехватить и обработать процедуру модуля проведения не меняя конфигура
06. Октября 2009 :: 09:13
Печать  
У меня подключены компаненты 1с++ и Formex. Можно ли как-нибудь перехватить и переопределить процедуру проведения документа?
  

Каждая система проходит три стадии:&&1) Шумиха&&2) Неразбериха&&3) Поиск виновных (собственно, рабочий процесс)&&4) Наказание невиновных&&5) Награждение непричастных&& В.М. Глушков
Наверх
 
IP записан
 
slider26
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 256
Зарегистрирован: 01. Июня 2006
Re: Как перехватить и обработать процедуру модуля проведения не меняя конфигура
Ответ #1 - 06. Октября 2009 :: 09:48
Печать  
Смотри класс "Перехватчик"
  
Наверх
 
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Как перехватить и обработать процедуру модуля проведения не меняя конфигура
Ответ #2 - 08. Октября 2009 :: 11:52
Печать  
slider26 писал(а) 06. Октября 2009 :: 09:48:
Смотри класс "Перехватчик"

Лучше не смотри! Посмотри сначала сюда http://www.1cpp.ru/forum/YaBB.pl?num=1248167893/3#3 (последнее сообщение .... ) а потом решай - так-ли тебе это нужно Улыбка
  
Наверх
ICQ  
IP записан
 
kriblya
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 313
Зарегистрирован: 24. Декабря 2007
Re: Как перехватить и обработать процедуру модуля проведения не меняя конфигура
Ответ #3 - 08. Октября 2009 :: 12:12
Печать  
Была такая дрянь... лечится
Код
Выбрать все
	УправлениеНастройками=СоздатьОбъект("УправлениеНастройками");
	УправлениеНастройками.Включить("ПерехватитьСобытияГК");
	УправлениеНастройками.Включить("EnableTableSourceTable");

	УправлениеНастройками.Включить("EnableTurboBL");
 

  
Наверх
 
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Как перехватить и обработать процедуру модуля проведения не меняя конфигура
Ответ #4 - 08. Октября 2009 :: 14:43
Печать  
kriblya писал(а) 08. Октября 2009 :: 12:12:
Была такая дрянь... лечится
Код
Выбрать все
	УправлениеНастройками=СоздатьОбъект("УправлениеНастройками");
	УправлениеНастройками.Включить("ПерехватитьСобытияГК");
	УправлениеНастройками.Включить("EnableTableSourceTable");

	УправлениеНастройками.Включить("EnableTurboBL");
 


Что именно лечится? Что что в ветке не которую ссылка - может и лечится а баг №4238 не лечится Печаль
  
Наверх
ICQ  
IP записан
 
kriblya
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 313
Зарегистрирован: 24. Декабря 2007
Re: Как перехватить и обработать процедуру модуля проведения не меняя конфигура
Ответ #5 - 09. Октября 2009 :: 05:41
Печать  
Не понял
у док модульдокумента
Код
Выбрать все
Процедура ОбработкаПроведения()
	  ДвигаемРегистры();
	а = 10/0;
КонецПроцедуры
 


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




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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как перехватить и обработать процедуру модуля проведения не меняя конфигура
Ответ #6 - 09. Октября 2009 :: 06:35
Печать  
Цитата:
     записатьВБДПризнакПроведенности(КонтекстДокумента,1);

Код этого метода?
  

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


I Love YaBB 2!

Сообщений: 313
Зарегистрирован: 24. Декабря 2007
Re: Как перехватить и обработать процедуру модуля проведения не меняя конфигура
Ответ #7 - 09. Октября 2009 :: 12:22
Печать  
в мускул записывается Все содержимое документа+ признак проведения, для просмотра истории
Потом можно просто посмотреть все редакции документа.
Этот же метод срабатывает призаписи
  
Наверх
 
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Как перехватить и обработать процедуру модуля проведения не меняя конфигура
Ответ #8 - 09. Октября 2009 :: 12:26
Печать  
kriblya писал(а) 09. Октября 2009 :: 05:41:
Не понял
у док модульдокумента
Код
Выбрать все
Процедура ОбработкаПроведения()
	  ДвигаемРегистры();
	а = 10/0;
КонецПроцедуры
 


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




и все работает

Конечно работает. А не должно работать! Должно сказать "Документ не проведен + Ок"  и отменить транзакцию
А если сделать так
Код
Выбрать все
Процедура ОбработкаПроведения()
	  ДвигаемРегистры();
	а = 10/0;
	  ДвигаемДругиеРегистры();
КонецПроцедуры 


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


I Love YaBB 2!

Сообщений: 313
Зарегистрирован: 24. Декабря 2007
Re: Как перехватить и обработать процедуру модуля проведения не меняя конфигура
Ответ #9 - 09. Октября 2009 :: 12:27
Печать  
Я кажется понял о чем речь идет
Код
Выбрать все
ОбработкаПроведения
	    двигаемрегист_1();
	    двигаемрегист_2();
	    двигаемрегист_3();
		    а=10/0; Вызов ошибки
	    двигаемрегист_4();
КонецПроцедуры
 



в регистрах движение 1,2,3, и нет движения 4
Так я понимаю?
Ну помоему за этим самому следить нужно,
а потом помему всю эту хрень в транзакцию не запихать?
  
Наверх
 
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Как перехватить и обработать процедуру модуля проведения не меняя конфигура
Ответ #10 - 09. Октября 2009 :: 12:39
Печать  
kriblya писал(а) 09. Октября 2009 :: 12:22:
в мускул записывается Все содержимое документа+ признак проведения, для просмотра истории
Потом можно просто посмотреть все редакции документа.
Этот же метод срабатывает призаписи


А, ну это типа журнал регистрации. Можно перехватить запись в Журнал Регистрации и оттуда писать. Хотя конечно состояние документа он не запишет, только событие.....
У меня есть для этого отдельный класс - я тоже параноик  Смех
  
Наверх
ICQ  
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Как перехватить и обработать процедуру модуля проведения не меняя конфигура
Ответ #11 - 09. Октября 2009 :: 12:45
Печать  
kriblya писал(а) 09. Октября 2009 :: 12:27:
Я кажется понял о чем речь идет
Код
Выбрать все
ОбработкаПроведения
	    двигаемрегист_1();
	    двигаемрегист_2();
	    двигаемрегист_3();
		    а=10/0; Вызов ошибки
	    двигаемрегист_4();
КонецПроцедуры
 



в регистрах движение 1,2,3, и нет движения 4
Так я понимаю?

Да! Именно так!
Цитата:
Ну помоему за этим самому следить нужно,

Как именно следить? Все ошибки исключить на 100% невозможно.
Цитата:
а потом помему всю эту хрень в транзакцию не запихать?

А не нужно запихивать! Отключи перехват - оно само сработает так как нужно. А перехват меняет логику работы программы. А не должен по идее.....
  
Наверх
ICQ  
IP записан
 
kriblya
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 313
Зарегистрирован: 24. Декабря 2007
Re: Как перехватить и обработать процедуру модуля проведения не меняя конфигура
Ответ #12 - 09. Октября 2009 :: 17:35
Печать  
Цитата:
У меня есть для этого отдельный класс - я тоже параноик

я не параноик,
но пример:
заказ от клиента -10 позиций товара, далее через день меняют, потом еще раз, и так раз 10, потом какой-то вариант оплачивают, а их менагер в отпуске, и они сами не знают чего оплатили... открыл отчет по редакциям дока, и все видишь.
или контроль работы своих менагеров... Журнал регистрации дает только данные об открытии, записи и проведении, а мои данные дают мне ВСЕ интерактивные изменения, и любые проведения доков и справочников. это- же позволяет по инету смотреть что происходит в офисе...
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как перехватить и обработать процедуру модуля проведения не меняя конфигура
Ответ #13 - 13. Октября 2009 :: 04:50
Печать  
kriblya писал(а) 09. Октября 2009 :: 05:41:
у перехватчика:
Код
Выбрать все
Процедура Событие_ОбработкаПроведения(КонтекстДокумента) Экспорт
	записатьВБДПризнакПроведенности(КонтекстДокумента,1);
	ОбъектПерехватчик.ВыполнитьОригинальноеСобытиеГК(КонтекстДокумента, "ОбработкаПроведения");
КонецПроцедуры	// СобытиеГМ_СозданиеКонтекста
 



А по-правильному ведь нужно так:
Цитата:
Функция Событие_ОбработкаПроведения(КонтекстДокумента) Экспорт
     записатьВБДПризнакПроведенности(КонтекстДокумента,1);
     Возврат ОбъектПерехватчик.ВыполнитьОригинальноеСобытиеГК(КонтекстДокумента, "ОбработкаПроведения");
КонецФункции

Т.е. для работы со статусом возврата нужно юзать функцию-обработчик перехвата и возврат 0 или 1 будет учитываться в качестве возврата.

Проверьте этот вариант для своих багах и отпишитесь.
  

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: Как перехватить и обработать процедуру модуля проведения не меняя конфигура
Ответ #14 - 13. Октября 2009 :: 05:27
Печать  
artbear писал(а) 13. Октября 2009 :: 04:50:
kriblya писал(а) 09. Октября 2009 :: 05:41:
[skip]

А по-правильному ведь нужно так:
Цитата:
Функция Событие_ОбработкаПроведения(КонтекстДокумента) Экспорт
     записатьВБДПризнакПроведенности(КонтекстДокумента,1);
     Возврат ОбъектПерехватчик.ВыполнитьОригинальноеСобытиеГК(КонтекстДокумента, "ОбработкаПроведения");
КонецФункции

Т.е. для работы со статусом возврата нужно юзать функцию-обработчик перехвата и возврат 0 или 1 будет учитываться в качестве возврата.


Да у меня в принцыпе так и написано. С самого начала. Но IMHO проблема не в том чтобы перехватчик был функцией а чтобы перехватываемое событие было функцией. Это видно на примере Перехвата диалога сохранения/открытия файлов http://www.1cpp.ru/forum/YaBB.pl?num=1242732564/45
Как писал metaeditor Цитата:
да, у меня перехватчик тоже не видит статус возврата.
вобщем я переделал событие ДиалогВыбораФайлаПриОткрытии на функцию, так работает.

Но вот как переделать стандартное 1С-ное событие на функцию..... у кого-нибудь есть идеи?
Я попробовал тупо написать
Код
Выбрать все
Функция ОбработкаПроведения(Знач Режим)
......
КонецФункции 


Синтаксис-контроль не ругается, все работает, но работает по прежнему - т.е. статуса возврата не видит!  Злой
Цитата:
Проверьте этот вариант для своих багах и отпишитесь.

Проверили - все хреново  Печаль Плачущий
  
Наверх
ICQ  
IP записан
 
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] 
ОтправитьПечать