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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Перехватчик. Для каких событий необходим ручной вызов оригинального?
25. Ноября 2010 :: 09:08
Печать  
Начал работать с перехватчиком и словил немало сюрпризов.
Понял, что для некоторых событий просто необходимо из обработчика вызывать оригинальное, а для некоторых это противопоказано, например: СобытиеГМ_ВводНаОсновании:
  • если вызвать событие в обработчике - док отработает его дважды
  • попытка вызвать и вернуть 0 - отменяет событие
  • остается только контроллировать и позволять 1С-ке отработать событие самой

Потому хотелось бы найти где-то развернутую информацию о том, какие события как себя ведут, и как их надо обрабатывать.

Пока не понял, почему, но перестал работать пункт действий документа "Открыть в журнале" - журнал открывается, отладка кажет нормальную работу, но позиционирования не происходит, хотя параметр доходит верный...
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #1 - 25. Ноября 2010 :: 09:31
Печать  
Как проверил, что 2-ды отрабатывает ?
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #2 - 25. Ноября 2010 :: 09:36
Печать  
Eprst писал(а) 25. Ноября 2010 :: 09:31:
Как проверил, что 2-ды отрабатывает ?

Оно спрашивало разрешения на удаление строк. стал отладкой ловить, почему - выявил двойное выполнение метода ВводНаОсновании. При первом проходе док только создан, а при втором уже заполнен.

Это же касается и событий ВводНового и ПриОткрытии.
  
Наверх
 
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #3 - 25. Ноября 2010 :: 09:41
Печать  
Dmitry The Wing писал(а) 25. Ноября 2010 :: 09:08:
Начал работать с перехватчиком и словил немало сюрпризов.
Понял, что для некоторых событий просто необходимо из обработчика вызывать оригинальное, а для некоторых это противопоказано, например: СобытиеГМ_ВводНаОсновании:


Стоп! А почему "СобытиеГМ_ВводНаОсновании" а не "СобытиеГК_ВводНаОсовании"?
artbear советовал заменить все три события глобального модуля "ВводНового", "ПриОткрытии" и "ВводНаОсновании" на одно "СобытиеГМ_СозданиеКонтекста" и использовать его только для перехвата ГлобальногоКонтекста, а дальше уже работать с ПерехватчикомГК и не трогать ГМ
  
Наверх
ICQ  
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #4 - 25. Ноября 2010 :: 09:48
Печать  
Воспользовался советом. Убрал из перехватчика эти методы, однако что-то все еще мешает позиционированию в журнале ...

Еще проблема:
Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтОбъекта, "ПриОткрытии");
не отработает, если в форме у процедуры ПриОткрытии есть параметр... Как лечить? И как определить, что параметр надо передавать? и что он был передан?

А если его не вызвать - событие в форму не придет...
  
Наверх
 
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #5 - 25. Ноября 2010 :: 11:38
Печать  
Dmitry The Wing писал(а) 25. Ноября 2010 :: 09:48:
Воспользовался советом. Убрал из перехватчика эти методы, однако что-то все еще мешает позиционированию в журнале ...
Цитата:
Пока не понял, почему, но перестал работать пункт действий документа "Открыть в журнале" - журнал открывается, отладка кажет нормальную работу, но позиционирования не происходит, хотя параметр доходит верный...


А где этот пункт? В меню "Действия" не нашел. Или у тебя собственное "МенюДействийДокумента"? Тогда ничем помочь не могу т.к. для этого нужно увидеть его код.

Dmitry The Wing писал(а) 25. Ноября 2010 :: 09:48:
Еще проблема:
Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтОбъекта, "ПриОткрытии");
не отработает, если в форме у процедуры ПриОткрытии есть параметр... Как лечить? И как определить, что параметр надо передавать? и что он был передан?

А если его не вызвать - событие в форму не придет...

А где этот параметр есть? У Отчета небось? У меня  для Отчетов/Обработок свой класс-перехватчик, наследник основного перехватчика. Вот комментарий в его модуле:
Код
Выбрать все
// Создан и унаследован от ПерехватчикСобытий только для переопределения методов Событие_ПриОткрытии() и Событи_ВводНового()
// Первый из них имеет параметр "ФлагЧтенияНастроек" которого нету и Документов, Справочников, Журналов и др форм
// А для второго не должно вызываться оригинальное событие, т.к. его для отчетов просто нету....(avgreen)
 


А при инициализации Перехватчика (ПриСозданииКонтекста) я анализирую что мы перехватили следующим образом
Код
Выбрать все
	Если (ФормаРасш.ТипОбъекта() = "ВнешнийОтчет") Тогда
		//Сообщить("ВнешнийОтчет" + СокрЛП());
		НазваниеКлассаПерехватчика = "ПерехватчикСобытийОтчет";
		//Возврат 1;
	ИначеЕсли (ФормаРасш.ТипОбъекта() = "Отчет") Или (ФормаРасш.ТипОбъекта() = "Обработка") ИЛИ (ФормаРасш.ТипОбъекта() = "ВнешнийОтчет") Тогда
		НазваниеКлассаПерехватчика = "ПерехватчикСобытийОтчет";
	ИначеЕсли ФормаРасш.ТипОбъекта() = "Справочник" Тогда
		НазваниеКлассаПерехватчика = "ПерехватчикСобытийСпр";
	Иначе
		НазваниеКлассаПерехватчика = ТипЗначенияСтр(Сам());
	КонецЕсли;
	ПерехватчикСобытий = СоздатьОбъект(НазваниеКлассаПерехватчика);
	ПерехватчикСобытий.Инициализация(КонтФормы);
 



У Справочников кстати свои заморочки - с событием ПриЗаписи. Вот комментарий из класса ПерехватичикСобытийСпр
Код
Выбрать все
// Создан и унаследован от ПерехватчикСобытий только для переопределения единственного метода Событие_ПриЗаписи()
// Причина - для справочников, предопредеоенная процедура ПриЗаписи(), которую собственно и перехватывает Событие_ПриЗаписи()
// имеет один параметр СписокПериодическихРекв, а для Документа, Операции и т.п. этого параметра нету. И если
// попытаться перехватить запись Документа Событием_ПриЗаписи с параметром то 1С падает нафиг, причем не успев даже ругануться
// (что в принципе и не удивительно). Определить-же метод Событие_ПриЗаписи как метод с неопределенным количеством параметров
// и потом вызвать Сам().ПолучитьСписокПараметров("Событие_ПриЗаписи") у меня почему-то не получилось....
// Вот и пришлось так извратиться! Походу пришлось экспортнуть из родительского класса свойство КонтекстПерехваченнойФормы
// (avgreen)
 



Надеюсь достаточно исчерпывающий ответ? Не осталось "граблей на которые не ступала нога человека"?  Смех
  
Наверх
ICQ  
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #6 - 26. Ноября 2010 :: 02:10
Печать  
avgreen писал(а) 25. Ноября 2010 :: 11:38:
Dmitry The Wing писал(а) 25. Ноября 2010 :: 09:48:
Воспользовался советом. Убрал из перехватчика эти методы, однако что-то все еще мешает позиционированию в журнале ...
Цитата:
Пока не понял, почему, но перестал работать пункт действий документа "Открыть в журнале" - журнал открывается, отладка кажет нормальную работу, но позиционирования не происходит, хотя параметр доходит верный...


А где этот пункт? В меню "Действия" не нашел. Или у тебя собственное "МенюДействийДокумента"? Тогда ничем помочь не могу т.к. для этого нужно увидеть его код.

Почему-то был уверен, что этот пункт есть во всех типовых (в ПУБ в каждом документе есть кнопка Действия).
Код там простой - выпадающий список значений, содержащий для каждого документа свой набор действий, но 4 из них постоянны - это:
  • Структура подчиненности
  • Отчет о движениях документа
  • Ввести на основании
  • Открыть в журнале
Разговор о последнем. Код обработки лежит в глобальнике
Код
Выбрать все
Если Конт.Выбран() = 0 Тогда
	Предупреждение("Документ не записан!");
Иначе
	ДокументЖурнала = Конт.ТекущийДокумент();
	ОткрытьФорму("Журнал.Общий#", ДокументЖурнала);
КонецЕсли; 


В самом журнале (форма списка) в ПриОткрытии производится позиционирование с помощью АктивизироватьОбъект(Форма.Параметр);
Отладка показала, что вызов проходит и параметр верный, но позиционирования нет  Злой


avgreen писал(а) 25. Ноября 2010 :: 11:38:
Dmitry The Wing писал(а) 25. Ноября 2010 :: 09:48:
Еще проблема:
Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтОбъекта, "ПриОткрытии");
не отработает, если в форме у процедуры ПриОткрытии есть параметр... Как лечить? И как определить, что параметр надо передавать? и что он был передан?

А если его не вызвать - событие в форму не придет...

А где этот параметр есть? У Отчета небось? У меня  для Отчетов/Обработок свой класс-перехватчик, наследник основного перехватчика. Вот комментарий в его модуле: #
А при инициализации Перехватчика (ПриСозданииКонтекста) я анализирую что мы перехватили следующим образом #

У Справочников кстати свои заморочки - с событием ПриЗаписи. Вот комментарий из класса ПерехватичикСобытийСпр
#

Надеюсь достаточно исчерпывающий ответ? Не осталось "граблей на которые не ступала нога человека"?  Смех


К сожалению, недостаточно.
С методами ВводНового и ВводНаОсновании все просто - по типу объекта легко определить параметры, ибо они предопределены, либо отсутствуют (для отчетов).
А вот ПриОткрытии может иметь любое число параметров ... во всех отчетах по регистрам в типовой ПУБ есть как минимум 1 параметр - флаг восстановления настроек.

Проблема не в том, чтобы определить тип объекта и выбрать нужный класс перехватчик, а в разработке глобальной фабрики событий, позволяющей регистрировать более одного перехватчика на одно событие. все прекрасно работает со стандартными функциями, но ломается на ПриОткрытии (думаю, найдутся и другие).

Потому вопрос в том, как определить число параметров и их значения при перехвате, остается открытым!


Дальнейшие эксперименты показали: при отсутствии перехвата события формы Событие_ПриИзмененииРазмераОкна позиционирование проходит на ура. При использовании перехвата - нет.
Перехват реализован
Код
Выбрать все
Функция Событие_ПриИзмененииРазмераОкна(ТипСобытия, Ширина, Высота) Экспорт
	Сам = Сам(Контекст);
	Рез = 1;
	КонтОбъекта = Сам.ПолучитьКонтекстОкружения();
	Если ТипЗначенияСтр(КонтОбъекта) <> "ГрупповойКонтекст" Тогда
		Если ТипЗначенияСтр(КонтФормы) = "ГрупповойКонтекст" Тогда
			КонтОбъекта = КонтФормы;
		Иначе
			Возврат Рез;
		КонецЕсли;
	КонецЕсли;

	//Здесь будет что-то делаться

	Если Рез > 0 Тогда
		Перехватчик = СоздатьОбъект("Перехватчик");
		Рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтОбъекта, "ПриИзмененииРазмераОкна", ТипСобытия, Ширина, Высота);
	КонецЕсли;

	Возврат Рез;
КонецФункции // Событие_ПриИзмененииРазмераОкна 

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #7 - 26. Ноября 2010 :: 05:54
Печать  
Дык ты всегда в конце вызывай оригинальное событие и привет - и будет тебе счастье.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #8 - 26. Ноября 2010 :: 05:54
Печать  
Dmitry The Wing писал(а) 26. Ноября 2010 :: 02:10:
А вот ПриОткрытии может иметь любое число параметров ... во всех отчетах по регистрам в типовой ПУБ есть как минимум 1 параметр - флаг восстановления настроек.

Потому вопрос в том, как определить число параметров и их значения при перехвате, остается открытым!

Для отчетов/обработок ты можешь вызывать оригинальное событие, указав один доп.параметр. При этом не важно, есть ли у обработчика этого события этот параметр или нет, обработчик все равно будет вызван.
А вот для других форм нельзя указать доп.параметр.
Все это следует из реализации события ПриОткрытия штатным 1С.

ЗЫ перехватчик не добавляет параметры к родным событиям 1С и различных ВК!
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #9 - 26. Ноября 2010 :: 07:48
Печать  
сначала у меня тоже возникал вопрос с кол-вом параметров у разных типов объектов, потом подсмотрел код у более грамотных людей и теперь у меня примерно вот так:
Код
Выбрать все
//============================выполняет оригинальные события Контекста или ГМ и далее вызывает выполнение всех подписчиков
Функция ВыполнитьСобытиеКонт(ИмяСобытия, флГлобальное, асПараметры="", МенеджерСобытий, ПараметрыМенеджера="")
	Перехватчик = Перехватчик();

	ВЗ = 1;
	Если флГлобальное=1 Тогда
		Если Врег(Лев(ИмяСобытия,10))=Врег("СобытиеГМ_") Тогда
			ИмяСобытия = Сред(ИмяСобытия,11);
		КонецЕсли;
		ВЗ = ъекта", "обБлокировки");
		Если ВЗ=0 Тогда
			Возврат 0;
		КонецЕсли;
	Иначе
		Если Врег(Лев(ИмяСобытия,8))=Врег("Событие_") Тогда
			ИмяСобытия = Сред(ИмяСобытия,9);
		КонецЕсли;

		Если ПустоеЗначение(асПараметры)=0 Тогда
			//асПараметры //:АссоциативныйВектор
			КолПараметров = асПараметры.Количество();
			Если КолПараметров=0 Тогда
				ВЗ = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтекстФормы,ИмяСобытия);
			ИначеЕсли КолПараметров=1 Тогда
				ВЗ = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтекстФормы,ИмяСобытия, асПараметры.Получить(0));
			ИначеЕсли КолПараметров=2 Тогда
				ВЗ = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтекстФормы,ИмяСобытия, асПараметры.Получить(0), асПараметры.Получить(1));
			ИначеЕсли КолПараметров=3 Тогда
				ВЗ = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтекстФормы,ИмяСобытия, асПараметры.Получить(0), асПараметры.Получить(1), асПараметры.Получить(2));
			ИначеЕсли КолПараметров=4 Тогда
				ВЗ = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтекстФормы,ИмяСобытия, асПараметры.Получить(0), асПараметры.Получить(1), асПараметры.Получить(2), асПараметры.Получить(3));
			ИначеЕсли КолПараметров=5 Тогда
				ВЗ = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтекстФормы,ИмяСобытия, асПараметры.Получить(0), асПараметры.Получить(1), асПараметры.Получить(2), асПараметры.Получить(3), асПараметры.Получить(4));
			ИначеЕсли КолПараметров=6 Тогда
				ВЗ = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтекстФормы,ИмяСобытия, асПараметры.Получить(0), асПараметры.Получить(1), асПараметры.Получить(2), асПараметры.Получить(3), асПараметры.Получить(4), асПараметры.Получить(5));
			ИначеЕсли КолПараметров=7 Тогда
				ВЗ = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтекстФормы,ИмяСобытия, асПараметры.Получить(0), асПараметры.Получить(1), асПараметры.Получить(2), асПараметры.Получить(3), асПараметры.Получить(4), асПараметры.Получить(5), асПараметры.Получить(6));
			КонецЕсли;
		Иначе
			ВЗ = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтекстФормы,ИмяСобытия);
		КонецЕсли;
	КонецЕсли;

	ВЗ = ВЗ * ВыполнитьСобытиеМенеджеров(МенеджерСобытий, ПараметрыМенеджера);

	Возврат ВЗ;
КонецФункции // ВыполнитьСобытиеКонт

//*****************************************************
Функция Событие_ПриОткрытии(ФлагЧтенияНастройки) Экспорт
	//ТипОбъекта = РасширениеФормы.ТипОбъекта()
	Параметры = СоздатьОбъект("АссоциативныйВектор");
	ЕстьПараметры			= ?(Найти("|ВнешнийОтчет|Обработка|Отчет|","|"+ТипОбъекта+"|")=0,0,1);
	Если ЕстьПараметры=1 Тогда
		Параметры.Добавить(ФлагЧтенияНастройки);
	Иначе
	КонецЕсли;
	Менеджер = ДобавитьМенеджераСобытий(МенеджерСобытий() ,"ЛоггированиеИзменений", "Событие_ПриОткрытии");
	Возврат ВыполнитьСобытиеКонт("Событие_ПриОткрытии", 0, Параметры, Менеджер, Параметры);
КонецФункции// Событие_ПриОткрытии 

  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #10 - 29. Ноября 2010 :: 02:55
Печать  
JohnyDeath, все бы хорошо, но 1С не запрещает добавлять свои параметры в предопределенные функции.
Для большинства и типовых отчетов это сработает (спасибо, взял на заметку), но что если параметров будет больше?
Нужно все-таки найти способ определения числа параметров.
Сам добавлял в документах параметры в метод ПриЗаписи ... думаю, и в других найдется.

Кроме того, если перехват события используется - то вне зависимости от того, будет класс что-то делать или нет, вызвать родное событие необходимо, а это невозможно при отсутствии информации о числе параметров...
« Последняя редакция: 29. Ноября 2010 :: 05:00 - Dmitry The Wing »  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #11 - 29. Ноября 2010 :: 06:08
Печать  
Предопределенных событий не сильно много, а предопределенных с разным количеством параметров еще меньше. Поэтому один раз описать все ситуации не составит большого труда. Тем более сейчас тебе нужны не все события.
ПриЗаписи у меня реализовано аналогично:
Код
Выбрать все
//======================================================================
Функция Событие_ПриЗаписи(СписокПериодРекв) Экспорт
	//Сообщить("Зашли в при записи ");
	Параметры = СоздатьОбъект("АссоциативныйВектор");
	ЕстьПараметры		= ?(Найти("|ПланСчетов|Справочник|","|"+ТипОбъекта+"|")=0,0,1);
	Если ЕстьПараметры=0 Тогда
	Иначе
		Параметры.Добавить(СписокПериодРекв);
	КонецЕсли;
	Менеджер = ДобавитьМенеджераСобытий(МенеджерСобытий() ,"ЛоггированиеИзменений", "Событие_ПриЗаписи");
	Возврат ВыполнитьСобытиеКонт("Событие_ПриЗаписи", 0,Параметры,Менеджер,Параметры);
КонецФункции // Событие_ПриЗаписи 

  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #12 - 29. Ноября 2010 :: 06:13
Печать  
У меня ПриЗаписи примерно так же описано сейчас (в копии), но я точно знаю, что есть документы, где ПриЗаписи имеет 2 параметра... т.е. совсем нестандартное поведение документа ... именно потому я ищу способ определить количество параметров, чтобы не бояться всяких непредвиденных вариантов (заранее можно описать, например, 3-5 параметров, но передавать столько, сколько описано в форме).
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

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

1. Пример таких документов в студию, слабо верится Печаль
2. Каким образом вызывается данное событие? системой/1С или вручную, пользовательским кодом?

Dmitry The Wing писал(а) 29. Ноября 2010 :: 06:13:
именно потому я ищу способ определить количество параметров, чтобы не бояться всяких непредвиденных вариантов (заранее можно описать, например, 3-5 параметров, но передавать столько, сколько описано в форме).

Встроенный класс Информатор из 1С++ поможет Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #14 - 29. Ноября 2010 :: 07:00
Печать  
Мне тоже интересен документ с двумя параметрами.
  
Наверх
 
IP записан
 
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 &amp;&amp; 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 &amp;&amp; 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 записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Ошибка 4515 - Событие_ПриИзмененииРазмераОкна нарушает АктивизироватьОбъект
Ответ #30 - 02. Декабря 2010 :: 02:44
Печать  
Поскольку ответа по проблеме перехватчика, создал запись в багзилле.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #31 - 02. Декабря 2010 :: 05:19
Печать  
Пока что некогда заниматься 1С++ Печаль
Конец года, переносы баз 77/8.1 на 8.2
  

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #32 - 02. Декабря 2010 :: 05:20
Печать  
artbear писал(а) 02. Декабря 2010 :: 05:19:
Пока что некогда заниматься 1С++ Печаль
Конец года, переносы баз 77/8.1 на 8.2

Расскажи, как 7.7 на 8.2 переносишь? Или они все типовые?
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #33 - 02. Декабря 2010 :: 07:21
Печать  
Dmitry The Wing писал(а) 02. Декабря 2010 :: 05:20:
artbear писал(а) 02. Декабря 2010 :: 05:19:
Пока что некогда заниматься 1С++ Печаль
Конец года, переносы баз 77/8.1 на 8.2

Расскажи, как 7.7 на 8.2 переносишь? Или они все типовые?

77 у меня все доработки от типовых Бух 77, конечно Улыбка
Поэтому беру в руки КД + правила переноса из Бух 77 в Бух 2.0 и и с их помощью делаю собственные правила.
  

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #34 - 02. Декабря 2010 :: 07:24
Печать  
artbear писал(а) 02. Декабря 2010 :: 07:21:
77 у меня все доработки от типовых Бух 77, конечно Улыбка
Поэтому беру в руки КД + правила переноса из Бух 77 в Бух 2.0 и и с их помощью делаю собственные правила.

Я еще ни разу не пробовал переносить 7 на 8, но предполагаю, что наиболее сложным будет автоперенос периодики ... ведь принцип работы с такими значениями изменился в корне...
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #35 - 06. Декабря 2010 :: 06:53
Печать  
avgreen писал(а) 01. Декабря 2010 :: 11:32:
Кстати версию 1с++ приведи. А то это проблему Артур решил совсем недавно и в старых версиях действительно не работал СтатусВозврата(0)
Да я разобрался - действительно, недочитал документацию. Теперь все работает.
А версия - 3.2.2.0


Теперь другой трабл:
Есть класс - наследник от ТабличноеПоле.
Этот же класс, при инициализации, натравливается на форму, как перехватчик событий.
Само по себе - все работает Ок.

Дальше, есть второй класс - Привзяки (от dmitro), немного доработанный (опять же, на предмет того же - этот же класс натравливается на форму, как перехватчик событий).

И в том и в другом классе все выглядит примерно так:

Код
Выбрать все
Перем Перехватчик, ПредОбработчик, КонтекстФормы;

Процедура Инит() Экспорт
	...

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

Процедура Событие_ПриИзмененииРазмераОкна(ТипСобытия, Ширина, Высота) Экспорт
	...

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



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

Собственно, трабл в том, что объект, инициализированный вторым, события перехватывает, нормально знает предыдущий обработчик; но перенаправление на обработчик события первого объекта не происходит.

Поскольку документация написана несколько сумбурно - подозреваю, что я что-то делаю не так.

PS можно, конечно, ручками вызывать ПредОбработчик.Событие_...() - но это еще надо дополнительно следить, что этот метод там определен... А я, как любой программист, ленив. (А был бы не ленив - хрен бы я выносил функционал в классы. Лень - двигатель прогресса.)


Вот, из документации:
Цитата:
7. При необходимости вызова обработчиков событий, которые определены в контексте или в глобальном модуле, в обработчике события внутри пользовательского класса нужно использовать код

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

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

КонецПроцедуры

И там же:
Цитата:
ВыполнитьСобытиеГК / RunEventOfGroupContext

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

Возвращает: тип: Число - статус возврата модуля указанного контекста.
Параметры:
ОбработчикСобытияИлиПустоеЗначение - тип: класс 1С++ или пустое значение.
ГрупповойКонтекстФормы - тип: ГрупповойКонтекст.
ИмяСобытия - тип: Строка.

Описание: Вызывает соответствующий обработчик события контекста формы. Если обработчик не задан, просто выполняется вызов ВыполнитьОригинальноеСобытиеГК Если обработчик задан, то выполняется вызов соответствующего метода. Если метод является функцией, возвращает результат выполнения этой функции, иначе 1 Если метод не найден, возвращается 1 и не выдается сообщений об ошибках.


Параметры пробовал передавать и в том и в другом порядке.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #36 - 06. Декабря 2010 :: 07:04
Печать  
Посмотри класс УправлениеФормой - там реализованы привязки через Перехватчик.
http://www.1cpp.ru/forum/YaBB.pl?num=1278756052
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #37 - 06. Декабря 2010 :: 07:22
Печать  
Eprst писал(а) 06. Декабря 2010 :: 07:04:
Посмотри класс УправлениеФормой - там реализованы привязки через Перехватчик.
http://www.1cpp.ru/forum/YaBB.pl?num=1278756052

Объясни, пожалуйста, в чем здесь выигрыш? Чем это лучше обычных привязок реагированием на события?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #38 - 06. Декабря 2010 :: 07:55
Печать  
Да ни в чем, в простоте использования, разве что.
Не нужно все события описывать, используя обычный класс привязок.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #39 - 06. Декабря 2010 :: 07:57
Печать  
Eprst писал(а) 06. Декабря 2010 :: 07:04:
Посмотри класс УправлениеФормой - там реализованы привязки через Перехватчик.
http://www.1cpp.ru/forum/YaBB.pl?num=1278756052
Что-то я не понял, как тамошняя реализация коррелирует с моей проблемой.

На пальцах - суть моей проблемы:
Имеется форма, в которой инициализированы 2 объекта.
Каждый из объектов выступает перехватчиком событий формы.
Соответственно, при инициализации первого: он видит отсутствие текущего перехватчика - значит он после перехвата события, должен передавать вызов в контекст формы.
При инициализации второго: он видит, что назначен перехватчик и запоминает его. Далее, при возникновении события, сначала  его обрабатывает объект №2, в нем мы должны передать обработку на запомненный объект №1, а он уже - в контекст формы.

Вот этого я добиться не могу.
Когда перехватчик на форму только один - все работает.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #40 - 06. Декабря 2010 :: 08:04
Печать  
Что значит как ?
Там через класс перехватчика реализованы привязки формы.
Именно тот же лисапед, что и ты делаешь сейчас.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #41 - 06. Декабря 2010 :: 08:09
Печать  
Блин.
Дело было не в бобине(с).

Разобрался - заработало.

Однако, снова не все так просто - при передачи исполнения в  оригинальный обработчик в форме, получаю сообщение:
Цитата:
Перехватчик::ВыполнитьСобытиеКонтекста - Неверное число параметров у обработчика события <ПриИзмененииРазмераОкна>

Добавлять параметр-заглушку, чтоб количество параметров соответствовало числу параметров обработчика события глобального модуля, пробовал. Эффекта ноль
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #42 - 06. Декабря 2010 :: 08:11
Печать  
Eprst писал(а) 06. Декабря 2010 :: 08:04:
Что значит как ?
Там через класс перехватчика реализованы привязки формы.
Именно тот же лисапед, что и ты делаешь сейчас.

В третий раз.
Лисапед был не в реализации перехвата конкретного объекта.
А во взаимосвязи нескольких перехватчиков.

В указанном тобой классе (наборе классов) используется исключительно вызов оригинального события ГК.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #43 - 06. Декабря 2010 :: 08:12
Печать  
Цитата:
ПриИзмененииРазмераОкна


А тебе точно надо перехватывать это событие в классе перехватчика ?

Мот того, не нужен перехват этого события вообще ?
Что за специфические действия обрабатываешь в перехвате этого события ?

  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #44 - 06. Декабря 2010 :: 08:41
Печать  
Eprst писал(а) 06. Декабря 2010 :: 08:12:
Цитата:
ПриИзмененииРазмераОкна


А тебе точно надо перехватывать это событие в классе перехватчика ?


Не принципиально на каком событии отлаживать работу передачи исполнения.
В любом случае, уже со всем разобрался. Даже с числом параметров.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

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

Да и вообще, составить бы список всех событий, которые подвластны перехватчику.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #46 - 15. Декабря 2010 :: 08:32
Печать  
Satans Claws писал(а) 15. Декабря 2010 :: 08:21:
Вопрос - а Событие "ПослеОткрытия" перехватчик перехватывает?

Да и вообще, составить бы список всех событий, которые подвластны перехватчику.


Именно про это событие написано в справке ... а вообще - он перекрывает все предопределенное.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #47 - 15. Декабря 2010 :: 08:51
Печать  
Dmitry The Wing писал(а) 15. Декабря 2010 :: 08:32:
Satans Claws писал(а) 15. Декабря 2010 :: 08:21:
Вопрос - а Событие "ПослеОткрытия" перехватчик перехватывает?

Да и вообще, составить бы список всех событий, которые подвластны перехватчику.


Именно про это событие написано в справке ... а вообще - он перекрывает все предопределенное.


Тогда спрашивается, почему приходится писать такой из**б в форме, в которой перехватываю события:

Код
Выбрать все
Перем фПослеОткрытия;

Процедура ПослеОткрытия()
	Если ПустоеЗначение(фПослеОткрытия) = 1 Тогда
		фПослеОткрытия = 1;

		Перехватчик = СоздатьОбъект("Перехватчик");
		Обработчик = Перехватчик.ПолучитьПерехватчикСобытийГК(Контекст);
		Если ПустоеЗначение(Обработчик) = 0 Тогда
			Обработчик.Событие_ПослеОткрытия();
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры	// ПослеОткрытия
 



Общая схема работы организована таким образом:
Имеется несколько объектов, которым необходим перехват событий (ТабличноеПоле, Привязки).
Каждый из этих объектов дополнительно наследует от класса ТПерехватчик.
в классе ТПерехватчик для каждого события описан примерно следующий обработчик:
Код
Выбрать все
Функция Событие_ПриОтжатииКнопкиКлавиатуры(Код, Альт, Шифт, Ктрл, Символ, ФСО) Экспорт
	Возврат Перехватчик.ВыполнитьСобытиеГК(ПредОбработчик, КонтекстФормы, "ПриОтжатииКнопкиКлавиатуры", Код, Альт, Шифт, Ктрл, Символ, ФСО);
КонецФункции	// ПриОтжатииКнопкиКлавиатуры 



а в классах ТабличногоПоля и Привязок, в соотв. событиях после своих действий делается вызов
"Возврат атуры(Код, Альт, Шифт, Ктрл, Символ, ФСО);"

все работает, все замечательно.
Только после открытия не отрабатывает.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #48 - 15. Декабря 2010 :: 09:22
Печать  
Возможно, конечно, что трабл в том, в ПриОткрытии() создается объект привязок, перехватывающий события;
он перехватывает ПослеСозданияФормы (и тут же перенаправляет вызов в обработчик формы), где создается объект ТабличногоПоля, который так же перехватывает события.

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


1C++ rocks!

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

Т.е. в справку заглянуть религия не позволяет?
Во первых: это не предопределенное событие, а добавленное усилиями энтузиастов.
Во вторых: его надо отрабатывать несколько иначе (кстати, в этой теме уже обсуждалось).
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #50 - 15. Декабря 2010 :: 09:57
Печать  
Dmitry The Wing писал(а) 15. Декабря 2010 :: 09:46:
Т.е. в справку заглянуть религия не позволяет?
Во первых: это не предопределенное событие, а добавленное усилиями энтузиастов.
Во вторых: его надо отрабатывать несколько иначе (кстати, в этой теме уже обсуждалось).


1) справка прочитана и более того
2) Какой мой вопрос был? "Поддерживается ли конкретно это событие?" И связан он был именно с тем, что а) я знаю, что это событие формекса + б) наличию непонятного поведения в достаточно стройной структуре.
3) вот на счет обрабатывать иначе - в справке этого нет. Буду рыть тему.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #51 - 15. Декабря 2010 :: 10:13
Печать  
Похоже, я поторопился с "несколько иначе" - это касается только СобытиеГМ_ПриОткрытии, СобытиеГМ_ВводНового и СобытиеГМ_ВводНаОсновании, вместо которых рекомендовано использовать только СобытиеГМ_СозданиеКонтекста.
А Событие_ПослеОткрытия работает также как и Событие_ПриОткрытии - никакой разницы не наблюдается.
Другое дело, что перехват на форму я устанавливаю при перехвате СобытиеГМ_СозданиеКонтекста ... а у тебя (если я верно понял) перехват устанавливается в ПриОткрытии? - такой способ работы мною не пробован...
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #52 - 15. Декабря 2010 :: 10:25
Печать  
Я решил не греть голову с глобальными перехватчиками.

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


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

Попробую создать тестовую конфу, чтоб баг повторялся.
Если получится - выложу.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

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

Отчет 1 - отрабатывает нормальною
Отчет 2 - выявляет баг.
Должно выводить:
Цитата:
Форма:ПриОткрытии
Класс:ПослеСозданияФормы. ТПерехватчик1
Форма:ПослеСозданияФормы
Класс:ПослеОткрытия. ТПерехватчик2
Класс:ПослеОткрытия. ТПерехватчик1
Форма:ПослеОткрытияФормы

Выводит:
Цитата:
Форма:ПриОткрытии
Класс:ПослеСозданияФормы. ТПерехватчик1
Форма:ПослеСозданияФормы
Форма:ПослеОткрытияФормы



1спп 3.2.2.0
формекс 2.0.5.93бета
  

hooker_test.rar ( 5 KB | Загрузки )
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #54 - 16. Декабря 2010 :: 02:10
Печать  
Satans Claws писал(а) 15. Декабря 2010 :: 10:51:
Воспроизвел.

У меня конфа не взлетела с твоего MD:
Невосстановимая ошибка Базы данных
Код: -10
Ошибка открытия словаря Базы данных

Она, кстати, и синтаксический контроль не проходит...

Satans Claws писал(а) 15. Декабря 2010 :: 10:51:
1спп 3.2.2.0
формекс 2.0.5.93бета

Странная версия формекса... уже давно есть 2.0.5.101 от 10.09.2010
Да и 1с++ уже 3.2.3.х.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #55 - 16. Декабря 2010 :: 03:59
Печать  
Dmitry The Wing писал(а) 16. Декабря 2010 :: 02:10:
У меня конфа не взлетела с твоего MD:
Невосстановимая ошибка Базы данных
Код: -10
Ошибка открытия словаря Базы данных

Она, кстати, и синтаксический контроль не проходит...

Открыть, изменить любые метаданные (коммент конфы) сохранить, не?
А полный синтаксический контроль она естественно не пройдет - обругается на все хидеры классов Подмигивание

Цитата:
Странная версия формекса... уже давно есть 2.0.5.101 от 10.09.2010
Да и 1с++ уже 3.2.3.х.

Формекс апдейтнул (делал ролбэк на версию, на которой все работало на прошлой работе - а потом забыл сделать роллбэк роллбэка). Баг сохранился.
А вот 3.2.3.х в снапшотах нема. Откуда качать? Нашел. 3.2.3.8 - баг в наличии.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #56 - 16. Декабря 2010 :: 04:00
Печать  
Кстати, сегодняшний взгляд на трезвую голову намекает, что там не только ПослеОткрытия() - но и весь перехват идет лесом...
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #57 - 16. Декабря 2010 :: 06:31
Печать  
Пришлось отключить весь перехват форм из-за жалоб юзеров на частый вылет 1С при работе с отчетами.
Эксперименты показали, что вылет сохранялся до тех пор, пока не закомментарил начало перехвата, т.е. СобытиеГМ_СозданиеКонтекста.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

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

Кстати - вылетами и непонятными глюками практически всегда заканчивается попытка обращения к контексту формы, которая уже закрыта.

Учитывая, что перехватчику эти контексты необходимы как воздух - покури код, может где-то действуешь небезопасно и тыкаешься в уже разрушенную форму?
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #59 - 16. Декабря 2010 :: 07:03
Печать  
Самое странное то, что я не использую перехват событий формы. Добавил включение на будущее ... т.е. на данный момент единственное событие формы, которое перехватываю - это СобытиеГМ_СозданиеКонтекста.

Видимо, придется вернуться к использованию перехвата СобытиеГМ_ПриОткрытии.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #60 - 16. Декабря 2010 :: 07:08
Печать  
Dmitry The Wing писал(а) 16. Декабря 2010 :: 07:03:
Самое странное то, что я не использую перехват событий формы. Добавил включение на будущее ... т.е. на данный момент единственное событие формы, которое перехватываю - это СобытиеГМ_СозданиеКонтекста.

Видимо, придется вернуться к использованию перехвата СобытиеГМ_ПриОткрытии.

1. Кури свой код, явно что-то не так Печаль
Перехватчик используют достаточно много людей, проблемы с явными вылетами из-за ошибок реализации Перехватчика давно не выявлялись..
2. события с префиксом "СобытиеГМ_" - это не события формы, это глобальные события.
  

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #61 - 16. Декабря 2010 :: 07:21
Печать  
artbear писал(а) 16. Декабря 2010 :: 07:08:
1. Кури свой код, явно что-то не так Печаль

Вот список всего, что перехватывает основной перехватчик (Фабрика событий):
  • СобытиеГМ_ПриУдаленииДокумента
  • СобытиеГМ_ПриИзмененииВремениДокумента
  • СобытиеГМ_ПриОтменеПроведенияДокумента
  • СобытиеГМ_ПриЗавершенииРаботыСистемы
  • СобытиеГМ_Событие_НеобработаннаяОшибка
  • СобытиеГМ_Событие_ЗаписьСобытияЖурналаРегистрации
  • СобытиеГМ_Событие_ЗаписьПользовательскогоСобытияЖурналаРегистрации

Реально в работе используются только последние 4.
Глюки с отчетами появляются только при включении перехвата событий СобытиеГМ_СозданиеКонтекста или СобытиеГМ_ПриОткрытии.
Для пробы включал еще перехват событий:
  • Событие_ПриОткрытии
  • Событие_ПослеОткрытия
  • Событие_ПриЗаписи
  • Событие_ПриВыбореЗакладки
  • Событие_ПриИзмененииРазмераОкна
  • Событие_ПриЗакрытии

Все прекрасно работало, кроме глюка с позиционированием при включении перехвата Событие_ПриИзмененииРазмераОкна.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #62 - 16. Декабря 2010 :: 07:49
Печать  
Ну и попробуй понять, в какой момент 1С падает, потестируй, если есть желание.
Кроме тебя, ни у кого подобных вылетов в последнее время не отмечено Улыбка
  

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


1C++ rocks!

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

Оно падает при формировании отчета или при нажатии кнопки "настройка". Т.е. не зная, чего в тот момент происходит внутри - большего сказать не могу ...

При этом может успеть успешно сформироваться до десяти отчетов, но может упасть и на третьем...

Если отчеты не формировать вообще - обычно не падает в течении дня. Дольше я сессию не держу.

Еще меня смущает отсутствие вызовов деструктора перехватчика...
  
Наверх
 
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #64 - 16. Декабря 2010 :: 08:18
Печать  
Пользуюсь перехватчиком, почти всеми событиями, проблем не было.
Выложи тестовую конфигурацию.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #65 - 16. Декабря 2010 :: 08:22
Печать  
zk96 писал(а) 16. Декабря 2010 :: 08:18:
Пользуюсь перехватчиком, почти всеми событиями, проблем не было.
Выложи тестовую конфигурацию.

Боюсь, что это может зависеть от используемых отчетов, а типовые отчеты в тест запихать будет непросто.
Лучше я покажу свой код данного перехвата:
Код
Выбрать все
Процедура ВключитьПерехватСобытийГК(Конт = "") Экспорт
	Если ТипЗначенияСтр(Конт) = "ГрупповойКонтекст" Тогда
		КонтФормы = Конт;
	КонецЕсли;
	Перехватчик = СоздатьОбъект("Перехватчик");
	Перехватчик.ПерехватитьСобытияГК(КонтФормы, Контекст);
КонецПроцедуры  // ВключитьПерехватСобытийГК

Функция СобытиеГМ_СозданиеКонтекста(Конт) Экспорт
	Сам = Сам(Контекст);
	Рез = 1;

	Если ТипЗначенияСтр(Конт) <> "ГрупповойКонтекст" Тогда
		Возврат 1;
	КонецЕсли;

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

	Возврат Рез;
КонецФункции // СобытиеГМ_СозданиеКонтекста
 

Может так будет видна ошибка?
  
Наверх
 
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #66 - 16. Декабря 2010 :: 10:06
Печать  
А попробуй так.
  

_________002.ert ( 55 KB | Загрузки )
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #67 - 16. Декабря 2010 :: 12:39
Печать  
Кстати, тут у кого-то были ошибки, если события формы и события ГМ обрабатываются в одном классе, т.е. как у тебя.
Попробуй разнести по разным классам. У человека ошибки пропадали Улыбка

Лично я считаю, что это на самом деле должны быть разные классы, т.к. решаются разные задачи.
  

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #68 - 17. Декабря 2010 :: 02:01
Печать  
zk96 писал(а) 16. Декабря 2010 :: 10:06:
А попробуй так.

Уловил идею о лишнем создании экземпляра класса Перехватчик и об изменениях в методе ВключитьПерехватСобытийГК, однако изменения в СобытиеГМ_СозданиеКонтекста мне непонятны. Который из перехватчиков вернет ПолучитьПерехватчикСобытийГК?

artbear писал(а) 16. Декабря 2010 :: 12:39:
Кстати, тут у кого-то были ошибки, если события формы и события ГМ обрабатываются в одном классе, т.е. как у тебя.
Попробуй разнести по разным классам. У человека ошибки пропадали Улыбка

Лично я считаю, что это на самом деле должны быть разные классы, т.к. решаются разные задачи.

Суть идеи в том, что перехватом занимается один класс, но при этом он отвечает за раздачу событий всем подписчикам ... причем для каждой открываемой формы создается отдельный экземпляр этого класса (правда я так и не словил ни одного вызова деструктора - почему? - даже пытался снимать перехват в Событие_ПриЗакрытии).
Но идея с разделением услышана и будет опробована сразу после того, как начну перехватывать события формы, т.к. на данный момент они еще не перехватываются - только создание контекста...



Похоже, что разрулил.
1. Не надо доблировать класс фабрики, если он НЕ перехватывает события формы.
2. Класс перехвата событий формы просто обязан перехватывать события открытия и закрытия, контроллируя флаг возврата, т.к. в обоих событиях может возникнуть необходимость снятия перехвата и уничтожения объекта.

Пока проблем с отчетами не обнаружено... хотя стоит еще проверить позиционирование журнала - вдруг и это вылечилось...
Вылечилось! ... думаю, баг все-таки не стоит отменять, но его лечение оказалось простым - не надо путать перехват событий формы с глобальными!
« Последняя редакция: 17. Декабря 2010 :: 04:10 - Dmitry The Wing »  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #69 - 17. Декабря 2010 :: 05:36
Печать  
Dmitry The Wing писал(а) 17. Декабря 2010 :: 02:01:
Похоже, что разрулил.
2. Класс перехвата событий формы просто обязан перехватывать события открытия и закрытия, контроллируя флаг возврата, т.к. в обоих событиях может возникнуть необходимость снятия перехвата и уничтожения объекта.

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

Рад, что мой совет помог.

ИМХО ты не прав, говоря "класс перехвата просто обязан перехватывать события открытия и закрытия" Печаль
это совершенно необязательно Улыбка
Вместо перехвата события ПриОткрытии намного лучше юзать СобытиеГМ_СозданиеКонтекста и уже в нем устанавливать перехват на форму.

При закрытии формы перехват на нее снимается автоматом и если на объект-перехватчик больше нет ссылок, вызывается деструктор этого объекта.
Т.е. если после закрытия формы автоматом не вызвался деструктор перехватчика, значит, ищи где-то лишние ссылки Печаль
  

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #70 - 17. Декабря 2010 :: 06:34
Печать  
artbear писал(а) 17. Декабря 2010 :: 05:36:
Dmitry The Wing писал(а) 17. Декабря 2010 :: 02:01:
Похоже, что разрулил.
2. Класс перехвата событий формы просто обязан перехватывать события открытия и закрытия, контроллируя флаг возврата, т.к. в обоих событиях может возникнуть необходимость снятия перехвата и уничтожения объекта.

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

Рад, что мой совет помог.

ИМХО ты не прав, говоря "класс перехвата просто обязан перехватывать события открытия и закрытия" Печаль
это совершенно необязательно Улыбка
Вместо перехвата события ПриОткрытии намного лучше юзать СобытиеГМ_СозданиеКонтекста и уже в нем устанавливать перехват на форму.

При закрытии формы перехват на нее снимается автоматом и если на объект-перехватчик больше нет ссылок, вызывается деструктор этого объекта.
Т.е. если после закрытия формы автоматом не вызвался деструктор перехватчика, значит, ищи где-то лишние ссылки Печаль

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


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #71 - 17. Декабря 2010 :: 08:01
Печать  
2 Dmitry The Win
Если интересно, вот мой класс-перехватчик,которым я пользуюсь.
  

_______________001.rar ( 14 KB | Загрузки )
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #72 - 20. Декабря 2010 :: 02:16
Печать  
zk96 писал(а) 17. Декабря 2010 :: 08:01:
2 Dmitry The Win
Если интересно, вот мой класс-перехватчик,которым я пользуюсь.

ИМХО: Слишком много кода в глобальнике...
У меня там только 1 строка для фабрики-раздатчика событий:
Код
Выбрать все
ФабрикаСобытий = СоздатьОбъект("ФабрикаСобытий"); 


И по две на каждый перехватчик-подписчик:
Код
Выбрать все
ПерехватчикЖурналаРегистрации = СоздатьОбъект("ПерехватчикЖурналаРегистрации");
ПерехватчикЖурналаРегистрации.ПодписатьКлассНаСобытияФабрики(ФабрикаСобытий); 


Хотя вру Улыбка реально в глобальнике у меня только
Код
Выбрать все
	Если ФС.СуществуетФайл(КаталогИБ() + "ExtForms\start.ert") = 1 Тогда
		ОткрытьФорму("Отчет",, КаталогИБ()+"Extforms\start.ert");
	КонецЕсли; 


А все описанное выше - уже в соотверствующей обработке, ибо менять глобальник - дело неблагодарное...

Непонятно, почему у тебя объявлены практически все события, но СообщитьПодписчикам вызывается не во всех? Поясни...

Могу ошибаться, но: из кода видно, что КОП нерабочий, ибо вызов ВыполнитьОригинальноеСобытиеГК из Событие_ВводНового и Событие_ВводНаОсновании дублирует данное событие для документа (на справочнике не проверял), т.е. обработки документа ВводНового и ВводНаОсновании будут вызваны дважды ... сам обжигался...

Я не утверждаю, что класс в целом неправильный, но некоторые моменты совсем не стыкуются с тем, что видел на практике... включая тот момент, который заставил меня разбить перехват на два класса по совету artbear'а.
  
Наверх
 
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #73 - 20. Декабря 2010 :: 08:15
Печать  
2 Dmitry The Win
Dmitry The Wing писал(а) 20. Декабря 2010 :: 02:16:
ИМХО: Слишком много кода в глобальнике...
У меня там только 1 строка для фабрики-раздатчика событий:
Код
Выбрать все
ФабрикаСобытий = СоздатьОбъект("ФабрикаСобытий"); 


И по две на каждый перехватчик-подписчик:
Код
Выбрать все
ПерехватчикЖурналаРегистрации = СоздатьОбъект("ПерехватчикЖурналаРегистрации");
ПерехватчикЖурналаРегистрации.ПодписатьКлассНаСобытияФабрики(ФабрикаСобытий); 


Хотя вру Улыбка реально в глобальнике у меня только
Код
Выбрать все
	Если ФС.СуществуетФайл(КаталогИБ() + "ExtForms\start.ert") = 1 Тогда
		ОткрытьФорму("Отчет",, КаталогИБ()+"Extforms\start.ert");
	КонецЕсли; 


А все описанное выше - уже в соотверствующей обработке, ибо менять глобальник - дело неблагодарное...

Мне казалось, что так удобней.И контекст, на мой взгляд лучше получать явно,отдельным методом Но вынести в обработку очень хорошая идея.Спасибо.

Dmitry The Wing писал(а) 20. Декабря 2010 :: 02:16:
...
Непонятно, почему у тебя объявлены практически все события, но СообщитьПодписчикам вызывается не во всех? Поясни...

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

Dmitry The Wing писал(а) 20. Декабря 2010 :: 02:16:
Могу ошибаться, но: из кода видно, что КОП нерабочий, ибо вызов ВыполнитьОригинальноеСобытиеГК из Событие_ВводНового и Событие_ВводНаОсновании дублирует данное событие для документа (на справочнике не проверял), т.е. обработки документа ВводНового и ВводНаОсновании будут вызваны дважды ... сам обжигался...

Класс рабочий.
Может я в чем-то ошибаюсь, но в документации написано, что
ВыполнитьОригинальноеСобытиеГК вызывает обработчик события контекста формы, который опреден в модуле этой формы.Почему ты пишешь, что вызываеться дважды? Обьясни пожалуста.

Dmitry The Wing писал(а) 20. Декабря 2010 :: 02:16:
...который заставил меня разбить перехват на два класса по совету artbear'а.

Мне казалось, что в одном классе удобней обрабатывать, если конечно логика обработки не сильно отличается.

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #74 - 20. Декабря 2010 :: 08:39
Печать  
zk96 писал(а) 20. Декабря 2010 :: 08:15:
Dmitry The Wing писал(а) 20. Декабря 2010 :: 02:16:
Могу ошибаться, но: из кода видно, что КОП нерабочий, ибо вызов ВыполнитьОригинальноеСобытиеГК из Событие_ВводНового и Событие_ВводНаОсновании дублирует данное событие для документа (на справочнике не проверял), т.е. обработки документа ВводНового и ВводНаОсновании будут вызваны дважды ... сам обжигался...

Класс рабочий.
Может я в чем-то ошибаюсь, но в документации написано, что
ВыполнитьОригинальноеСобытиеГК вызывает обработчик события контекста формы, который опреден в модуле этой формы.Почему ты пишешь, что вызываеться дважды? Обьясни пожалуста.

Попробуй включить перехват СобытиеГМ_ВводНаОсновании и НЕ вызывать ВыполнитьОригинальноеСобытиеГК ... увидишь, что ввод на основании документов не сломается ... о чем это говорит? - о том, что ввод уже случился,а потом ты дополнительно насильно его повторяешь вызовом ВыполнитьОригинальноеСобытиеГК.

zk96 писал(а) 20. Декабря 2010 :: 08:15:
Dmitry The Wing писал(а) 20. Декабря 2010 :: 02:16:
...который заставил меня разбить перехват на два класса по совету artbear'а.

Мне казалось, что в одном классе удобней обрабатывать, если конечно логика обработки не сильно отличается.

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

zk96 писал(а) 20. Декабря 2010 :: 08:15:
Спасибо за критику. Всегда хорошо послушать мнение со стороны.

Это не столько критика, сколько обмен опытом, ибо сам с перехватчиком до конца разобрался только по мере развития темы...
  
Наверх
 
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #75 - 20. Декабря 2010 :: 18:07
Печать  
2 Dmitry The Wing
Dmitry The Wing писал(а) 20. Декабря 2010 :: 08:39:
...
Попробуй включить перехват СобытиеГМ_ВводНаОсновании и НЕ вызывать ВыполнитьОригинальноеСобытиеГК ... увидишь, что ввод на основании документов не сломается ... о чем это говорит? - о том, что ввод уже случился,а потом ты дополнительно насильно его повторяешь вызовом ВыполнитьОригинальноеСобытиеГК.
...

Вот здесь я не понимаю.
СобытиеГМ_ВводНаОсновании и СобытиеГМ_ВводНового я сейчас не использую, т.к. прочел здесь на форуме рекомендации использовать только СобытиеГМ_СозданиеКонтекста, а все остальное делать через события группового контекста.
Так вот, если я моем классе в методе Событие_ВводНаОсновании не вызывать ВыполнитьОригинальноеСобытиеГК, то ввод на основании не происходит.Если переделать процедуру Событие_ВводНаОсновании на функцию и возвращять 0, то до метода документа ВводНаОсновании даже не доходит.
Не понимаю, где двойной вызов. Пожалуста, обьясни, где у меня ошибка?
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #76 - 21. Декабря 2010 :: 02:14
Печать  
zk96 писал(а) 20. Декабря 2010 :: 18:07:
Вот здесь я не понимаю.
СобытиеГМ_ВводНаОсновании и СобытиеГМ_ВводНового я сейчас не использую, т.к. прочел здесь на форуме рекомендации использовать только СобытиеГМ_СозданиеКонтекста, а все остальное делать через события группового контекста.
Так вот, если я моем классе в методе Событие_ВводНаОсновании не вызывать ВыполнитьОригинальноеСобытиеГК, то ввод на основании не происходит.Если переделать процедуру Событие_ВводНаОсновании на функцию и возвращять 0, то до метода документа ВводНаОсновании даже не доходит.
Не понимаю, где двойной вызов. Пожалуста, обьясни, где у меня ошибка?

Извиняюсь, мои глазки меня подвели ... почему-то я увидел СобытиеГМ_ВводНаОсновании там, где реально было Событие_ВводНаОсновании. С ним все в порядке. То, что я имел в виду - особенность перехвата именно для СобытиеГМ_ВводНаОсновании и СобытиеГМ_ВводНового...
  
Наверх
 
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #77 - 21. Декабря 2010 :: 06:49
Печать  
2 Dmitry The Wing
Понял. Спасибо.



  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Перехватчик. Задан NameEng. Как найти NameRus?
Ответ #78 - 21. Января 2011 :: 02:38
Печать  
Словил неприятный эффект при перехвате Событие_ПриОткрытии при использовании в форме варианта OnOpen.
Событие срабатывает, но как вызвать оригинальное событие без явного использования этого варианта в коде?
Дело в том, что в этом случае функция информатора ПолучитьТаблицуМетодов не заполняет русский вариант имени метода...
Пока вижу только вариант с прописыванием обоих вариантом именования в коде, что не считаю правильным...

Кроме того, есть еще один подводный камень:
Для правильного вызова оригинального события необходимо определить число параметров метода. Если это делать поиском по ТЗ, то можно наткнуться на несоответствие регистра ... пока вижу только вариант:
  • Сначала ищется NameEng. Если найдено - возвращаем число параметров.
  • Ищется NameRus. Если найдено - возвращаем число параметров.
  • Перебор всей таблицы методов с построчным сравнением приведенных к одному регистру исходных значений и полей NameEng и NameRus таблицы методов. Если найдено - возвращаем число параметров.
  • Возвращаем 0. (Вызов ВыполнитьОригинальноеСобытиеГК пройдет успешно, т.к. метод в форме не описан)
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Задан NameEng. Как найти NameRus?
Ответ #79 - 21. Января 2011 :: 08:36
Печать  
Dmitry The Wing писал(а) 21. Января 2011 :: 02:38:
Словил неприятный эффект при перехвате Событие_ПриОткрытии при использовании в форме варианта OnOpen.
Событие срабатывает, но как вызвать оригинальное событие без явного использования этого варианта в коде?
Дело в том, что в этом случае функция информатора ПолучитьТаблицуМетодов не заполняет русский вариант имени метода...

Если возможно использование как русскоязычного, так и англоязычного наименования обработчика события, то можно использовать двойной вызов
сначала в коде пишем
Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтФормы, "ПриОткрытии", ...)
и сразу за ним
Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтФормы, "OnOpen", ...)
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Задан NameEng. Как найти NameRus?
Ответ #80 - 21. Января 2011 :: 08:38
Печать  
Dmitry The Wing писал(а) 21. Января 2011 :: 02:38:
Кроме того, есть еще один подводный камень:
Для правильного вызова оригинального события необходимо определить число параметров метода.

Если ты перехватил событие, ты уже знаешь контекст формы и можешь определить количество параметров, не обращаясь к Перехватчику вообще Улыбка - у каждого контекста свои обработчики и свои параметры.

  

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Задан NameEng. Как найти NameRus?
Ответ #81 - 21. Января 2011 :: 08:59
Печать  
artbear писал(а) 21. Января 2011 :: 08:38:
Dmitry The Wing писал(а) 21. Января 2011 :: 02:38:
Кроме того, есть еще один подводный камень:
Для правильного вызова оригинального события необходимо определить число параметров метода.

Если ты перехватил событие, ты уже знаешь контекст формы и можешь определить количество параметров, не обращаясь к Перехватчику вообще Улыбка - у каждого контекста свои обработчики и свои параметры.

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

P.S.: Скорее даже не за красотой, а читабельностью кода...



artbear писал(а) 21. Января 2011 :: 08:36:
Dmitry The Wing писал(а) 21. Января 2011 :: 02:38:
Словил неприятный эффект при перехвате Событие_ПриОткрытии при использовании в форме варианта OnOpen.
Событие срабатывает, но как вызвать оригинальное событие без явного использования этого варианта в коде?
Дело в том, что в этом случае функция информатора ПолучитьТаблицуМетодов не заполняет русский вариант имени метода...

Если возможно использование как русскоязычного, так и англоязычного наименования обработчика события, то можно использовать двойной вызов
сначала в коде пишем
Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтФормы, "ПриОткрытии", ...)
и сразу за ним
Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтФормы, "OnOpen", ...)

Это верно, но в некоторых случаях необходимо предусмотреть возможно разное число параметров, а метода кроме
Код
Выбрать все
		Если ЧислоПараметров = 0 Тогда
			Рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтОбъекта, ИмяСобытия);
		ИначеЕсли ЧислоПараметров = 1 Тогда
			Рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтОбъекта, ИмяСобытия, Парам1);
		ИначеЕсли ЧислоПараметров = 2 Тогда
			Рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтОбъекта, ИмяСобытия, Парам1, Парам2);
		КонецЕсли; 

пока не вижу ... если еще и имена туда совать - как-то совсем громоздко выходит.

Необходимость проверки числа параметров вытекает из того, что в ВыполнитьОригинальноеСобытиеГК необходимо передавать ПРАВИЛЬНОЕ число параметров, ни больше, ни меньше...
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Задан NameEng. Как найти NameRus?
Ответ #82 - 21. Января 2011 :: 09:04
Печать  
Dmitry The Wing писал(а) 21. Января 2011 :: 08:59:
artbear писал(а) 21. Января 2011 :: 08:38:
Dmitry The Wing писал(а) 21. Января 2011 :: 02:38:
Кроме того, есть еще один подводный камень:
Для правильного вызова оригинального события необходимо определить число параметров метода.

Если ты перехватил событие, ты уже знаешь контекст формы и можешь определить количество параметров, не обращаясь к Перехватчику вообще Улыбка - у каждого контекста свои обработчики и свои параметры.

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

P.S.: Скорее даже не за красотой, а читабельностью кода...

А зачем искать в ТЗ конкретного модуля? я же говорю, не нужно получать инфу об уже имеющихся обработчиках в модуля конкретной формы.
У тебя есть метаданные, они известны еще до начала работы Предприятия, на этапе разработки, из них и контекста формы (типа контекста формы) нужно получать данные о количестве параметров + использовать двуязычный вызов оригинального события.
  

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Задан NameEng. Как найти NameRus?
Ответ #83 - 21. Января 2011 :: 09:06
Печать  
artbear писал(а) 21. Января 2011 :: 09:04:
А зачем искать в ТЗ конкретного модуля? я же говорю, не нужно получать инфу об уже имеющихся обработчиках в модуля конкретной формы.
У тебя есть метаданные, они известны еще до начала работы Предприятия, на этапе разработки, из них и контекста формы (типа контекста формы) нужно получать данные о количестве параметров + использовать двуязычный вызов оригинального события.

Поясни. пока ничего не понял.

Предопределенное событие ПриОткрытии может иметь любое число параметров (в своей конфе я нашел от 0 до 2) ... как я могу из метаданных получить это число, без обращения к конкретному контексту?
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Задан NameEng. Как найти NameRus?
Ответ #84 - 21. Января 2011 :: 09:06
Печать  
Dmitry The Wing писал(а) 21. Января 2011 :: 08:59:
Это верно, но в некоторых случаях необходимо предусмотреть возможно разное число параметров, а метода кроме
Код
Выбрать все
		Если ЧислоПараметров = 0 Тогда
			Рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтОбъекта, ИмяСобытия);
		ИначеЕсли ЧислоПараметров = 1 Тогда
			Рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтОбъекта, ИмяСобытия, Парам1);
		ИначеЕсли ЧислоПараметров = 2 Тогда
			Рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтОбъекта, ИмяСобытия, Парам1, Парам2);
		КонецЕсли; 

пока не вижу ... если еще и имена туда совать - как-то совсем громоздко выходит.

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

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Задан NameEng. Как найти NameRus?
Ответ #85 - 21. Января 2011 :: 09:09
Печать  
artbear писал(а) 21. Января 2011 :: 09:06:
Dmitry The Wing писал(а) 21. Января 2011 :: 08:59:
Это верно, но в некоторых случаях необходимо предусмотреть возможно разное число параметров, а метода кроме
Код
Выбрать все
		Если ЧислоПараметров = 0 Тогда
			Рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтОбъекта, ИмяСобытия);
		ИначеЕсли ЧислоПараметров = 1 Тогда
			Рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтОбъекта, ИмяСобытия, Парам1);
		ИначеЕсли ЧислоПараметров = 2 Тогда
			Рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтОбъекта, ИмяСобытия, Парам1, Парам2);
		КонецЕсли; 

пока не вижу ... если еще и имена туда совать - как-то совсем громоздко выходит.

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

Но для определения числа параметров все равно необходимо перебрать весь список методов, если разработчик "некрасиво" описал обработчик события (не в том регистре буковки). А при таком поиске имя определяется автоматически - потому второй вызов теряет смысл...
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Задан NameEng. Как найти NameRus?
Ответ #86 - 21. Января 2011 :: 13:50
Печать  
Dmitry The Wing писал(а) 21. Января 2011 :: 09:09:
Но для определения числа параметров все равно необходимо перебрать весь список методов, если разработчик "некрасиво" описал обработчик события (не в том регистре буковки). А при таком поиске имя определяется автоматически - потому второй вызов теряет смысл...

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

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Задан NameEng. Как найти NameRus?
Ответ #87 - 24. Января 2011 :: 02:02
Печать  
artbear писал(а) 21. Января 2011 :: 13:50:
Dmitry The Wing писал(а) 21. Января 2011 :: 09:09:
Но для определения числа параметров все равно необходимо перебрать весь список методов, если разработчик "некрасиво" описал обработчик события (не в том регистре буковки). А при таком поиске имя определяется автоматически - потому второй вызов теряет смысл...

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

Ранее в этой теме уже говорилось о том, что у меня перехват всех событий любых форм ведется одним универсальным классом перехвата, и только после этого уже раздается подписчикам. Т.е. нет перехвата только конкретного набора форм - перехватываются все, только не все обрабатываются. Однако, оригинальную версию вызвать надо, а для этого и требуется знать число параметров...
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Хотелось бы все-таки решить проблему с Событие_ПриИзмененииРазмераОкна
Ответ #88 - 25. Января 2011 :: 09:13
Печать  
Dmitry The Wing писал(а) 30. Ноября 2010 :: 04:18:
Вложена MD тестовой конфы.
Порядок тестирования:
  • В папке конфы следует создать папку ВК и положить туда 1CPP.dll (3.2.3.1) и FormEx.dll (2.0.5.101).
  • Открыть конфу в конфигураторе, что-нибудь поправить и сохранить - появятся файлы конфы.
  • Открыть общий журнал, создать пару документов и провести - важно, чтобы их было больше одного, ибо как иначе проверить позиционирование?
  • Открыть отчет (он там один), сформировать и кликнуть по любому номеру документа - произойдет открытие журнала и ... ожидается позиционирование на документе, которого не происходит (выбирайте не первый документ, на первый оно попадает до позиционирования).

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

Изменения с тех пор небольшие: Переват разделен на глобальный и контекстный, следовательно комментировать надо функцию Событие_ПриИзмененииРазмераОкна класса ФабрикаСобытийФормы. Версия 1с++ использовалась уже 3.2.3.8.

Поправил запись в багзилле.
  

test_hook_001.zip ( 14 KB | Загрузки )
Наверх
 
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #89 - 25. Января 2011 :: 19:10
Печать  
2 Dmitry The Wing
Активизируй документ в журнале ПослеСозданияФормы.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #90 - 26. Января 2011 :: 01:56
Печать  
zk96 писал(а) 25. Января 2011 :: 19:10:
2 Dmitry The Wing
Активизируй документ в журнале ПослеСозданияФормы.

Проверил. Это работает, однако это обход проблемы, а не ее исправление...
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #91 - 26. Января 2011 :: 12:39
Печать  
Интересное замечание:

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

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

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



Выделенная Попытка-Исключение нужны, чтоб отсечь вылет, если групповой контекст представляет собой не открытую форму документа, а контекст модуля проведения документа
(в этом случае Перехватчик.ПерехватитьСобытияГК() становится плохо).
А есть ли еще какой-нить способ различить эти 2 типа групповых контекстов?

PS я знаю, что у меня есть идеологическая ошибка в использовании перехватчика. Если придет время, когда я всерьез примусь за документы - будет большой рефакторинг классов. ОЧЕНЬ большой. Улыбка
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #92 - 17. Февраля 2011 :: 06:47
Печать  
Код
Выбрать все
Функция Событие_ОбработкаПроведения(КонтДок, ПарамПроведения) Экспорт
	ЗапросСКЛ.УстановитьТекстовыйПараметр("Документ", КонтДок.ТекущийДокумент());
	ЗапросСКЛ.УстановитьТекстовыйПараметр("Статус", 0);
	идСтроки = ЗапросСКЛ.ВыполнитьСкалярный(тзп_ПроведениеНачало);

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

	ЗапросСКЛ.УстановитьТекстовыйПараметр("Результат", Рез);
	ЗапросСКЛ.УстановитьТекстовыйПараметр("идСтроки", идСтроки);
	ЗапросСКЛ.Выполнить(тзп_ПроведениеКонец);

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



В таблицу статистики пишу некоторую информацию при проведении и отмене проведения.
Все бы хорошо, но выяснилось (ВНЕЗАПНО, ага), что если рез = 0, то таблица статистики вторым запросом апдейтится, а потом 1Ска делает rollback транзакции. (что, в принципе, естественно - просто об этом в момент написания данной функции я как-то не сообразил).
Но желание накапливать информацию о неудачных попытках проведения есть.
Я так понимаю, что для этого нужно не-родное соединение с 1Ской (но тогда получим затык при монопольном проведении).
Внимание, вопрос - можно ли как-то разрулить ситуацию?
Может, есть события "ПередПроведением"/"ПослеПроведения"?
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #93 - 17. Февраля 2011 :: 09:35
Печать  
Используй асинхронный вызов нужного тебе кода, например. через посылку внешнего события или через Таймер (ФормЕкс).
Т.е. если рез = 0, то посылаешь событие с минимальным таймаутом и твой обработчик вызовется уже после отмены проведения.

ЗЫ На всякий случай проверь работу таймаута при групповом перепроведении документов.
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #94 - 17. Февраля 2011 :: 09:38
Печать  
Satans Claws писал(а) 26. Января 2011 :: 12:39:
Интересное замечание:

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

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

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



Выделенная Попытка-Исключение нужны, чтоб отсечь вылет, если групповой контекст представляет собой не открытую форму документа, а контекст модуля проведения документа
(в этом случае Перехватчик.ПерехватитьСобытияГК() становится плохо).
А есть ли еще какой-нить способ различить эти 2 типа групповых контекстов?

PS я знаю, что у меня есть идеологическая ошибка в использовании перехватчика. Если придет время, когда я всерьез примусь за документы - будет большой рефакторинг классов. ОЧЕНЬ большой. Улыбка

Можно через Информатор проверить, если ли реквизит Форма у Контекста. в этом случае блок Попытка не нужен.

ЗЫ а вообще, конечно, лучше классы по целям разделять, т.е. не должен один класс/один объект обрабатывать перехват как событий формы, так и событий проведения или ГМ Улыбка Про это ты уже в курсе.
  

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


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #95 - 17. Февраля 2011 :: 09:46
Печать  
artbear писал(а) 17. Февраля 2011 :: 09:35:
Используй асинхронный вызов нужного тебе кода, например. через посылку внешнего события или через Таймер (ФормЕкс).
Т.е. если рез = 0, то посылаешь событие с минимальным таймаутом и твой обработчик вызовется уже после отмены проведения.

ЗЫ На всякий случай проверь работу таймаута при групповом перепроведении документов.


Ухххх, блин - тогда при Рез = 0 надо будет сначала выдрать инсертнутые данные, а потом (вместо апдейта) целиком инсертнуть подготовленную строку.

На самом деле, есть еще вариант выполнять запросы отдельным соединением, а таблицу хранить в соседней базе.
Учитывая наличие "заботливо" прикрученного прошлым программистом ТойСКЛ - наверное, даже особо извращаться не придется.
Правда, кажется, в монопольном режиме Той использует родное соединение - но монопольный режим используется крайне-крайне-крайне редко (т.е. практически никогда).


Цитата:
Можно через Информатор проверить, если ли реквизит Форма у Контекста. в этом случае блок Попытка не нужен.

ЗЫ а вообще, конечно, лучше классы по целям разделять, т.е. не должен один класс/один объект обрабатывать перехват как событий формы, так и событий проведения или ГМ Улыбка Про это ты уже в курсе.

Про информатор не догадался, ага.

А про классы - знаю, да. Там надо хорошенько сесть и продумать структуру классов.
Ибо а) должен быть управляющий класс, который создается как в форме, так и в модуле (в которм всякие алгоритмы проверок заполнения, ввода на основании и ты ды) и в виде
Код
Выбрать все
оДок = СоздатьОбъект("ТДокумент.<вид>");
оДок.НазначитьКонтекст(СоздатьОбъект("Документ.<Вид>")); 

который наследует от общего ТДокумент; и б) должен быть класс-перехватчик, который на штатные события (ВводНового(), ВводНаОсновании(), ПриЗаписи()) вызывал бы соответствующие методы управляющего класса. Ну и при этом количество копипастного кода должно быть минимальным.
В целом, оно примерно понятно, как все должно быть. Но в тот момент, когда это писалось, с перехватчиком только начал разбираться... в общем - получилось так, как получилось. Ркуи дойдут - сделаю большой рефакторинг структуры классов.


PS с этой багой еще не разбирался? http://www.1cpp.ru/bugs/show_bug.cgi?id=4524
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #96 - 17. Февраля 2011 :: 12:11
Печать  
Satans Claws писал(а) 17. Февраля 2011 :: 09:46:
PS с этой багой еще не разбирался? http://www.1cpp.ru/bugs/show_bug.cgi?id=4524

Нет, все силы уходят на 8-ку.
  

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Перехватчик. ВыполнитьОригинальноеСобытиеГК. Нет информации об ошибке.
Ответ #97 - 24. Февраля 2011 :: 04:57
Печать  
Обнаружен глобальный косяк в функции ВыполнитьОригинальноеСобытиеГК!
Если в оригинальном обработчике возникла ошибка - перехватчик об этом не узнает, а это вызывает зависание при перехвате событий типа "ПриЗакрытии", т.е. невозможно закрыть форму.
Мною предполагалось, что возможен
Код
Выбрать все
	Если Рез > 0 Тогда
		Попытка
			Рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтОбъекта, "ПриЗакрытии");
		Исключение
			Сообщить("Ошибка при вызове оригинального события ПриЗакрытии: " + ОписаниеОшибки());
			Рез = 1;
		КонецПопытки;
	КонецЕсли; 


Однако, исключения нет. есть только сообщение: Цитата:
Возникла ошибка в оригинальном обработчике события ПриЗакрытии

Вопрос: я что-то делаю не так? или это глобальный баг?
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #98 - 24. Февраля 2011 :: 11:10
Печать  
В общем-то, это известная вещь - если в процедуре "ПриЗакрытии" возникает необработанное исключение - то закрыть форму становится невозможно.


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

А должен ли он делать throw exception наружу - это, конечно, вопрос.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #99 - 29. Августа 2011 :: 08:08
Печать  
Satans Claws писал(а) 17. Февраля 2011 :: 06:47:
В таблицу статистики пишу некоторую информацию при проведении и отмене проведения.
Все бы хорошо, но выяснилось (ВНЕЗАПНО, ага), что если рез = 0, то таблица статистики вторым запросом апдейтится, а потом 1Ска делает rollback транзакции. (что, в принципе, естественно - просто об этом в момент написания данной функции я как-то не сообразил).
Но желание накапливать информацию о неудачных попытках проведения есть.



Код
Выбрать все
Функция Событие_ОбработкаПроведения(КонтДок, ПарамПроведения) Экспорт
	Старт = ЗапросСКЛ.ВыполнитьСкалярный("SELECT convert(Char(23), GetDate(), 126)");

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

	Если Рез = 0 Тогда
		ЗапросСКЛ.Выполнить("Rollback Tran");
	КонецЕсли;

	ЗапросСКЛ.УстановитьТекстовыйПараметр("Документ", КонтДок.ТекущийДокумент());
	ЗапросСКЛ.УстановитьТекстовыйПараметр("Старт", Старт);
	ЗапросСКЛ.УстановитьТекстовыйПараметр("Статус", Рез);
	ЗапросСКЛ.ВыполнитьСкалярный(тзп_ПроведениеКонец);
	Если Рез = 0 Тогда
		ЗапросСКЛ.Выполнить("Commit Tran");
	КонецЕсли;

	глМенеджерСобытийДокументов.ПослатьСобытие(КонтДок, "Запись");

	Возврат Рез;
КонецФункции	// Событие_ОбработкаПроведения
 



Вроде, работает как нужно.
Внимание - вопрос: какие грабли я мог не заметить?

Проведение нового документа проверил - как минимум, не вылетает и обходится без веселых шизофрений (как, например, если открыть в событии ПриЗаписи() транзакцию, внутри тразакции сказать Записать(), а потом сделать откат транзации).
Единственно, что не могу сообразить: как штатно ведет себя 1Ска, если в новом документе нажимаем Провести, а в проведении возникает СтатусВозврата = 0;

У меня документ получается записан, не проведен.
В штатной 1С8 в такой ситуации он остается новым.
В штатных клюшках - ???
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #100 - 29. Августа 2011 :: 08:20
Печать  
При нажатии "Провести" выполняются две операции: Записать и Провести. Видимо, статус возврата влияет только на вторую.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #101 - 29. Августа 2011 :: 09:06
Печать  
Dmitry The Wing писал(а) 29. Августа 2011 :: 08:20:
При нажатии "Провести" выполняются две операции: Записать и Провести. Видимо, статус возврата влияет только на вторую.

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #102 - 29. Августа 2011 :: 09:12
Печать  
Вдогонку: в восьмерке нет отдельной операции проведения - там это часть операции записи.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #103 - 29. Августа 2011 :: 09:39
Печать  
Тоже верно.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #104 - 30. Августа 2011 :: 07:53
Печать  
Satans Claws писал(а) 29. Августа 2011 :: 09:06:
Dmitry The Wing писал(а) 29. Августа 2011 :: 08:20:
При нажатии "Провести" выполняются две операции: Записать и Провести. Видимо, статус возврата влияет только на вторую.

Ну, все сходится к тому.
Значит, можно выпускать в релиз.

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

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


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #105 - 31. Августа 2011 :: 03:17
Печать  
artbear писал(а) 30. Августа 2011 :: 07:53:
Как-то видел сообщение на форуме, что есть какие-то ошибки при проведении или отмене проведения, типа документ не провелся, а проводки сели, или наоборот.
кто-то говорил, что есть баг, кто-то говорил,что все решается.
Поищи по форуму
или кто-то из помнящих эту историю поделится своими мыслями.


Видел, да (стараюсь все темы по перехватчику отслеживать).
По моему, там у человека была форменная НЁХ.
  
Наверх
 
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #106 - 30. Сентября 2011 :: 18:47
Печать  
artbear писал(а) 30. Августа 2011 :: 07:53:
Satans Claws писал(а) 29. Августа 2011 :: 09:06:
Dmitry The Wing писал(а) 29. Августа 2011 :: 08:20:
При нажатии "Провести" выполняются две операции: Записать и Провести. Видимо, статус возврата влияет только на вторую.

Ну, все сходится к тому.
Значит, можно выпускать в релиз.

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

Если имеется ввиду вот этот баг http://www.1cpp.ru/bugs/show_bug.cgi?id=4238 то ты-же его благополучно закрыл - за что огромное спасибо! Улыбка
Но таки да, помню эту ветку, там пытались все это решить весьма извращенными способами - но так ничего и не вышло пока ты не убрал этот баг в самой компоненте
  
Наверх
ICQ  
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #107 - 30. Мая 2012 :: 10:15
Печать  
Вопрос. Если при перехвате события, например Событие_ПриВыбореСтроки(), в оригинальном событии в разных местах разное число параметров, то в событии Перехватчика нужно указать их максимальное количество?
Т.е. к примеру в одном месте

ПриВыбореСтроки(Парам1),

а в другом

ПриВыбореСтроки(Парам1, Парам2)

то в Перехватчике нужно прописать как

Событие_ПриВыбореСтроки(Парам1, Парам2)?
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #108 - 30. Мая 2012 :: 11:57
Печать  
нет.
Нужно в зависимости от контекста вызывать свой метод с нужным числом параметров - иначе нарвешься на ошибку.
  
Наверх
 
IP записан
 
an2
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 43
Зарегистрирован: 23. Марта 2012
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #109 - 30. Мая 2012 :: 11:58
Печать  
Я указываю максимальное количество параметров.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #110 - 30. Мая 2012 :: 12:00
Печать  
примерчик, для понимания:

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

	Если (ТипОбъекта="Отчет")или (ТипОбъекта="Обработка")Или(ТипОбъекта = "ВнешнийОтчет") Тогда
		Возврат тройки);
	Иначе
		Возврат Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтФормы,"ПриОткрытии");
	КонецЕсли;
КонецФункции 

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


1C++ rocks!

Сообщений: 43
Зарегистрирован: 23. Марта 2012
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #111 - 30. Мая 2012 :: 12:03
Печать  
У тебя неоднозначный вопрос. Поэтому получается два разных ответа.

Например как делал я:
Функция ПриЗаписи(СписокПериодРекв="") Экспорт
     Если ЕстьВГК.ПриЗаписи = 1 Тогда
           Если ЭтоСправочник = 1 Тогда
                 Если глПерехватчик.ВыполнитьСобытиеГК(,ГК,"ПриЗаписи",СписокПериодРекв) = 0 Тогда
                       Статус = 0;
                 КонецЕсли;
           Иначе
                 Если глПерехватчик.ВыполнитьСобытиеГК(,ГК,"ПриЗаписи",) = 0 Тогда
                       Статус = 0;
                 КонецЕсли;
           КонецЕсли;
     КонецЕсли;
     
     ВыбратьСобытие("ПриЗаписи");
     Пока итМенеджер.ПолучитьСтроку("Событие") = 1 Цикл
           Если итМенеджер.ИмяКОП = "Справочник" Тогда
                 Если итМенеджер.КОП.ПриЗаписи(СписокПериодРекв) = 0 Тогда
                       Статус = 0;
                 КонецЕсли;
           Иначе
                 Если итМенеджер.КОП.ПриЗаписи() = 0 Тогда
                       Статус = 0;
                 КонецЕсли;
           КонецЕсли;
     КонецЦикла;
     Возврат Статус;
КонецФункции
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #112 - 30. Мая 2012 :: 12:06
Печать  
Eprst, вопрос в том, как прописать саму процедуру Событие_ПриОткрытии(). У тебя сейчас прописан один параметр ФлагЧтенияНастройки. А если где-то (гипотетически) оригинальное событие прописано с двумя параметрами? Как прописывать обработчик? Как Событие_ПриОткрытии(ФлагЧтенияНастройки, Парам2) - так?

То, что дальше нужно делать вызов оригинального события с разным указанием параметров - это понятно.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #113 - 30. Мая 2012 :: 12:11
Печать  
Еще какая-то ерунда происходит с обработкой событий.

У меня в одном классе обработка и Глобальных и Контекстных событий.

При включении перехвата события Событие_ПриВыбореСтроки() перестала работать обработка события СобытиеГМ_Событие_ЗаписьСобытияЖурналаРегистрации.
Заметил так. Открываю журнал документов. Даблклик в списке на документе - срабатывает Событие_ПриВыбореСтроки() и далее СобытиеГМ_ПриОткрытии(). А если Событие_ПриВыбореСтроки() отключить - тогда перед СобытиеГМ_ПриОткрытии() нормально отрабатывает событие записи в журнал.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
an2
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 43
Зарегистрирован: 23. Марта 2012
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #114 - 30. Мая 2012 :: 12:21
Печать  
Лично я так понял, что мухи должны быть отдельно а котлеты отдельно.

Есть 3 типа перехватываемых событий

1 События глобального модуля.
2 События Группового контекста.
3 События проведения.

У меня на каждый тип событий свой класс.
Почему?
Потому, что События Группового контекста удобнее собирать персональным для каждого контекста сборщиком.
А события глобального модуля и события проведения удобнее собирать одним.
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #115 - 30. Мая 2012 :: 12:33
Печать  
Пробовал разнести в разные классы. Не получилось - событие записи в журнал не перехватывается (именно в том случае, как описал выше, в остальных - перехватывается).
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
an2
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 43
Зарегистрирован: 23. Марта 2012
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #116 - 30. Мая 2012 :: 12:41
Печать  
Попробовал
У меня тоже СобытиеГМ_Событие_ЗаписьСобытияЖурналаРегистрации не перехватывается.

У меня вызов нарисован прямо в глобальном Событие_ЗаписьСобытияЖурналаРегистрации
это событие работает.
  
Наверх
 
IP записан
 
an2
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 43
Зарегистрирован: 23. Марта 2012
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #117 - 30. Мая 2012 :: 12:55
Печать  
Методом чтения документации и научного тыка вывел:
Работает если выполняем действия в таком порядке:

// Фигня
//ФабрикаСобытийГМ = СоздатьОбъект("ПерехватчикГМ");

// Так правильней:
глПерехватчик=СоздатьОбъект("Перехватчик");
ФабрикаСобытийГМ = СоздатьОбъект("Мой_КОП_Выполняющий_Роль_ФабрикиСобытийГМ");
глПерехватчик.ПерехватитьСобытияГлобальногоМодуля(ФабрикаСобытийГМ);
глПерехватчик.ПодключитьСобытие_ЗаписьСобытияЖурналаРегистрации();
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #118 - 30. Мая 2012 :: 12:56
Печать  
Да, в глобально модуле событие отлавливается. Я вообще изначально это событие записи в журнал регистрации в глобальнике прописывал, а когда вплотную стал разбираться с Перехватчиком и классом обработки событий, то и запихнул в этот класс все события, включая запись в журнал.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #119 - 30. Мая 2012 :: 12:59
Печать  
ПерехватчикГМ - это имя твоего класса? Если да, то я так и делаю. В ПриНачалеРаботыСистемы()
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
an2
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 43
Зарегистрирован: 23. Марта 2012
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #120 - 30. Мая 2012 :: 13:00
Печать  
Да
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #121 - 30. Мая 2012 :: 13:19
Печать  
alyuev писал(а) 30. Мая 2012 :: 12:11:
Еще какая-то ерунда происходит с обработкой событий.

У меня в одном классе обработка и Глобальных и Контекстных событий.

При включении перехвата события Событие_ПриВыбореСтроки() перестала работать обработка события СобытиеГМ_Событие_ЗаписьСобытияЖурналаРегистрации.
Заметил так. Открываю журнал документов. Даблклик в списке на документе - срабатывает Событие_ПриВыбореСтроки() и далее СобытиеГМ_ПриОткрытии(). А если Событие_ПриВыбореСтроки() отключить - тогда перед СобытиеГМ_ПриОткрытии() нормально отрабатывает событие записи в журнал.



Да, по максимуму параметров.
ЗЫ: событием ГМ_ПриОткрытии не пользуюсь и тебе не советую
Улыбка

На сколько я понял, у тебя все события в 1 классе - и глобальника и формы.
События формы перехватывай не в ГМ_ПриОткрытии а в
СобытиеГМ_СозданиеКонтекста(Конт)... и будет тебе счастье.
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #122 - 30. Мая 2012 :: 13:22
Печать  
Заменял ПриОткрытии на СобытиеГМ_СозданиеКонтекста - та же фигня с записью в журнал. Так что не в этом дело. Видимо где-то глубже проблема.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
an2
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 43
Зарегистрирован: 23. Марта 2012
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #123 - 30. Мая 2012 :: 13:27
Печать  
Не верь ему. Он злой и тебя обманывает.

Привожу пример (с сокращениями) из своего класса - перехватчика событий глобального модуля

//**********************************
Функция СобытиеГМ_СозданиеКонтекста(Конт) Экспорт
     РасширитьКонтекст(Конт);
     Если НетПерехвата(ТипИлиПутьФормы)=1 Тогда
           // нет ни перехвата
           // ни регистрации открытия
           // Ни сканов ни всякого другого прочего
           Возврат 1;
     КонецЕсли;
     // НИКАКОЙ ПЕРЕХВАТ В ЭТОМ СОБЫТИИ ОБЪЯВЛЯТЬ НЕЛЬЗЯ
     //ПодключениеПерехватаГК(Конт,Путь,Файл);
     Возврат 1;
КонецФункции

//------------------------------------
Функция СобытиеГМ_ПриОткрытии(Конт, ФлагЧтенияНастройки) Экспорт
     Если НетПерехвата(ТипИлиПутьФормы)=1 Тогда
           // нет ни перехвата
           // ни регистрации открытия
           Возврат 1;
     КонецЕсли;
     ПодключениеПерехватаГК(Конт,Путь,Файл);
     Возврат 1;
КонецФункции
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #124 - 30. Мая 2012 :: 13:28
Печать  
не понял в чем проблема..
Событие

Событие_ЗаписьСобытияЖурналаРегистрации где описано у тебя ?
в глобальнике ?
И не работает ?
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #125 - 30. Мая 2012 :: 13:32
Печать  
Еще раз:

СобытиеГМ_Событие_ЗаписьСобытияЖурналаРегистрации() в классе не срабатывает при использовании и вызове Событие_ПриВыбореСтроки(). В других случаях работает.

Если использовать событие Событие_ЗаписьСобытияЖурналаРегистрации в глобальнике (вместо аналогичной в классе) - то оно отрабатывает и с Событие_ПриВыбореСтроки()
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
an2
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 43
Зарегистрирован: 23. Марта 2012
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #126 - 30. Мая 2012 :: 13:34
Печать  
Что Eprst злой это я пошутил.

В событии СобытиеГМ_СозданиеКонтекста
Есть одна странная проблемма
Если в этом событии подключить перехват событий Группового контекста,
Тогда в форме нового элемента справочника.
Я ничего не путаю именно в форме нового элемента никакого перехвата событий не будет.
В остальных случаях все в порядке.
Наступал на эти грабли дважды, поэтому уже сам себе написал, чтоб не вестить на Документацию.

С событием же СобытиеГМ_ПриОткрытии никаких проблем нет.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #127 - 30. Мая 2012 :: 13:45
Печать  
alyuev писал(а) 30. Мая 2012 :: 13:32:
Еще раз:

СобытиеГМ_Событие_ЗаписьСобытияЖурналаРегистрации() в классе не срабатывает при использовании и вызове Событие_ПриВыбореСтроки(). В других случаях работает.

Если использовать событие Событие_ЗаписьСобытияЖурналаРегистрации в глобальнике (вместо аналогичной в классе) - то оно отрабатывает и с Событие_ПриВыбореСтроки()


Ё.. проверил - усё отрабатывает, могу скинуть пример класса


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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #128 - 30. Мая 2012 :: 13:46
Печать  
an2 писал(а) 30. Мая 2012 :: 13:34:
Что Eprst злой это я пошутил.

В событии СобытиеГМ_СозданиеКонтекста
Есть одна странная проблемма
Если в этом событии подключить перехват событий Группового контекста,
Тогда в форме нового элемента справочника.
Я ничего не путаю именно в форме нового элемента никакого перехвата событий не будет.
В остальных случаях все в порядке.
Наступал на эти грабли дважды, поэтому уже сам себе написал, чтоб не вестить на Документацию.

С событием же СобытиеГМ_ПриОткрытии никаких проблем нет.



Аналогично - всё работает, в любой форме.
И фиолетово на форму нового элемента. событие ГМ_ПриОткрытии не используется
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #129 - 30. Мая 2012 :: 13:47
Печать  
Проверил как я и описывал? Открытие документа из журнала? и отрабатывает в классе СобытиеГМ_Событие_ЗаписьСобытияЖурналаРегистрации() ?
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #130 - 30. Мая 2012 :: 13:50
Печать  
Яя натюрлих!
Улыбка

ЗЫ: в глобальничке:

Код
Выбрать все
	ЗагрузитьВнешнююКомпоненту("1cpp.dll");
	Настройки=СоздатьОбъект("УправлениеНастройками");
	Настройки.Сбросить("Проверка типов");
	Настройки.Сбросить("Отладка");
	//Настройки.Сбросить("Оптимизация");
	Настройки.Включить("Оптимизация");
	Настройки.Включить("TurboBL");

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

  

_____________003.rar ( 7 KB | Загрузки )
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #131 - 30. Мая 2012 :: 13:51
Печать  
Я, конечно, верю... Но где ж собака порылась? Улыбка
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
an2
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 43
Зарегистрирован: 23. Марта 2012
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #132 - 30. Мая 2012 :: 13:53
Печать  
У Eprst есть БОЛЬШОЙ бубен.
Он в него бъет и исполняется любое желание.
А мы с тобой до такого бубна еще не доросли  Улыбка
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #133 - 30. Мая 2012 :: 13:57
Печать  
Проверь на моем мини-классе.
Работает ?
  
Наверх
 
IP записан
 
an2
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 43
Зарегистрирован: 23. Марта 2012
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #134 - 30. Мая 2012 :: 14:04
Печать  
Отчасти вынужден согласиться.
На моей же тестовой мини базе пробелеммы с СобытиеГМ_СозданиеКонтекста нет.
На рабочей базе - есть.
Привидения.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #135 - 30. Мая 2012 :: 14:06
Печать  
Ну, сравни версии ВК + включение в глобальнике методов группового контекста.
+включение turbobl + правильная версия turbomd.dll, если она есть

чудес то не бывает,  Подмигивание
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #136 - 30. Мая 2012 :: 15:03
Печать  
Eprst, у меня твой мини-класс не работает (в части события записи в журнал).
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #137 - 30. Мая 2012 :: 15:06
Печать  
Ну вот, ужо интереснее.
ВК каких версий у тебя ?
turbomd.dll есть ?
1срр какой версии ?
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #138 - 30. Мая 2012 :: 15:13
Печать  
turbomd нет.
1с++ версии 3.2.3.10
Формекс 2.0.5.92
Миракл 2.1.3.29
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #139 - 30. Мая 2012 :: 15:17
Печать  
у меня древнее 1срр - 3.2.3.1
турбомд есть, а формекс новее - 2.0.5.102

хотя, это не важно.

Подключаешь класс, как я написал ?
На чистой конфе (без твоих классов), работает хоть ?
Создай конфу с 1 документом для проверки


ЗЫ: в твоей конфе нет случаем еще классов с перехватчиком, типа УправлениеФормой ?
  
Наверх
 
IP записан
 
an2
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 43
Зарегистрирован: 23. Марта 2012
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #140 - 30. Мая 2012 :: 17:57
Печать  
Eprst писал(а) 30. Мая 2012 :: 14:06:
Ну, сравни версии ВК + включение в глобальнике методов группового контекста.
+включение turbobl + правильная версия turbomd.dll, если она есть

чудес то не бывает,  Подмигивание


Рыл, копал. Ничего не накопал.
Пока что чудо остается. Правда с поправками
Не вообще перехвата нет, а как-то выборочно.

ДЛЛ и порядок загрузки и на рабочей и на пустой один и тот же.

В пустой все равно где подключается перехват группового контекста.

А в рабочей если подключаю в событии СобытиеГМ_СозданиеКонтекста тогда:
Перехват событий "ПриОткрытии", "ПриНажатииКнопкиКлавиатуры" есть.
Перехвата событий "ПослеОткрытия", "ПослеСозданияФормы" - нет.
« Последняя редакция: 30. Мая 2012 :: 22:47 - an2 »  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #141 - 31. Мая 2012 :: 05:04
Печать  
an2 писал(а) 30. Мая 2012 :: 17:57:
Eprst писал(а) 30. Мая 2012 :: 14:06:
Ну, сравни версии ВК + включение в глобальнике методов группового контекста.
+включение turbobl + правильная версия turbomd.dll, если она есть

чудес то не бывает,  Подмигивание


Рыл, копал. Ничего не накопал.
Пока что чудо остается. Правда с поправками
Не вообще перехвата нет, а как-то выборочно.

ДЛЛ и порядок загрузки и на рабочей и на пустой один и тот же.

В пустой все равно где подключается перехват группового контекста.


Чудес не бывает, ищи у себя.
порядок загрузки ВК очень важен.
упрощай свою базу, убирай разные классы, ищи.
Если простейший тест работает, то значит, проблема 100% на твоей стороне.
Ищи разницу между тестом и своим кодом Улыбка
  

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #142 - 31. Мая 2012 :: 05:10
Печать  
Скорее всего,в конфе есть еще классы, в которых есть перехватчик - типа Класс.УправлениеФормой от vandalsvq
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #143 - 31. Мая 2012 :: 08:39
Печать  
Все классы поотключал, оставил только мини-класс перехватчика. Результат - пока не работает правильно перехват записи в журнал.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #144 - 31. Мая 2012 :: 08:47
Печать  
А в чем выражается "неправильность" ?

Не работает совсем, или при каких-либо условиях ?

У себя не могу воспроизвести пока "не ловлю события" - работает всегда, даже при отключенном ЖР в пофигураторе.
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #145 - 31. Мая 2012 :: 09:00
Печать  
Когда прописываю в классе Событие_ПриВыбореСтроки - при открытии документа из журнала не срабатывает перехват СобытиеГМ_Событие_ЗаписьСобытияЖурналаРегистрации в классе.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #146 - 31. Мая 2012 :: 09:08
Печать  
В смысле прописываешь ?
Это событие уже есть в моём мини-классе и оно работает!
И запись тоже
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #147 - 31. Мая 2012 :: 09:20
Печать  
Да, в твоем классе оно есть. И с ним не работает вызов ЗаписьСобытияЖурналаРегистрации (не работает только в момент открытия дока из журнала). Проверил на двух базах. Одной рабочей и одной стандартной бухе. Подключен только 1 мини-класс. На бухе только 2 компоненты: 1с++ и формекс.

Если отключит вызов ПриВыбореСтроки (пробовал двумя способами - убирал в журнале Форма.ОбработкаВыбораСтроки(1) или в самом классе закомментить Событие_ПриВыбореСтроки) - запись в журнал в классе срабатывает.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #148 - 31. Мая 2012 :: 09:22
Печать  
Я тебе не верю
Улыбка

Вот мини-конфа с моим классом - при открытии дока, событие есть ?
(в окошке сообщений должно быть)

При тырканьи мышой на элемент справочника  - событие привыборестроки есть ?

  

____.rar ( 780 KB | Загрузки )
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #149 - 31. Мая 2012 :: 09:33
Печать  
Всё.. я воспроизвел, что ты хочешь.

Дествительно, не ловит в журнале доков, если в нём ОбработкаВыбораСтроки(1)..
Тут нужно Артура пнуть
Улыбка
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #150 - 31. Мая 2012 :: 09:35
Печать  
В справочнике при тырканьи в списке событие ПриВыбореСтроки отрабатывает.

В журнале при открытии дока в твоей конфе срабатывает событие записи в журнал регистрации, но не срабатывает ПриВыбореСтроки, т.к. ты не прописал в журнале следущий код:

Код
Выбрать все
Процедура ПриОткрытии()
	Форма.ОбработкаВыбораСтроки(1);
КонецПроцедуры 



Вот если ты его пропишешь, начнет срабатывать ПриВыбореСтроки и не сработает ЗаписьЖурнала.


  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #151 - 31. Мая 2012 :: 09:40
Печать  
Перехват события записи в журнал в данной ситуации не перехватывается только в классе. В глобальном модуле перехватывается.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #152 - 31. Мая 2012 :: 09:48
Печать  
Ну.. так то надо Артура пнуть, или ... руктями прописать Открытие формы документа в самом классе

от тут усё работает:
  

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


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #153 - 13. Февраля 2013 :: 09:13
Печать  
Еще баг нашелся:

События Формекса
ПриНачалеБлокировкиОбъекта()
ОбработкаБлокировкиОбъекта()

Если обработку этих событий вынести в перехватчик (соответственно, как СобытиеГМ_ПриНачалеБлокировкиОбъекта() и СобытиеГМ_ОбработкаБлокировкиОбъекта() ), то эти события НЕ ПЕРЕХВАТЫВАЮТ блокировку, возникающую при ОткрытьФорму(док).
При том, что остальные блокировки (открытие из стандартных журналов, открытие по расшифровке из отчетов) - перехватываются нормально.

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #154 - 13. Февраля 2013 :: 16:31
Печать  
Satans Claws писал(а) 13. Февраля 2013 :: 09:13:
Еще баг нашелся:

События Формекса
ПриНачалеБлокировкиОбъекта()
ОбработкаБлокировкиОбъекта()

Если обработку этих событий вынести в перехватчик (соответственно, как СобытиеГМ_ПриНачалеБлокировкиОбъекта() и СобытиеГМ_ОбработкаБлокировкиОбъекта() ), то эти события НЕ ПЕРЕХВАТЫВАЮТ блокировку, возникающую при ОткрытьФорму(док).
При том, что остальные блокировки (открытие из стандартных журналов, открытие по расшифровке из отчетов) - перехватываются нормально.


Т.е. если юзать родные обработчики в глобальном модуле, то блокировки при ОткрытьФорму(док) ловится?
А как только переносишь обработчики в перехватчик, сразу перестают?
1С++ первой грузится? точно ФормЕкс позже грузится? в данном случае это важно.
  

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


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #155 - 14. Февраля 2013 :: 09:28
Печать  
artbear писал(а) 13. Февраля 2013 :: 16:31:
Т.е. если юзать родные обработчики в глобальном модуле, то блокировки при ОткрытьФорму(док) ловится?
А как только переносишь обработчики в перехватчик, сразу перестают?
1С++ первой грузится? точно ФормЕкс позже грузится? в данном случае это важно.


Да, родные обработчики блокировку при ОткрытьФорму() прекрасно ловят
Да, сразу перестают
Да, сначала 1С++, потом формекс
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #156 - 15. Февраля 2013 :: 06:05
Печать  
Не подтверждаю.
У меня работает перехват этих событий в классе.
ЗЫ: возможно, всё дело у тебя в этом ?

ОткрытьФорму(Док.ТекущийДокумент())

сама форма дока то хоть открывается ?
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #157 - 18. Февраля 2013 :: 08:15
Печать  
форма открывается

попробую в ближайшее время сделать тестовую конфу
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #158 - 19. Февраля 2013 :: 06:16
Печать  
Баг локализован:

если в обработчике события Выбор табличного поля сделать ОткрытьФорму - то перехватчик ГМ пропускает события ПриНачалеБлокировкиОбъекта() и ОбработкаБлокировкиОбъекта().

тестовый пример в аттаче

тыцкать в единственную строку табличного поля и кнопку/ячейку таблицы для сравнения.


ЗЫ
1цпп 3.2.3.16
формекс 2.0.5.101 бэта
  

_________________________________.zip ( 8 KB | Загрузки )
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #159 - 19. Февраля 2013 :: 11:41
Печать  
Да, есть такое.
ЗЫ: на своём классе тоже проверил - тоже не ловит.
Ну и пофик, я эти события не перехватываю, они у меня и в глобальничке нормально живут.
А так, если нужна универсальность (у меня так слеплено) - то тупо допглобальник формекса с этими событиями и привет.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать