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



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Как правильно пользоваться перехватчиком для перехвата проведения?
Ответ #15 - 13. Октября 2009 :: 09:52
Печать  
shmalevoz писал(а) 13. Октября 2009 :: 07:25:
Проверь вот такую конструкцию. У меня вроде работает =)
Код
Выбрать все
Функция Событие_ОбработкаПроведения(Конт,ДопПараметр) Экспорт
	Перем Результат;

	Перехватчик=СоздатьОбъект("Перехватчик");
	Перехватчик.СнятьПерехватСобытийПроведенияДокумента(Конт.Вид());

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

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

	Возврат Результат;
КонецФункции
 



ДАААА!!! Знатное извращение!!!! До такого даже я, опытный извращенец, додуматься не смог!  Смех  Смех
Но что характерно - работает ведь! Хотя как выяснилось - не полностью....
А отмену проведения и последующий перехват зачем сделал? Рекурсии испугался? Так IMHO зря! ВыполнитьПроцедуруКонтекста перехватчик не вызывает. По крайней мере у меня не вызвало. Т.е. необходимым и достаточным оказался код
Код
Выбрать все
	Модуль	= СоздатьОбъект("ВыполняемыйМодуль");
	Параметры	= СоздатьОбъект("СписокЗначений");
	Параметры.ДобавитьЗначение(ДопПараметр);
	Результат	= Модуль.ВыполнитьПроцедуруКонтекста(Конт, "ОбработкаПроведения", Параметры);
 



А теперь ложка дегтя ..... СтатусВозврата(0) не работает. Работает только явная ошибка
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как правильно пользоваться перехватчиком для перехвата проведения?
Ответ #16 - 13. Октября 2009 :: 10:51
Печать  
Проверь код
рез = Конт.СтатусВозврата()
Интересно, получится или нет?
  

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


1C++ rocks!

Сообщений: 55
Зарегистрирован: 23. Апреля 2009
Re: Как правильно пользоваться перехватчиком для перехвата проведения?
Ответ #17 - 13. Октября 2009 :: 12:16
Печать  
Конт.СтатусВозврата() не работает. Через ВыполняемыйМодуль и Сервис тоже не возвращает. Так что наверное, наверное, придеться использовать конструкцию типа Х = 1/0. Прерывание наверняка.
  
Наверх
 
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Как правильно пользоваться перехватчиком для перехвата проведения?
Ответ #18 - 13. Октября 2009 :: 13:20
Печать  
shmalevoz писал(а) 13. Октября 2009 :: 12:16:
Конт.СтатусВозврата() не работает. Через ВыполняемыйМодуль и Сервис тоже не возвращает. Так что наверное, наверное, придеться использовать конструкцию типа Х = 1/0. Прерывание наверняка.


У меня слишком много СтатусВозврата(0) в модулях проведения. Задолбусь менять Печаль
  
Наверх
ICQ  
IP записан
 
shmalevoz
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 55
Зарегистрирован: 23. Апреля 2009
Re: Как правильно пользоваться перехватчиком для перехвата проведения?
Ответ #19 - 13. Октября 2009 :: 17:14
Печать  
Опыты показали, что рабочий вариант имеет место быть. СтатусВозврата надо просто проинициализировать
Код
Выбрать все
	Модуль				= СоздатьОбъект("ВыполняемыйМодуль");
	Статус				= 1;
	Параметры			= СоздатьОбъект("СписокЗначений");
	Параметры.ДобавитьЗначение(1);
	Модуль.ВыполнитьФункциюКонтекста(Конт, "СтатусВозврата", Параметры, Статус);
	Перехватчик	= СоздатьОбъект("Перехватчик");
	Результат	= Перехватчик.ВыполнитьОригинальноеСобытиеГК(Конт, "ОбработкаПроведения", ДопПараметр); 


(в модуле проведения конечно убрать бесконечный цикл и поставить СтатусВозврата(0))

Вроде работает...
  
Наверх
 
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Как правильно пользоваться перехватчиком для перехвата проведения?
Ответ #20 - 14. Октября 2009 :: 12:28
Печать  
shmalevoz писал(а) 13. Октября 2009 :: 17:14:
Опыты показали, что рабочий вариант имеет место быть. СтатусВозврата надо просто проинициализировать
Код
Выбрать все
	Модуль				= СоздатьОбъект("ВыполняемыйМодуль");
	Статус				= 1;
	Параметры			= СоздатьОбъект("СписокЗначений");
	Параметры.ДобавитьЗначение(1);
	Модуль.ВыполнитьФункциюКонтекста(Конт, "СтатусВозврата", Параметры, Статус);
	Перехватчик	= СоздатьОбъект("Перехватчик");
	Результат	= Перехватчик.ВыполнитьОригинальноеСобытиеГК(Конт, "ОбработкаПроведения", ДопПараметр); 


(в модуле проведения конечно убрать бесконечный цикл и поставить СтатусВозврата(0))

Вроде работает...

Так, стоп! Где оно устанавливает статус возврата я вижу а где считывает не вижу! Попробовал вызвать
Код
Выбрать все
Модуль.ВыполнитьФункциюКонтекста(Конт, "СтатусВозврата", Параметры, Статус); 

еще раз после вызова оригинального события - не помогло! Сообщить(Статус); по прежнему выдает "1".
Кстати если использовать ВыполнитьОригинальноеСобытие вместо ВыполнитьПроцедуру контекста как в прошлом варианте то не только СтатусВозврата(0) не работает но и а = 0/0 переставет работать!
В общем приведи полностью рабочий код, так как у тебя работает pls .....
  
Наверх
ICQ  
IP записан
 
shmalevoz
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 55
Зарегистрирован: 23. Апреля 2009
Re: Как правильно пользоваться перехватчиком для перехвата проведения?
Ответ #21 - 14. Октября 2009 :: 16:52
Печать  
Возвращает СтатусВозврата в Результат
Код
Выбрать все
Функция Событие_ОбработкаПроведения(Конт,ДопПараметр) Экспорт
	Сообщить("Внимание событие перехвачено. Начало проведения");

	Модуль				= СоздатьОбъект("ВыполняемыйМодуль");
	Статус				= 1;
	Параметры			= СоздатьОбъект("СписокЗначений");
	Параметры.ДобавитьЗначение(1);
	Модуль.ВыполнитьФункциюКонтекста(Конт, "СтатусВозврата", Параметры, Статус);
	Перехватчик			= СоздатьОбъект("Перехватчик");
	Результат			= Перехватчик.ВыполнитьОригинальноеСобытиеГК(Конт, "ОбработкаПроведения", ДопПараметр);

	Сообщить("Внимание событие перехвачено. Конец проведения. СтатусВозврата==" + Результат);

	Возврат Результат;
КонецФункции
 



НО имеет большой недостаток : не отлавливается Esc. Имея надежду, что нет бесконечных циклов и долговременного проведения, можно использовать такое извращение
Код
Выбрать все
Функция Событие_ОбработкаПроведения(Конт,ДопПараметр) Экспорт
	Сообщить("Внимание событие перехвачено. Начало проведения");

	Модуль				= СоздатьОбъект("ВыполняемыйМодуль");
	Информатор			= СоздатьОбъект("Информатор");

		ТекстМодуля	= Информатор.ПолучитьТекстМодуля(Конт);
	ТекстМодуля	= ТекстМодуля + "
	|
	| Функция __ОбработкаПроведения__(Параметр) Экспорт
	|	СтатусВозврата(1);
	|	ОбработкаПроведения(Параметр);
	|	Возврат СтатусВозврата();
	| КонецФункции
	|";
	Модуль	= СоздатьОбъект("ВыполняемыйМодуль");
	Модуль.НазначитьКонтекст(Конт);
	Модуль.УстановитьМодуль(ТекстМодуля);
	Если Модуль.КомпилироватьМодуль() = 0 Тогда
		Предупреждение("Неудачная попытка компиляции модуля!");
		Возврат 0;
	КонецЕсли;
	Модуль.ВыполнитьМодуль();
	Модуль.ПрисоединитьТекущийМодуль();
	Результат	= Модуль.__ОбработкаПроведения__(ДопПараметр);

	Сообщить("Внимание событие перехвачено. Конец проведения. СтатусВозврата==" + Результат);

	Возврат Результат;
КонецФункции 



Здесь также получаем статус возврата, но у пользователя нет возможности прервать проведение.
  
Наверх
 
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как правильно пользоваться перехватчиком для перехвата проведения?
Ответ #22 - 23. Ноября 2009 :: 14:33
Печать  
Чего-то не так. Не возвращает статус возврата все равно.
Цитата:
Внимание событие перехвачено. Начало проведения
Не заполнено поле Место хранения!
Не заполнено поле Вид отгрузки!
Документ Прих. накл. №ПН-0000001 от 23.11.09 не проводится!
Внимание событие перехвачено. Конец проведения. СтатусВозврата==1

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


1C++ rocks!

Сообщений: 55
Зарегистрирован: 23. Апреля 2009
Re: Как правильно пользоваться перехватчиком для перехвата проведения?
Ответ #23 - 27. Ноября 2009 :: 20:38
Печать  
Вот работающий пример. Тестировалось на 7.70.027 1cpp 3.0.1.23 BF-2009-11-12. Проверь.
  

tmp_004.zip ( 310 KB | Загрузки )
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать