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



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Как "распознать" класс?
14. Февраля 2019 :: 18:27
Печать  
Можно ли как-то узнать, что объект - это класс, созданный при помощи 1С++?
И что к нему применимы методы типа "ПолучитьБазовыйКласс" и др.?

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


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как "распознать" класс?
Ответ #1 - 15. Февраля 2019 :: 08:19
Печать  
Есть встроенный класс Информатор - можно им, например с помощью Информатор :: МетодСуществует() проверить наличие того же ПолучитьБазовыйКласс
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как "распознать" класс?
Ответ #2 - 15. Февраля 2019 :: 15:45
Печать  
ADirks писал(а) 15. Февраля 2019 :: 08:19:
Есть встроенный класс Информатор - можно им, например с помощью Информатор :: МетодСуществует() проверить наличие того же ПолучитьБазовыйКласс


Отлично!

А я делал через "Попытка - Исключение".
Это наверно не очень хорошо?
  
Наверх
ICQ  
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Как "распознать" класс?
Ответ #3 - 15. Февраля 2019 :: 15:57
Печать  
es3000 писал(а) 15. Февраля 2019 :: 15:45:
А я делал через "Попытка - Исключение".
Это наверно не очень хорошо?

Не очень хорошо по одной простой причине - Попытка/Исключение без сообщения об ошибке могут долго маскировать какую то проблему, а с сообщением выводят кучу лишнего. Чем такого меньше - тем лучше.

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



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как "распознать" класс?
Ответ #4 - 18. Февраля 2019 :: 14:07
Печать  
Djelf писал(а) 15. Февраля 2019 :: 15:57:
es3000 писал(а) 15. Февраля 2019 :: 15:45:
А я делал через "Попытка - Исключение".
Это наверно не очень хорошо?

Не очень хорошо по одной простой причине - Попытка/Исключение без сообщения об ошибке могут долго маскировать какую то проблему...


Для того чтобы проверить класс, я в конструкции "Попытка-Исключение" вызывал только один метод "ПолучитьБазовыйКласс".
По идее тут никакой проблемы не должно быть.

Из негативных моментов такого способа - может быть производительность?

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



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как "распознать" класс?
Ответ #5 - 22. Мая 2019 :: 14:31
Печать  
ADirks писал(а) 15. Февраля 2019 :: 08:19:
Есть встроенный класс Информатор - можно им, например с помощью Информатор :: МетодСуществует() проверить наличие того же ПолучитьБазовыйКласс


У меня выдается ошибка, если первый параметр - это не класс.
А что нужно передавать этому методу в первом параметре?
Сам объект?
Или название класса?

В документации написано:
Цитата:
МетодСуществует(<стрИмяКласса>,<стрИмяМетода>)
<стрИмяКласса> - (Строка)  Имя класса


Как определить является ли переданный параметр классом?
С учетом того, что передано может быть все что угодно: и строка, и число и типовой объект, и класс.
  
Наверх
ICQ  
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как "распознать" класс?
Ответ #6 - 23. Мая 2019 :: 07:37
Печать  
Наверное, как-то так:
Информатор.МетодСуществует(ТипЗначенияСтр(ПроверяемыйОбъект), "ПолучитьБазовыйКласс")
  

FormEx developer
Наверх
www  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как "распознать" класс?
Ответ #7 - 24. Мая 2019 :: 13:19
Печать  
АЛьФ писал(а) 23. Мая 2019 :: 07:37:
Наверное, как-то так:
Информатор.МетодСуществует(ТипЗначенияСтр(ПроверяемыйОбъект), "ПолучитьБазовыйКласс")


Так вообще не работает.
Выдает ошибку:
Цитата:
Информатор::МетодСуществует - первым параметром нужно передать контекст
  
Наверх
ICQ  
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как "распознать" класс?
Ответ #8 - 26. Мая 2019 :: 09:46
Печать  
Я с информатором не работал, но по тексту ошибки очевидно, что надо попробовать так:
Информатор.МетодСуществует(ПроверяемыйОбъект, "ПолучитьБазовыйКласс")

С учетом требования "и строка, и число и типовой объект, и класс" добавлю:
не объектные типы (дата, число, строка) надо отсеивать заранее с помощью метода ТипЗначения или ТипЗначенияСтр.
  

FormEx developer
Наверх
www  
IP записан
 
MadDAD
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 22
Зарегистрирован: 17. Ноября 2015
Re: Как "распознать" класс?
Ответ #9 - 28. Мая 2019 :: 07:56
Печать  
Я делаю так:

Код (C++)
Выбрать все
Функция ЭтоЭкземплярКласса(Таблица) Экспорт
	Если Информатор.ТипЗначенияСтрВнутр(Таблица)  = "CComponentClass"  Тогда // Это пользовательский класс
		Возврат 1;
	Иначе
		Возврат 0;
	КонецЕсли;
КонецФункции 

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



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как "распознать" класс?
Ответ #10 - 29. Мая 2019 :: 14:47
Печать  
MadDAD писал(а) 28. Мая 2019 :: 07:56:
Я делаю так:

Код (C++)
Выбрать все
...
	Если Информатор.ТипЗначенияСтрВнутр(Таблица)  = "CComponentClass"  Тогда // Это пользовательский класс
... 



В документации к функции написано:
"В случае, если проверяемый объект не является агрегатным типом (Строка, Число и т.п.), выдается исключение."

Значит, тоже не подходит.

Как-то плохо получается.
Без исключения нельзя проверить - класс это или нет Печаль
  
Наверх
ICQ  
IP записан
 
MadDAD
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 22
Зарегистрирован: 17. Ноября 2015
Re: Как "распознать" класс?
Ответ #11 - 30. Мая 2019 :: 06:05
Печать  
es3000 писал(а) 29. Мая 2019 :: 14:47:
В документации к функции написано:
"В случае, если проверяемый объект не является агрегатным типом (Строка, Число и т.п.), выдается исключение."

Значит, тоже не подходит.

Как-то плохо получается.
Без исключения нельзя проверить - класс это или нет Печаль


Знапит предварительно еще проверить на ТипЗначенияСтр. И там отсять число, строку и дату. Проверка с исключениями - зло.

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


1C++ rocks!

Сообщений: 22
Зарегистрирован: 17. Ноября 2015
Re: Как "распознать" класс?
Ответ #12 - 30. Мая 2019 :: 06:06
Печать  
Как-то так:

Код (C++)
Выбрать все
Функция ЭтоЭкземплярКласса(Значение) Экспорт
	ТипЗначения = ТипЗначенияСтр(Значение);

	Если СтрЧислоВхождений("Число,Строка,Дата", ТипЗначения ) = 1 Тогда
		Возврат 0;
	КонецЕсли;

	Если Информатор.ТипЗначенияСтрВнутр(Значение)  = "CComponentClass"  Тогда // Это пользовательский класс
		Возврат 1;
	Иначе
		Возврат 0;
	КонецЕсли;
КонецФункции  

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



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как "распознать" класс?
Ответ #13 - 30. Мая 2019 :: 13:00
Печать  
MadDAD писал(а) 30. Мая 2019 :: 06:05:
Проверка с исключениями - зло.


Это я знаю.

MadDAD писал(а) 30. Мая 2019 :: 06:05:
Знапит предварительно еще проверить на ТипЗначенияСтр. И там отсять число, строку и дату.


А контекст формы или документа надо отсеивать?

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



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как "распознать" класс?
Ответ #14 - 30. Мая 2019 :: 13:35
Печать  
А нельзя ли добавить метод, который отрабатывает по любому параметру без исключений?

1 - это класс
0 - не класс.

Или проект 1С++ больше не поддерживается?
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать