Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Перехват ОбработкаЯчейкиТаблицы: 2ва случая - ГМ и ГК (число прочтений - 2706 )
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Перехват ОбработкаЯчейкиТаблицы: 2ва случая - ГМ и ГК
15. Мая 2013 :: 10:58
Печать  
Есть 2ва штатных события 1С : 'ОбработкаЯчейкиТаблицы()' и 'ПриУстановкеОтбора()'
которые могут располагаться в 2х местах - в форме и в ГМ.

При перехвате события 'ОбработкаЯчейкиТаблицы' есть один прикол (установку отбора - не пробовал)
А именно:
     
1С (ШТАТНО, БЕЗ ПЕРЕХВАТОВ) отрабатывает так (известно,повторюсь):
     
Из некоторой формы формируем таблицу с расшифровками.
Варианты штатного поведения 1С (без перехватов):
вариант  1:
- После формирования таблицы форму закрываем.
- Кликаем по расшифровке с УЖЕ ЗАКРЫТОЙ формой
- вызывается обработчик ГМ (так и должно быть)
вариант 2:
- Формируем таблицу и форму НЕ ЗАКРЫВАЕМ
- кликаем по расшифровке
- срабатывает вызов (догадываюсь) ЛОКАЛЬНОГО обработчика
- локального обработчика нет: 1С (штатно) вызывает обработчик ГМ (тот же что и в 1м случае)

ЕСЛИ ВКЛЮЧИТЬ ПЕРЕХВАТ 'ОбработкаЯчейкиТаблицы' ГМ+ГК
(в моем случае - разными КОП-ами):
     
вариант 1: отарабывает так же как и штатный случай:
- закрываем форму, кликаем по расшифровке
- срабатывает перехват события (функция) "ПерехватчикГМ::СобытиеГМ_ОбработчкаЯчейкиТаблицы()"
- внутри метода идет вызов 'ВыполнитьОригинальноеСобытиеГлобальногоМодуля'
- этот вызов нормально отрабатывается оригинальным обработчиком ГМ
- вызов возвращает '1'
- общий результат (статус возврата) из метода также '1'

вариант 2:   (форма открыта+ оригинального ЛОКАЛЬНОГО обработчика нет)
- форму не закрываем, кликаем в таблице по расшифровке
- срабатывает перехват события (функция) "ПерехватчикФормы::Событие_ОбработчкаЯчейкиТаблицы()"
- внутри выполяется вызов 'ВыполнитьОригинальноеСобытиеГК()'
- вызов оригинально "происходит": оригинального обработчика нет
(при этом вызов обработчика ГМ не происходит !!!!! Хочу чтобы 1С продолжила вызов ГМ)
- вызов возвращает '1'
- общий результат (статус возврата) из метода также '1'
     
При этом - во втором случае - я не знаю: есть в форме оригинальный обработчик или нет.
КОП "ПерехватчикФормы" - базовый для перехвата всех форм.

Хочу чтобы отрабатывал вызов по цепочке, как в штатном случае: если его там нет, пусть 1С вызывает событие ГМ.

События Formex (перехваченные, например "ПриНажатииКнопкиКлавиатуры")
отрабатывают правильно: если в форме обработчика нет - 1С САМА вызывает обработчик ГМ.
Соотвественно далее: "Перехватчик" перехватывает ГМ и выполняется вызов "СобытиеГМ_ПриНажатииКнопкиКлавиатуры"
(конечно же - это всё при открытой форме)


Как это победить? Куда копать?

1С++ 3.2.4.1

Тестовая конфигурация прилагается.
У отчета "ТестРасшифровки" 2 кнопки - соответственно по рассмотренным вариантам

Чтобы протестировать штатный случай 1С
достаточно (естественно) закомментировать
инициализацию перехвата в ПриНачалеРаботыСистемы()
  

1cpp_Hook_ObrabotkaTableCell.7z ( 137 KB | Загрузки )
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехват ОбработкаЯчейкиТаблицы: 2ва случая - ГМ и ГК
Ответ #1 - 15. Мая 2013 :: 12:06
Печать  
Ну так например:

Код
Выбрать все
Процедура Событие_ОбработкаЯчейкиТаблицы(Зн,ФСО,Таб,Адр) Экспорт
	Сообщить("перехват локальная");
	Информатор = СоздатьОбъект("Информатор");
	Если Информатор.МетодСуществует(КонтФормы,"ОбработкаЯчейкиТаблицы")=1 Тогда
		,ФСО,Таб,Адр);
	Иначе
		ы",Зн,ФСО,Таб,Адр);
	КонецЕсли;
КонецПроцедуры 



только вот перехват в глобальничке не сработает
  
Наверх
 
IP записан
 
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: Перехват ОбработкаЯчейкиТаблицы: 2ва случая - ГМ и ГК
Ответ #2 - 15. Мая 2013 :: 12:23
Печать  
Eprst писал(а) 15. Мая 2013 :: 12:06:
Ну так например:

Код
Выбрать все
Процедура Событие_ОбработкаЯчейкиТаблицы(Зн,ФСО,Таб,Адр) Экспорт
	Сообщить("перехват локальная");
	Информатор = СоздатьОбъект("Информатор");
	Если Информатор.МетодСуществует(КонтФормы,"ОбработкаЯчейкиТаблицы")=1 Тогда
		,ФСО,Таб,Адр);
	Иначе
		ы",Зн,ФСО,Таб,Адр);
	КонецЕсли;
КонецПроцедуры 



только вот перехват в глобальничке не сработает



Да, сенкс. Это я уже понял. И даже "прикрутил" этот финт ушами...

Остается вопрос:
- это баг и будет исправляться
- или фича которую забыли задокументировать ?

Где-то нужно поправить/дополнить: или в доке или в сорцах 1с++ (в следующем билде)....

Я вот, например, неделю пытался отловить эту проблему....

И чтоб никто больше не спотыкался:
прошу авторов что-нить поправить.

Преогромное СПАСИБО.

Зарегистрировал на багтрекере:
http://www.1cpp.ru/bugs/show_bug.cgi?id=4559
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехват ОбработкаЯчейкиТаблицы: 2ва случая - ГМ и ГК
Ответ #3 - 15. Мая 2013 :: 12:27
Печать  
Можно попробовать еще так извернутся - проверить на наличие метода, если его нет - добавить через выполняемый модуль, с вызовом в нём глобального.. и потом уже возврат оригинального обработчика.. мот прокатит такой фокус, чтоб еще и глобальный перехват был.

ЗЫ: у меня проще - я могу тупо в событие ГМ передать.. всё в одном классе.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать