Имя: Пароль:
1C
1С v8
По объекту метаданных как получить сам объект
0 laby1
 
20.02.16
14:02
или хотя бы тип объекта ...
1 PR третий
 
20.02.16
14:04
Че?
2 aleks_default
 
20.02.16
14:04
Имя, Карл, Имя!
3 Одинесю
 
20.02.16
14:05
(0) Метаданные - это класс, а объект - один из многих его экземпляров.
4 laby1
 
20.02.16
14:07
у меня переменная в ней Значение типа ОбъектМетаданных
5 Записьдампа
 
20.02.16
14:11
(4) Вот у тебя есть Метаданные.Справочники.Пользователи - какой тип ты надеешься получить? Ссылка? Объект? Менеджер?
6 laby1
 
20.02.16
14:14
(5) Объект
7 olegves
 
20.02.16
14:15
(6) найди по ссылке и получи объект
8 laby1
 
20.02.16
14:16
Вобще-то мне нужен тип этого объекта
9 olegves
 
20.02.16
14:17
(2) ему человек нужон, на конкретно, мужчина или женчина, а именно человек
10 laby1
 
20.02.16
14:17
ну вот мой код:


Процедура ДобавитьЭлементы(Ветка, Объект)
    
    Для каждого Элемент Из Объект Цикл
        Узлы = Ветка.ПолучитьЭлементы();
        Узел = Узлы.Добавить();
        Узел.Узел = Элемент.Имя;
        //Узел.Объект = Элемент.;
        Если Узел.ПолучитьРодителя().Узел="Табличные части" Тогда
            ДобавитьЭлементы(Узел, Элемент.Реквизиты);
        КонецЕсли;
    КонецЦикла;
    
    

КонецПроцедуры

Процедура ДобавитьВеткуРеквизиты(Дерево, Объект)
    
    Ветка = Дерево.Добавить();
    Ветка.Узел = "Реквизиты";
    ДобавитьЭлементы(Ветка,Объект.Реквизиты);
    
КонецПроцедуры

Процедура ДобавитьВеткуТЧ(Дерево, Объект)
    
    Ветка = Дерево.Добавить();
    Ветка.Узел = "Табличные части";
    ДобавитьЭлементы(Ветка,Объект.ТабличныеЧасти);

КонецПроцедуры

Процедура ДобавитьВеткуФормы(Дерево, Объект)
    
    Ветка = Дерево.Добавить();
    Ветка.Узел = "Формы";
    ДобавитьЭлементы(Ветка,Объект.Формы);
    
КонецПроцедуры

Процедура ДобавитьВеткуМакеты(Дерево, Объект)
    
    Ветка = Дерево.Добавить();
    Ветка.Узел = "Макеты";
    ДобавитьЭлементы(Ветка,Объект.Макеты);
    
КонецПроцедуры

Процедура  ЗаполнитьДерево(ИмяДокумента)
    
    Док = Метаданные.Документы[ИмяДокумента];
    Дерево = СтруктураДокумента1С.ПолучитьЭлементы();
    Дерево.Очистить();
    
    Для каждого Элемент Из Док.Реквизиты Цикл
        //Элемент
    КонецЦикла;
    
    ДобавитьВеткуРеквизиты(Дерево, Док);
    ДобавитьВеткуТЧ(Дерево, Док);
    ДобавитьВеткуФормы(Дерево, Док);
    ДобавитьВеткуМакеты(Дерево, Док);

КонецПроцедуры
11 laby1
 
20.02.16
14:19
В процедуре первой условие допустим по табличным частям - по названию объекта, а вдруг объект ктото так назвал к примеру и код будет неправильно работать так как у тог не будет реквизитов
12 olegves
 
20.02.16
14:19
(8) кури ОписаниеТипов
13 Одинесю
 
20.02.16
14:20
Если ТипЗнч(ТекОбъект) = Тип("СправочникСсылка.Номенклатура") Тогда
    ...
КонецЕсли;
14 laby1
 
20.02.16
14:20
(12) не курю, бросил )
15 laby1
 
20.02.16
14:21
(13) Я не знаю ТекОбъект
16 laby1
 
20.02.16
14:22
У меня в первой процедуре Элемент типа ОбъектМетаданных
17 olegves
 
20.02.16
14:23
(14) тогда бросай 1С - это не твое
18 laby1
 
20.02.16
14:23
(17) ща
19 Rie
 
20.02.16
14:25
(15) Так а какой именно объект тебе нужен? Помедитируй над этим. И над отличием данных и метаданных.
20 laby1
 
20.02.16
14:26
ну мне надо понять мой Элемент табличная часть или нет
21 laby1
 
20.02.16
14:27
и еще узнать ссылочного типа или нет
22 laby1
 
20.02.16
14:28
(12) чото я покурил но не всосал
23 LordCMEPTb
 
20.02.16
14:31
Парадокс, метаданных в том, что получить объект по ссылке можно, а вот ссылку по объекту приходится формировать руками.
Хорошо, что хоть есть метод у объекта метаданных "ПолноеИмя".
24 laby1
 
20.02.16
14:38
(23) Вот я получил его
Элемент.ПолноеИмя="Документ.ПриемНаРаботу.ТабличнаяЧасть.Удержания"
Что дальше ... ?
25 laby1
 
20.02.16
14:39
А мне нужен тип ...
26 LordCMEPTb
 
20.02.16
14:40
(24) Я от безысходности парсил строку, вычленял первую часть ("справочник", "документ", "перечисление"), подцеплял менеджер, из него по имени получал ссылку.
(25) А какой тип нужен из "Документ.ПриемНаРаботу.ТабличнаяЧасть.Удержания"?
27 laby1
 
20.02.16
14:42
Ну мне надо понять - если это табличная часть то для нее вывести реквизиты, если это ссылочный тип, то структуру этого объекта
28 laby1
 
20.02.16
14:43
а то, если я начинаю искать реквизиты для реквизитов то их там уже нету ... можно конечно исключениями поработать ...
29 laby1
 
20.02.16
14:44
но не люблю я их много использовать
30 Записьдампа
 
20.02.16
14:45
родитель объекта метаданных даст коллекцию по которой можно понять тип метаменеджера по которому сравнением Если = Тогда ИначеЕсли получить объект глобального контекста который позволит вычислить чисто конкретного менеджера по имени а у него есть метод создания
31 LordCMEPTb
 
20.02.16
14:47
(27) ПолноеИмя = <ОбъектМетаданных>.<ИмяОбъекта>.ТабличнаяЧасть.<ИмяТабличнойЧасти>
Это ни о чем не говорит? Нужно именно тип получить, не взирая на то, что тип еще нужно как-то проверить?
32 laby1
 
20.02.16
14:57
(30) Родитель мне известен, это Объект Вообще не понял вашего сообщения много буков и ни одной даже запятой
33 Записьдампа
 
20.02.16
14:57
(32) Ну, ты первый начал
34 laby1
 
20.02.16
14:59
(31) Смотрите. Вот я просматриваю допустим реквизиты документа.

Вот перебираю их - Сотрудник.

Теперь мне надо перебрать реквизиты справочника "Сотрудники" Как мне теперь сослаться на объект метаданных "Сотрудники" ?
35 laby1
 
20.02.16
15:00
(33) ну у меня тоже бывает, да
36 laby1
 
20.02.16
15:01
(30) Я так понял сделать процедуру мегасравнения не универсальную это некрасиво и не правильно
37 Записьдампа
 
20.02.16
15:01
(34) И натыкаешься на составной тип
38 laby1
 
20.02.16
15:02
(37) не понял
39 laby1
 
20.02.16
15:05
(37) Мне пофик составной не составной - я в рекурсии все равно уже
40 laby1
 
20.02.16
15:06
мне осталось в задаче всего-то перейти от реквизита к самому объекту ... помогите, люди!!!
41 Записьдампа
 
20.02.16
15:08
(39) Вот ты просматриваешь допустим реквизиты документа. Вот перебираешь их - Основание составного типа. Теперь тебе надо перебрать реквизиты?
42 laby1
 
20.02.16
15:09
.Тип Возвращает мне "ФизическиеЛица"
43 Записьдампа
 
20.02.16
15:10
(42) А почему там строка?
44 laby1
 
20.02.16
15:10
тип "ОписаниеТипов"
45 laby1
 
20.02.16
15:10
(43) не строка ОписаниеТипов
46 Записьдампа
 
20.02.16
15:11
(44) Ну так ты в (0) и хотел тип
47 laby1
 
20.02.16
15:11
Мне из него надо объект получить как-то Метаданные.Справочники.ФизическиеЛица
48 laby1
 
20.02.16
15:12
(46) Концепция поменялась :)
49 laby1
 
20.02.16
15:13
(46) и ОписаниеТипов и тип не совсем одно и то же
50 Записьдампа
 
20.02.16
15:14
(49) я про составные тебе давно говорю
51 laby1
 
20.02.16
15:14
то есть мне надо тип реквизита
52 laby1
 
20.02.16
15:14
(50) что составные?
53 Записьдампа
 
20.02.16
15:16
(52) ну основание документа например
54 Записьдампа
 
20.02.16
15:16
Там же не тип
55 Dmitrii
 
гуру
20.02.16
15:17
(45) (52) А если в ОписаниеТипов массив типов? Например, СправочникСсылка.ФизическиеЛица, СправочникСсылка.Контрагенты, СправочникСсылка.Склады и Строка. Какой из этих объектов метаданных тебе нужен и что делать со строкой?
56 laby1
 
20.02.16
15:18
(55) Да мне хотя бы с простым вариантом решить
57 Записьдампа
 
20.02.16
15:18
(56) тогда по типу надо объект метаданных искать
58 laby1
 
20.02.16
15:18
ну да, а как?
59 Записьдампа
 
20.02.16
15:18
в СП же написано
60 laby1
 
20.02.16
15:19
(59) СП это шо?
61 Записьдампа
 
20.02.16
15:20
Северная пивоварня
62 laby1
 
20.02.16
15:20
(55) А в описаниеТипов может всегда массив?
63 Записьдампа
 
20.02.16
15:20
64 laby1
 
20.02.16
15:21
(63) хаха, а если серьезно?
65 laby1
 
20.02.16
15:21
ЖКК знаю, СП нет
66 Записьдампа
 
20.02.16
15:22
(62) ты ж в (22) уже раскурил
67 Dmitrii
 
гуру
20.02.16
15:22
ИзвестныйМнеТип = "СправочникСсылка.ФизическиеЛица";
СправочникСсылка = Новый(ИзвестныйМнеТип);
ОбъектМетаданных = СправочникСсылка .Метаданные();
68 LordCMEPTb
 
20.02.16
15:22
(34) Ну хорошо, перебираем реквизиты документа. Наткнулись на тип "СправочникСсылка.Сотрудники". Делаем:
Метаданные.НайтиПоТипу(ТекущийТип)
Получаем объект справочника Сотрудники.
Проходим по его реквизитам, натыкаемся на реквизит "ДокументПриема", находим документ приема, просматриваем его реквизиты, находим с типом "Сотрудник".
И тут начинается понимание рекурсии.
69 laby1
 
20.02.16
15:22
(66) удже забыл
70 laby1
 
20.02.16
15:23
(68) ну вот, а то СП ..
71 Записьдампа
 
20.02.16
15:23
14.28 - 15.22
Рекорд
72 Dmitrii
 
гуру
20.02.16
15:23
(62) >>  в описаниеТипов может всегда массив?

Вообще-то всегда.
73 laby1
 
20.02.16
15:25
(72) значит нормально курил
74 LordCMEPTb
 
20.02.16
15:26
(70) а еще есть БСП... это Большая СП... ибо судя по сообщениям СП - НЁХ.
(62) В описании типов описание типов. Для получения массива нужен метод.
75 laby1
 
20.02.16
15:26
(68) Метаданные.НайтиПоТипу(Элемент.Тип) - не работает требует тип а у меня описаниетипов
76 laby1
 
20.02.16
15:26
(74) Так я в синтакс-помощнике курил! А что такое СП ???
77 laby1
 
20.02.16
15:27
(76) Так это он и есть!!!
78 LordCMEPTb
 
20.02.16
15:27
(75) -> (74)
79 laby1
 
20.02.16
15:27
(74) Большая синтакс-помощница?
80 Записьдампа
 
20.02.16
15:28
(77) Геннадий, вот ваше полотенце!
81 laby1
 
20.02.16
15:28
(80) шо?
82 Fish
 
20.02.16
15:28
(80) Надо короче: Гена, на!
83 lenochka-semicova
 
20.02.16
15:30
(75)

Например, так:
Док = Метаданные.Документы.РеализацияТоваров;
    Для Каждого Реквием Из Док.Реквизиты Цикл
        Сообщить(Реквием.Имя);
        ТипыРеквиема = Реквием.Тип.Типы();
        Для Каждого ТипР Из ТипыРеквиема Цикл
            ПодчиненныйМета = Метаданные.НайтиПоТипу(ТипР);
            Если ПодчиненныйМета <> Неопределено Тогда
                Для Каждого ПодчиненныйРеквием Из ПодчиненныйМета.Реквизиты Цикл
                    Сообщить(Реквием.Имя + "." + ПодчиненныйРеквием.Имя);
                КонецЦикла;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
    
    Для Каждого ТаЧасть Из Док.ТабличныеЧасти Цикл
        Для Каждого Реквием Из ТаЧасть.Реквизиты Цикл
            // Написать примерно то же самое...
        КонецЦикла;
    КонецЦикла;

Про рекурсию также стоит помнить
84 laby1
 
20.02.16
15:30
Вобщем у нас конец рабдня, всех с 23Ф
85 Записьдампа
 
20.02.16
15:32
(83) Сообщить(Реквием.Имя);
86 Dmitrii
 
гуру
20.02.16
15:33
+ к (67): Если есть описание типов

Для Каждого Тип Из ИзвестноеМнеОписаниеТипов Цикл
   ОбъектСсылка = Новый(Тип);
   ОбъектМетаданных = ОбъектСсылка.Метаданные();
КонецЦикла;
87 LordCMEPTb
 
20.02.16
15:38
(86) Это если в описаниях только ссылки. А если будет строка/число/дата/уникальный идентификатор, то упадет с ошибкой отсутствия метода.
88 laby1
 
20.02.16
15:45
(87) попытка не пытка в 1С
89 Записьдампа
 
20.02.16
15:54
(88) 4. Недопустимо делать проверки наличия у объекта реквизитов, методов, макетов и т.п., используя для этого исключения, т.к. это может привести к сложно диагностируемым ошибкам, а также затрудняет отладку в режиме «Останавливаться по ошибке».
Вместо перехвата исключений в этом случае рекомендуется:

    использовать механизмы работы с метаданными, чтобы явным образом проверять наличие или отсутствие реквизита (макета и т.п.);
    если различия связаны с особенностями встраивания библиотек – описывать особенности явным образом в переопределяемых модулях (см. Переопределяемые и поставляемые объекты);
    пересмотреть логику работы методов, использующих перехват исключений. Например, можно предусмотреть параметры, которые определяются в вызывающем коде и указывают нужно или нет обращаться к какому-либо методу или свойству объекта.
90 TormozIT
 
гуру
21.02.16
12:44
Использую попытки там, где они выигрывают по скорости и всем советую. В механизме остановки по ошибке давно есть фильтр. Сложно диагностируемых ошибок новых не появится, если в попытке будет строго одна операция.
91 Записьдампа
 
21.02.16
14:30
(90) Очень радостно за тебя. Необходимо срочно распространить эту информацию! Расскажи, пожалуйста, подробно о своих достижениях фирме 1С и они внесут изменения в систему стандартов и методик разработки конфигураций для платформы 1С:Предприятие 8.
92 TormozIT
 
гуру
21.02.16
14:48
(91) Еще 4 года назад об этом им написал, сори что не поставил тебя в копии. Какое у тебя мыло?
93 Записьдампа
 
21.02.16
15:15
(92) Странно, что за 4 года они так и не внесли изменения. Но не опускай руки, надо продолжать борьбу! Напиши еще на [email protected]
94 TormozIT
 
гуру
21.02.16
15:21
(93) Согласен странно. Ведь мое мнение очень важно для 1С. Раз ты так внимательно следишь за моими стараниями, давай свое мыло, подпишу тебя на рассылку о важных событиях, чтобы ты ничего не пропустил.
95 Записьдампа
 
21.02.16
15:34
(94) [email protected]
Только подпиши на действительно важные - мне тоже очень хочется быть на острие прогресса и нести свет заблудшим душам!
96 TormozIT
 
гуру
21.02.16
15:37
(95) Отправил письмо с запросом подтверждения подписки. Там внутри можно указать флажками, на какие события ты подписываешься. Жду ответ.
97 Записьдампа
 
21.02.16
16:01
Что-то нет там твоего письма. Ты точно его посылал? Попыткой-Исключением не пользовался?
98 TormozIT
 
гуру
21.02.16
16:08
Повезло теме, что здесь возник наш диалог. Теперь она будет в топах наверное месяц.
(97) Проверь в спам-фильтрах. Мои письма туда часто попадают.
99 Записьдампа
 
21.02.16
16:43
(98) Нет в спаме, похоже раньше убилось - в фильтрах почтовика застряло. Это кстати объясняет, почему твое письмо в 1С не получали.
Даешь сотню!
100 laby1
 
24.02.16
09:33
В общем вот что получилось

Перем
    Вложенность;

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Для Каждого Док из Метаданные.Документы цикл
        Элементы.Документ1С.СписокВыбора.Добавить(Док.Имя, Док.Синоним);
    КонецЦикла;
    
КонецПроцедуры


Процедура ДобавитьЭлементы(Ветка, Объект)
    
    Для каждого Элемент Из Объект Цикл
        Узлы = Ветка.ПолучитьЭлементы();
        Узел = Узлы.Добавить();
        Узел.Узел = Элемент.Имя;
        
        Попытка
        
            Если Узел.ПолучитьРодителя().Узел="Табличные части" Тогда
                ДобавитьЭлементы(Узел, Элемент.Реквизиты);
            Иначе
                ТипыЭлемента = Элемент.Тип.Типы();
                Для Каждого ТипЭлемента Из ТипыЭлемента Цикл
                    СвязанныйОбъект = Метаданные.НайтиПоТипу(ТипЭлемента);
                    Если СвязанныйОбъект <> Неопределено Тогда
                        ЗаполнитьВеткиДерева(Узел.ПолучитьЭлементы(), СвязанныйОбъект);
                    КонецЕсли;
                КонецЦикла;
            КонецЕсли;
        
        Исключение
        
        КонецПопытки;
    КонецЦикла;
    
    

КонецПроцедуры

Процедура ДобавитьВеткуДерева(Дерево, Узел, НазваниеУзла)
    
    Ветка = Дерево.Добавить();
    Ветка.Узел = НазваниеУзла;
    ДобавитьЭлементы(Ветка,Узел);
    
КонецПроцедуры


Процедура ЗаполнитьВеткиДерева(Дерево, Док)

    Если МаксимальнаяВложенность>0 И Вложенность>=МаксимальнаяВложенность Тогда
        Возврат;
    КонецЕсли;
    
    Вложенность=Вложенность+1;
    ДобавитьВеткуДерева(Дерево, Док.Реквизиты, "Реквизиты");
    ДобавитьВеткуДерева(Дерево, Док.ТабличныеЧасти, "Табличные части");
    ДобавитьВеткуДерева(Дерево, Док.Формы, "Формы");
    ДобавитьВеткуДерева(Дерево, Док.Макеты, "Макеты");

КонецПроцедуры


Процедура  ЗаполнитьДерево(ИмяДокумента)
    
    Вложенность=0;
    Док = Метаданные.Документы[ИмяДокумента];
    Дерево = СтруктураДокумента1С.ПолучитьЭлементы();
    Дерево.Очистить();
    ЗаполнитьВеткиДерева(Дерево, Док);
    
КонецПроцедуры

&НаКлиенте
Процедура Документ1СПриИзменении(Элемент)
    ЗаполнитьДерево(Документ1С);
КонецПроцедуры
101 laby1
 
25.02.16
08:35
Со вложенностью то прибавил а надо бы и отнять единичку:

Процедура ЗаполнитьВеткиДерева(Дерево, Док)

    Если МаксимальнаяВложенность>0 И Вложенность>=МаксимальнаяВложенность Тогда
        Возврат;
    КонецЕсли;
    
    Вложенность=Вложенность+1;
    Попытка
        ДобавитьВеткуДерева(Дерево, Док.Реквизиты, "Реквизиты");
        ДобавитьВеткуДерева(Дерево, Док.ТабличныеЧасти, "Табличные части");
        ДобавитьВеткуДерева(Дерево, Док.Формы, "Формы");
        ДобавитьВеткуДерева(Дерево, Док.Макеты, "Макеты");
    Исключение
    КонецПопытки;
    Вложенность=Вложенность-1;

КонецПроцедуры
102 TormozIT
 
гуру
25.02.16
09:13
Прислушайся к моему совету из (90). Имею большой опыт разработки. Выполняй в попытке минимально необходимое количество операций. Это принесет тебе в разы меньше страданий, особенно внутри транзакций.
103 laby1
 
25.02.16
09:16
(102) Ну видимо Вы не научились грамотно обрабатывать исключения
104 laby1
 
25.02.16
09:23
(102) Ну если у Вас большой опыт тогда напишите код, который гарантированно уменьшит вложенность и не нанесутся страдания какие-то там о которых я не знаю при моем маленьком опыте
105 laby1
 
25.02.16
09:27
Или так?

Процедура ЗаполнитьВеткиДерева(Дерево, Док)

    Если МаксимальнаяВложенность>0 И Вложенность>=МаксимальнаяВложенность Тогда
        Возврат;
    КонецЕсли;
    
    Вложенность=Вложенность+1;
    Попытка
        ДобавитьВеткуДерева(Дерево, Док.Реквизиты, "Реквизиты");
        ДобавитьВеткуДерева(Дерево, Док.ТабличныеЧасти, "Табличные части");
        ДобавитьВеткуДерева(Дерево, Док.Формы, "Формы");
        ДобавитьВеткуДерева(Дерево, Док.Макеты, "Макеты");
    Исключение
                Вложенность=Вложенность-1;
                ВызватьИсключение;
    КонецПопытки;
    Вложенность=Вложенность-1;

КонецПроцедуры
106 laby1
 
25.02.16
09:33
Вот и поговорили
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший