Имя: Пароль:
1C
 
Получить строку имени Типа из самого типа.
0 Said_We
 
04.03.08
18:17
Код примерно можно придумать такой

Для каждого Справочник Из Метаданные.Справочники Цикл

   Для каждого Реквизит Из Справочник.Реквизиты Цикл
       
       МассивТипов    = Реквизит.Тип.Типы();
       Для каждого ЭлементМассива Из МассивТипов Цикл
           
           ИмяТипа = ????;

Строка(ЭлементМассива) возвращает строку вида "Справочник ссылка: <Синоним>". А как бы <Имя> вытащить?

Или я сегодня туплю или этого просто сделать нельзя.
1 Злой Бобр
 
04.03.08
18:21
Какое имя? Может Идентификатор???
2 Said_We
 
04.03.08
18:36
(1) Это 8.х
3 Said_We
 
04.03.08
18:37
(1) "Идентификатор()" - бывает только у Компановки данных. А тут речь совсем о другом.
4 Злобный Фей
 
04.03.08
18:40
Вроде низзя
5 Said_We
 
04.03.08
18:46
(4) Можно. В КД подсмотрел.

XMLТип(ЭлементМассива)

Только потом надо строку немного обрезать до точки включительно

"CatalogRef.<Имя>"
6 Said_We
 
04.03.08
18:47
Результат = XMLТип(Тип).ИмяТипа;
                       
       Результат = СтрЗаменить(Результат, "CatalogRef", "СправочникСсылка");
       Результат = СтрЗаменить(Результат, "DocumentRef", "ДокументСсылка");
       Результат = СтрЗаменить(Результат, "EnumRef", "ПеречислениеСсылка");
       Результат = СтрЗаменить(Результат, "ChartOfAccountsRef", "ПланСчетовСсылка");
       Результат = СтрЗаменить(Результат, "ChartOfCharacteristicTypesRef", "ПланВидовХарактеристикСсылка");
       Результат = СтрЗаменить(Результат, "ChartOfCalculationTypesRef", "ПланВидовРасчетаСсылка");
       Результат = СтрЗаменить(Результат, "ExchangePlanRef", "ПланОбменаСсылка");
       Результат = СтрЗаменить(Результат, "BusinessProcessRef", "БизнесПроцессСсылка");
       Результат = СтрЗаменить(Результат, "BusinessProcessRoutePointRef", "ТочкаМаршрутаБизнесПроцессаСсылка");
       Результат = СтрЗаменить(Результат, "TaskRef", "ЗадачаСсылка");
7 asady
 
04.03.08
18:47
(0) ты хочешь менеджера объекта получить что-ли?

если да - то тип можешь не ковырять. Есть другой способ....
8 Said_We
 
04.03.08
18:52
(7) Я хочу получив тип реквизита вытащить его возможные типы.

Какой?

Новый(ЭлементМассива) ?... Только к имени там тоже не достучишься, так как ссылки нету... можно конечно объект новый создать, но что-то по моему это долго слишком.
9 Said_We
 
04.03.08
19:02
Неа и новый объект таким образом не создашь....
10 Said_We
 
04.03.08
19:05
ОписаниеТипов (TypeDescription)
Типы (Types)
Синтаксис:
Типы()
Возвращаемое значение:
Тип: Массив. Массив значений типа Тип, состоящий из используемых типов.
Описание:
Получает типы, используемые в объекте.
Пример:
// Заполнение списка типов документов по указанному элементу формы
// Элемент - элемент формы, имеющий составной тип
СписокТиповДокументов = Новый СписокЗначений;
Для каждого ТипДокумента Из Элемент.ТипЗначения.Типы() Цикл
ДокументСсылка = Новый(ТипДокумента);
Имя = ДокументСсылка.Метаданные().Имя;
Синоним = ДокументСсылка.Метаданные().Синоним;
СписокТиповДокументов.Добавить(Имя, Синоним);
КонецЦикла;

Может это для элементов диалога и работает, но для методанных ТИПЫ() видать что-то немного другое внутри возвращает.
11 asady
 
04.03.08
19:06
(8) Зачем имя типа тебе?
12 Said_We
 
04.03.08
19:10
Прикольно в отладчике не работает на прямую так...
Новый(ЭлементМассива).Метаданные()

Надо на две разбивать.
13 Said_We
 
04.03.08
19:12
строчки имеется ввиду
14 Собеседник
 
04.03.08
21:46
Может это?

//------------------------------------------------------------------------------------
// <Описание функции>
// Параметры
//  внКлюч                          – <Тип,ОписаниТипов,Строка,ОбъектМетаданных,Объект,Ссылка>
//  внПолучитьПредопределенные      – <Булево,Число,Строка>
//
// Возвращаемое значение:
//   Результат                      – Неопределено или структура
Функция обПолучитьОписаниеОбъектаМетаданных(внКлюч = "",Знач внПолучитьПредопределенные = Ложь) Экспорт
   
   
   Если ТипЗнч(внПолучитьПредопределенные) = Тип("Булево") Тогда
       внПолучитьПредопределенные = внПолучитьПредопределенные;
   ИначеЕсли ТипЗнч(внПолучитьПредопределенные) = Тип("Число") Тогда    
       Если внПолучитьПредопределенные = 1 Тогда
           внПолучитьПредопределенные = Истина;
       КонецЕсли;
   ИначеЕсли ТипЗнч(внПолучитьПредопределенные) = Тип("Строка") Тогда    
       Если ВРЕГ(СокрЛП(внПолучитьПредопределенные)) = "ДА" Тогда
           внПолучитьПредопределенные = Истина;
       КонецЕсли;
   Иначе
       внПолучитьПредопределенные = Ложь;
   КонецЕсли;
   
   
   мТипЗнч    = ТипЗнч(внКлюч);

   мПолноеИмя        = "";
   мИмя            = "";
   мКоллекция        = "";
   мТип            = Неопределено;      
   мМенеджер        = Неопределено;
   мМетаданныеТипа = Неопределено;
   мПреопределенные= Неопределено;
   
   Если мТипЗнч = Неопределено Тогда
       // Тип значения не определен
       Возврат (    Неопределено    );
   ИначеЕсли мТипЗнч = Тип("Тип") Тогда
       // в качестве ключа передан тип
       мМетаданныеТипа = Метаданные.НайтиПоТипу(внКлюч);
   ИначеЕсли мТипЗнч = Тип("ОписаниеТипов") Тогда    
       Если внКлюч.Типы().Количество() > 0 Тогда
           мТипЗнч = внКлюч.Типы()[0];
       Иначе
           Возврат (    Неопределено    );
       КонецЕсли;
       мМетаданныеТипа = Метаданные.НайтиПоТипу(мТипЗнч);
   ИначеЕсли мТипЗнч = Тип("Строка") Тогда
       мТипЗнч = Неопределено;
       Попытка
           мТипЗнч = Тип(внКлюч);
       Исключение
       КонецПопытки;
       Если мТипЗнч = Неопределено Тогда
           Возврат (    Неопределено    );
       КонецЕсли;
       мМетаданныеТипа = Метаданные.НайтиПоТипу(мТипЗнч);
   ИначеЕсли мТипЗнч = Тип("ОбъектМетаданных") Тогда
       мМетаданныеТипа = внКлюч;
   Иначе    
       // возможно объект или ссылка
       Попытка
           мМетаданныеТипа = Метаданные.НайтиПоТипу(мТипЗнч);
       Исключение
       КонецПопытки;
   КонецЕсли;
   
   Если ТипЗнч(мМетаданныеТипа) = Тип("ОбъектМетаданных") Тогда
   Иначе
       Возврат ( Неопределено );
   КонецЕсли;
   

   //-------------------------------------------------------------------
   мПолучитьПредопределенные = Ложь;
   
   
   Если Метаданные.Константы.Содержит(мМетаданныеТипа) Тогда    
       // Это константа
       мПолноеИмя            = "Константа."+мМетаданныеТипа.Имя;
       мИмя                = мМетаданныеТипа.Имя;
       мКоллекция            = "Константы";
       мМенеджер            = Константы[мМетаданныеТипа.Имя];      
       мТип                = ТипЗнч(мМенеджер);

   ИначеЕсли Метаданные.Справочники.Содержит(мМетаданныеТипа) Тогда
       // Это справочник
       мПолноеИмя            = "Справочник."+мМетаданныеТипа.Имя;
       мИмя                = мМетаданныеТипа.Имя;
       мКоллекция            = "Справочники";
       мМенеджер            = Справочники[мМетаданныеТипа.Имя];      
       мТип                = ТипЗнч(мМенеджер);
       
       мПолучитьПредопределенные = внПолучитьПредопределенные;
                           
   ИначеЕсли Метаданные.Документы.Содержит(мМетаданныеТипа) Тогда
       // Это документ
       мПолноеИмя            = "Документ."+мМетаданныеТипа.Имя;
       мИмя                = мМетаданныеТипа.Имя;
       мКоллекция            = "Документы";
       мМенеджер            = Документы[мМетаданныеТипа.Имя];      
       мТип                = ТипЗнч(мМенеджер);
       
   ИначеЕсли Метаданные.Перечисления.Содержит(мМетаданныеТипа) Тогда
       // Это перечисление
       
       мПолноеИмя            = "Перечисление."+мМетаданныеТипа.Имя;
       мИмя                = мМетаданныеТипа.Имя;
       мКоллекция            = "Перечисления";
       мМенеджер            = Перечисления[мМетаданныеТипа.Имя];      
       мТип                = ТипЗнч(мМенеджер);
       
   ИначеЕсли Метаданные.Отчеты.Содержит(мМетаданныеТипа) Тогда
       // Это отчет
       
       мПолноеИмя            = "Отчет."+мМетаданныеТипа.Имя;
       мИмя                = мМетаданныеТипа.Имя;
       мКоллекция            = "Отчеты";
       мМенеджер            = Отчеты[мМетаданныеТипа.Имя];      
       мТип                = ТипЗнч(мМенеджер);
       
   ИначеЕсли Метаданные.Обработки.Содержит(мМетаданныеТипа) Тогда
       // Это отчет
       
       мПолноеИмя            = "Обработка."+мМетаданныеТипа.Имя;
       мИмя                = мМетаданныеТипа.Имя;
       мКоллекция            = "Обработки";
       мМенеджер            = Обработки[мМетаданныеТипа.Имя];      
       мТип                = ТипЗнч(мМенеджер);
       
   ИначеЕсли Метаданные.ПланыВидовХарактеристик.Содержит(мМетаданныеТипа) Тогда
       // Это план Видов Характеристик
       
       мПолноеИмя            = "ПланВидовХарактеристик."+мМетаданныеТипа.Имя;
       мИмя                = мМетаданныеТипа.Имя;
       мКоллекция            = "ПланыВидовХарактеристик";
       мМенеджер            = ПланыВидовХарактеристик[мМетаданныеТипа.Имя];      
       мТип                = ТипЗнч(мМенеджер);
       
       мПолучитьПредопределенные = внПолучитьПредопределенные;

   ИначеЕсли Метаданные.ПланыСчетов.Содержит(мМетаданныеТипа) Тогда
       // Это план счетов
       мПолноеИмя            = "ПланСчетов."+мМетаданныеТипа.Имя;
       мИмя                = мМетаданныеТипа.Имя;
       мКоллекция            = "ПланыСчетов";
       мМенеджер            = ПланыСчетов[мМетаданныеТипа.Имя];      
       мТип                = ТипЗнч(мМенеджер);
       
       мПолучитьПредопределенные = внПолучитьПредопределенные;
       
   ИначеЕсли Метаданные.ПланыВидовРасчета.Содержит(мМетаданныеТипа) Тогда
       // Это план ВидовРасчета
       
       мПолноеИмя            = "ПланВидовРасчета."+мМетаданныеТипа.Имя;
       мИмя                = мМетаданныеТипа.Имя;
       мКоллекция            = "ПланыВидовРасчета";
       мМенеджер            = ПланыВидовРасчета[мМетаданныеТипа.Имя];      
       мТип                = ТипЗнч(мМенеджер);
       
       мПолучитьПредопределенные = внПолучитьПредопределенные;
       
   ИначеЕсли Метаданные.РегистрыСведений.Содержит(мМетаданныеТипа) Тогда
       // Это регистр РегистрСведений
       
       мПолноеИмя            = "РегистрСведений."+мМетаданныеТипа.Имя;
       мИмя                = мМетаданныеТипа.Имя;
       мКоллекция            = "РегистрыСведений";
       мМенеджер            = РегистрыСведений[мМетаданныеТипа.Имя];      
       мТип                = ТипЗнч(мМенеджер);
   
   ИначеЕсли Метаданные.РегистрыНакопления.Содержит(мМетаданныеТипа) Тогда
       // Это регистр РегистрНакопления
       
       мПолноеИмя            = "РегистрНакопления."+мМетаданныеТипа.Имя;
       мИмя                = мМетаданныеТипа.Имя;
       мКоллекция            = "РегистрыНакопления";
       мМенеджер            = РегистрыНакопления[мМетаданныеТипа.Имя];      
       мТип                = ТипЗнч(мМенеджер);
       
   ИначеЕсли Метаданные.РегистрыБухгалтерии.Содержит(мМетаданныеТипа) Тогда
       // Это регистр Бухгалтерии
       
       мПолноеИмя            = "РегистрБухгалтерии."+мМетаданныеТипа.Имя;
       мИмя                = мМетаданныеТипа.Имя;
       мКоллекция            = "РегистрыБухгалтерии";
       мМенеджер            = РегистрыБухгалтерии[мМетаданныеТипа.Имя];      
       мТип                = ТипЗнч(мМенеджер);
       
   ИначеЕсли Метаданные.РегистрыРасчета.Содержит(мМетаданныеТипа) Тогда
       // Это регистр РегистрРасчета
       
       мПолноеИмя            = "РегистрРасчета."+мМетаданныеТипа.Имя;
       мИмя                = мМетаданныеТипа.Имя;
       мКоллекция            = "РегистрыРасчета";
       мМенеджер            = РегистрыРасчета[мМетаданныеТипа.Имя];      
       мТип                = ТипЗнч(мМенеджер);
           
   ИначеЕсли Метаданные.БизнесПроцессы.Содержит(мМетаданныеТипа) Тогда
       // Это план БизнесПроцесс
       мПолноеИмя            = "БизнесПроцесс."+мМетаданныеТипа.Имя;
       мИмя                = мМетаданныеТипа.Имя;
       мКоллекция            = "БизнесПроцессы";
       мМенеджер            = БизнесПроцессы[мМетаданныеТипа.Имя];      
       мТип                = ТипЗнч(мМенеджер);

   ИначеЕсли Метаданные.Задачи.Содержит(мМетаданныеТипа) Тогда
       // Это план Задача
       мПолноеИмя            = "БизнесПроцесс."+мМетаданныеТипа.Имя;
       мИмя                = мМетаданныеТипа.Имя;
       мКоллекция            = "БизнесПроцессы";
       мМенеджер            = БизнесПроцессы[мМетаданныеТипа.Имя];      
       мТип                = ТипЗнч(мМенеджер);
       
   ИначеЕсли Метаданные.КритерииОтбора.Содержит(мМетаданныеТипа) Тогда
       // Это Критерий отбора
       
       мПолноеИмя            = "КритерийОтбора."+мМетаданныеТипа.Имя;
       мИмя                = мМетаданныеТипа.Имя;
       мКоллекция            = "КритерииОтбора";
       мМенеджер            = КритерииОтбора[мМетаданныеТипа.Имя];      
       мТип                = ТипЗнч(мМенеджер);
       
       
   // КОЛЛЕКЦИЯ МЕНЕДЖЕРОВ
     ИначеЕсли мТипЗнч = Тип("КонстантыНабор") Тогда
       // Это константы набор
       мМетаданныеТипа    = Метаданные.Константы;

       мПолноеИмя            = "Константы";
       мИмя                = "Константы";
       мКоллекция            = "Менеджеры";
       мМенеджер            = Константы;      
       мТип                = ТипЗнч(мМенеджер);
     ИначеЕсли мТипЗнч = Тип("РегистрыБухгалтерии") Тогда
       
       мМетаданныеТипа    = Метаданные.РегистрыБухгалтерии;
       
       мПолноеИмя            = "РегистрыБухгалтерии";
       мИмя                = "РегистрыБухгалтерии";
       мКоллекция            = "Менеджеры";
       мМенеджер            = РегистрыБухгалтерии;      
       мТип                = ТипЗнч(мМенеджер);
       
   ИначеЕсли мТипЗнч = Тип("РегистрыСведений") Тогда
       
       мМетаданныеТипа    = Метаданные.РегистрыСведений;
       
       мПолноеИмя            = "РегистрыСведений";
       мИмя                = "РегистрыСведений";
       мКоллекция            = "Менеджеры";
       мМенеджер            = РегистрыСведений;      
       мТип                = ТипЗнч(мМенеджер);
       
   ИначеЕсли мТипЗнч = Тип("РегистрыНакопления") Тогда
       
       мМетаданныеТипа    = Метаданные.РегистрыНакопления;
       
       мПолноеИмя            = "РегистрыНакопления";
       мИмя                = "РегистрыНакопления";
       мКоллекция            = "Менеджеры";
       мМенеджер            = РегистрыНакопления;      
       мТип                = ТипЗнч(мМенеджер);
       
   ИначеЕсли мТипЗнч = Тип("РегистрыРасчета") Тогда
       
       мМетаданныеТипа    = Метаданные.РегистрыРасчета;
       
       мПолноеИмя            = "РегистрыРасчета";
       мИмя                = "РегистрыРасчета";
       мКоллекция            = "Менеджеры";
       мМенеджер            = РегистрыРасчета;      
       мТип                = ТипЗнч(мМенеджер);

   КонецЕсли;
   
   Если ПустаяСтрока(мПолноеИмя) = Истина Тогда
       Возврат ( Неопределено );
   КонецЕсли;
   
   мПолноеИмя        = ВРЕГ(мПолноеИмя);
   мИмя            = ВРЕГ(мИмя);
   мКоллекция        = ВРЕГ(мКоллекция);
                     
   
   Результат = Новый Структура;
   Результат.Вставить("ПолноеИмя",            мПолноеИмя); // ключ поиска
   Результат.Вставить("Имя",                мИмя);
   Результат.Вставить("Коллекция",            мКоллекция);
   Результат.Вставить("Тип",                мТип);
   Результат.Вставить("Менеджер",            мМенеджер);
   Результат.Вставить("МетаданныеТипа",    мМетаданныеТипа);
   Результат.Вставить("Преопределенные");

   
   #Если Клиент Тогда
   Если мПолучитьПредопределенные = Истина Тогда
       Запрос = Новый ( "Запрос" );
       Запрос.Текст =
       "ВЫБРАТЬ РАЗРЕШЕННЫЕ
       |    ТаблицаОбъекта.Ссылка
       |ИЗ
       |    "+мПолноеИмя+" КАК ТаблицаОбъекта
       |ГДЕ
       |    ТаблицаОбъекта.Предопределенный = ИСТИНА";
       Результат.Преопределенные = Запрос.Выполнить().Выгрузить();
       Результат.Преопределенные.Колонки.Добавить("Имя",Новый ОписаниеТипов("Строка"));
       Для каждого СтрокаТЗ Из Результат.Преопределенные Цикл
           СтрокаТЗ.Имя = ВРЕГ(мМенеджер.ПолучитьИмяПредопределенного(СтрокаТЗ.Ссылка));
       КонецЦикла;
   КонецЕсли;
   #КонецЕсли
   
   Возврат Результат;
   
КонецФункции // обПолучитьОписаниеОбъектаМетаданных()
15 Said_We
 
05.03.08
11:10
(14) Да нет все проще.
В отладчике да и не в отладчике

// Такое работает
ТипВид = Новый(ТипОбъекта);
Имя = ТипВид.Метаданные().Имя;

// такое НЕ работает
Имя = Новый(ТипОбъекта).Метаданные().Имя;

т.е. без знака "=" полностью не отрабатывает конструктор или еще что. К свойствам доступ появляется, а методы вызвать нельзя.
Вот собственно и все.
В отладчике же стараешься писать все одной строкой и сразу видя тип пытаешься применить методы. А вот не всегда это возможно.
16 Defender aka LINN
 
05.03.08
11:22
Офигеть обсужение на ровном месте...

МетаданныеТипа = Метаданные.НайтиПоТипу(ТипЗначения);
Если МетаданныеТипа <> Неопределено Тогда
   ТипСтрокой = МетаданныеТипа.Имя;
Иначе //примитивный тип
   ТипСтрокой = Строка(ТипЗначения);
КонецЕсли;

грамотеи...
17 Said_We
 
05.03.08
11:57
Дело не в определении приметивного или не примитивного типа.
Просто наталкнулся на то что если рисуешь НОВЫЙ(...), но не присваиваешь чему либо, то до конца не срабатывает конструктор. и сразу применить метод нельзя.
Вот собственно и все.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой