|
По объекту метаданных как получить сам объект | ☑ | ||
---|---|---|---|---|
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
|
Вот и поговорили
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |