Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Информатор.ПолучитьТаблицуМетодов (число прочтений - 3141 )
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Информатор.ПолучитьТаблицуМетодов
30. Сентября 2011 :: 03:43
Печать  
Кто-нить может пояснить, с чем связан следующий нюанс в работе метода ПолучитьТаблицуМетодов класса Информатор:

Если получаем таблицу методов класса:
есть методы с двойными именами (предопределенные) - например, получитьбазовыйкласс/getbaseclass;
есть методы с одиночными именами (доопределенные) - например


Если получаем таблицу методов формы:
есть методы с двойными именами (предопределенные), например открытьподбор/openpermanentchoice.
+ аналогично доопределенные методы с одиночными именами.

Разница в том, что у класса доопределенные методы попадают в колонку NameRus, а у формы - в колонку NameEng.

С чем это связано? (ну и возможно ли починить и имеет ли смысл починить?)
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Информатор.ПолучитьТаблицуМетодов
Ответ #1 - 03. Октября 2011 :: 01:35
Печать  
Я проверяю всегда оба поля
Код
Выбрать все
Функция ОбработчикСобытияНайден(ИмяСобытия, ЭтоФункция = -1, ЧислоПараметров = -1)
	Сам = Сам(Контекст);
	Окружение = Сам.ПолучитьКонтекстОкружения();
	Если ПустоеЗначение(Информатор) = 1 Тогда
		Информатор = СоздатьОбъект("Информатор");
	КонецЕсли;
	Если Информатор.МетодСуществует(Окружение, ИмяСобытия) = 0 Тогда Возврат 0; КонецЕсли;
	Если ЭтоФункция <> -1 Тогда
		ЭтоФункция = Информатор.ЯвляетсяФункцией(Окружение, ИмяСобытия);
	КонецЕсли;
	Если ЧислоПараметров <> -1 Тогда
		//Определить число параметров
		//тз //:ТаблицаЗначений
		тз = Информатор.ПолучитьТаблицуМетодов(Окружение);
		чСтр = 0;
		Если тз.НайтиЗначение(ИмяСобытия, чСтр, "NameEng") = 1 Тогда
			ЧислоПараметров = тз.ПолучитьЗначение(чСтр, "nParams");
		КонецЕсли;
		Если тз.НайтиЗначение(ИмяСобытия, чСтр, "NameRus") = 1 Тогда
			ЧислоПараметров = тз.ПолучитьЗначение(чСтр, "nParams");
		КонецЕсли;
	КонецЕсли;
	Возврат 1;
КонецФункции // ОбработчикСобытияНайден 

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


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Информатор.ПолучитьТаблицуМетодов
Ответ #2 - 03. Октября 2011 :: 02:49
Печать  
Ну, я еще и нормализую таблицу методов в нижний регистр.
Мне просто стало интересно, с чем это связано...

ЗЫ использование метода ПолучитьКонтекстОкружения() сомнительно жеж?
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Информатор.ПолучитьТаблицуМетодов
Ответ #3 - 03. Октября 2011 :: 04:31
Печать  
Satans Claws писал(а) 03. Октября 2011 :: 02:49:
использование метода ПолучитьКонтекстОкружения() сомнительно жеж?
Зато мне плевать, откуда был создан экземпляр класса ... откуда создан, - там и ищу обработчик.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Информатор.ПолучитьТаблицуМетодов
Ответ #4 - 03. Октября 2011 :: 04:38
Печать  
ПолучитьКонтекстОкружения я в свое время починил, так что сейчас его использование ИМХО безопасно.
Один момент - нужно проверять полученный результат на пустоту (типа Тип(Конт) <> 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 записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Информатор.ПолучитьТаблицуМетодов
Ответ #5 - 03. Октября 2011 :: 06:05
Печать  
artbear писал(а) 03. Октября 2011 :: 04:38:
ПолучитьКонтекстОкружения я в свое время починил, так что сейчас его использование ИМХО безопасно.


Я скорее про то, что объект класса может создаваться далеко не в том контексте, в котором будет использоваться.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Информатор.ПолучитьТаблицуМетодов
Ответ #6 - 03. Октября 2011 :: 06:32
Печать  
Satans Claws писал(а) 03. Октября 2011 :: 06:05:
artbear писал(а) 03. Октября 2011 :: 04: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: Информатор.ПолучитьТаблицуМетодов
Ответ #7 - 03. Октября 2011 :: 08:33
Печать  
artbear писал(а) 03. Октября 2011 :: 04:38:
ПолучитьКонтекстОкружения я в свое время починил, так что сейчас его использование ИМХО безопасно.
Специально убрал свои "затычки" и проверил ... 1С падает при попытке получить контекст окружения, который уже уничтожен ... версия 1С++ 3.2.3.16
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Информатор.ПолучитьТаблицуМетодов
Ответ #8 - 03. Октября 2011 :: 10:27
Печать  
Dmitry The Wing писал(а) 03. Октября 2011 :: 08:33:
artbear писал(а) 03. Октября 2011 :: 04:38:
ПолучитьКонтекстОкружения я в свое время починил, так что сейчас его использование ИМХО безопасно.
Специально убрал свои "затычки" и проверил ... 1С падает при попытке получить контекст окружения, который уже уничтожен ... версия 1С++ 3.2.3.16

Когда я не занимался 1С++, не падало Улыбка
А если серьезно, сейчас ничего не могу сказать точно - на моих тестах не падал, причем эти тесты 100% падали на более старых версиях 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 записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать