Имя: Пароль:
1C
 
Как получить тип объекта метаданных?
0 Oven2009
 
09.06.10
11:37
Вопрос такой. В платформе 8.1 была возможность вывести все реквизиты документа и определить тип каждого реквизита реквизита в виде например: Справочник.Валюты. В платформе 8.2 та же процедура выводит тип такого вида: Валюты. Каким образом определить является данный реквизит справочником или документом?
1 H A D G E H O G s
 
09.06.10
11:38
(0) Ткнуть его
2 H A D G E H O G s
 
09.06.10
11:39
ЭтоДокумент=Истина;
Попытка
тмп=Объект.Метаданные().ДлинаНомера;
Исключение
ЭтоДокумент=Ложь;
КонецПопытки
3 Дикообразко
 
09.06.10
11:43
(2) а что метод содержит, у метаданных убрали?
4 Defender aka LINN
 
09.06.10
11:47
(0) При чем тут строковое представление?
Или это очередная волна массового наступления на грабли?
(2) Да вы, батенька, извращенец :)
5 H A D G E H O G s
 
09.06.10
11:50
Кто здесь?

Медленнный этот метод Содержит()

Надо мне определить - к какому КЛАССу метаданных относится объект - замучаешься Содержит() вызывать.
А тут - раз метаданные получил - живи и радуйся.
6 Дикообразко
 
09.06.10
11:53
(5) так он же не один раз будет проверять... можно и за кэшировать...

а с попыткой потом отлаживать морока, остановку по ошибке толком не поюзаешь
7 Oven2009
 
09.06.10
11:53
Нет текст кода такой:
имеется объектметаданных - какой-то документ
реквизиты = объект.реквизиты
для каждого реквизит из реквизиты цикл
типы = реквизит.тип.типы()
для каждого типр из типы цикл
////////////////
тип этого типр такой: контрагент, валюты и т.д., а раньше был справочник. контрагент, справочник.валюты и т.д.
8 Defender aka LINN
 
09.06.10
11:56
(7) "тип этого типр такой: контрагент, валюты и т.д., а раньше был справочник. контрагент, справочник.валюты и т.д." - атомный феерический бред. Тип как был типом, так и остался.
(5) "Медленнный этот метод Содержит()" - зато правильный. А если кэшировать в Соответствии, то и вообще разницы не будет.
Еще есть СодержитТип(). В разы быстрее и тоже правильно.
9 H A D G E H O G s
 
09.06.10
11:56
(6) Что ты там закешируешь?

Если Метаданные.Справочники.Содержит(МетаданныеОбъекта) Тогда
Возврат "Справочник";
ИначеЕсли Метаданные.Документы.Содержит(МетаданныеОбъекта) Тогда
.....
10 Дикообразко
 
09.06.10
11:56
(9) Метаданные().ПолноеИмя() в 8.2 тоже нет?
11 Дикообразко
 
09.06.10
11:57
(9) оно при первом обращение закэшируется
12 Дикообразко
 
09.06.10
11:58
О_о в 8.1 еще можно так

Если Объект.Метаданные().Родитель = Метаданные.Справочники Тогда
  ЭтоСправочник = Истина;
КонецЕсли;
13 Oven2009
 
09.06.10
11:59
Метаданные().ПолноеИмя() выдает такого видат строку например:
Документ.Событие.Реквизит.Важность
Класса объекта метаданных тоже здесь нет
14 Oven2009
 
09.06.10
12:00
В 8.1 документ работал отлично, после перехода на 8.2 возникла описываемая мною проблема
15 H A D G E H O G s
 
09.06.10
12:00
Мне лениво спорить.
16 Дикообразко
 
09.06.10
12:00
(15) в (12) наврал
17 Дикообразко
 
09.06.10
12:01
(7) Метаданные.НайтиПоТипу() в 8,2 тоже убрали?
18 Oven2009
 
09.06.10
12:02
Если я вставляю в найтипотипу слово Валюты без слова справочник, то он ничего не находит
19 Oven2009
 
09.06.10
12:03
Видимо придется использовать Содержит(). Непонятно просто зачем были внесены такие изменения в платформу.
20 Дикообразко
 
09.06.10
12:04
(18) ты не слово вставляй... а тип

реквизиты = объект.реквизиты
для каждого реквизит из реквизиты цикл
типы = реквизит.тип.типы()
для каждого тип из типы цикл
 МетаТипа = Метаданные.НайтиПоТипу(Тип);
21 Дикообразко
 
09.06.10
12:05
+20

а уж потом
МетаТипа.ПолноеИмя()
22 Oven2009
 
09.06.10
12:05
Пробую. Ставит слово Валюты тип- ОбъектМетаданных
23 Oven2009
 
09.06.10
12:06
О получилось, спасибо!!!
24 Дикообразко
 
09.06.10
12:06
реквизиты = объект.реквизиты
для каждого реквизит из реквизиты цикл
Типы = реквизит.тип.типы()
Для каждого тип из Типы цикл
 Если Найти(Метаданные.НайтиПоТипу(Тип).ПолноеИмя(), "Справочник") > 0 Тогда
   // это справочник;
 КонецЕсли;
КонецЦикла;
25 Oven2009
 
09.06.10
12:06
После ПолноеИмя() выдал правильно
26 Oven2009
 
09.06.10
12:07
Спасибо еще раз