|
Эксперименты с метаданными... | ☑ | ||
---|---|---|---|---|
0
zakidonoff
24.10.12
✎
14:40
|
На правах стёба.
Есть у нас весьма пользительный и удобный метод в метаданных. Называется "НайтиПоТипу()" Но вот при com соединении с внешней базой 1С, встаёт нехороший диллем, вынуждающий отказаться от попыток применения этого метода при поиске и сопоставлении типов метаданных разных баз. Свыкнуться с этой мыслью я так и не смог. Поэтому серия вопросов: 1) Можно ли как-то вытащить Идентификатор типа метаданных конкретного объекта\реквизита? Как в семёрке было? ИдРекв=Метаданные.ОбщийРеквизитДокумента(Номер).Идентификатор; МетаОб = Метаданные.Объект(Номер | Идентификатор); // объект метаданных ИдРекв=МетаОб.РеквизитШапки(Номер).Идентификатор; МетаРекв = МетаОб.Реквизит(Номер | Идентификатор); // реквизит объекта Ведь крайне удобная вестч при работе с двумя нетиповыми базами была! ... И второй вопрос. Можно ли создать тип значения объекта конфигурации? К примеру, что-то типа: ТипОбъекта = новый Тип("МетаданныеОбъект.ДокументыСсылка")? |
|||
1
Feanorko
24.10.12
✎
14:44
|
"Идентификатор типа метаданных конкретного объекта\реквизита" - это что за зверь?
|
|||
2
palpetrovich
24.10.12
✎
14:49
|
1. имя не подрйдет?
Для К = 0 По Метаданные.Справочники.Количество() - 1 Цикл ИмяСправочника = Метаданные.Справочники.Получить(К).Имя; КонецЦикла; 2. "создать тип значения объекта конфигурации" - это как? |
|||
3
Kashemir
24.10.12
✎
14:53
|
ЗНачениеВСтрокуВнутр(Справочники.Номенклатура.ПустаяСсылка())
|
|||
4
Kashemir
24.10.12
✎
14:56
|
(0) По поводу второго вопроса, не понял о чем речь. Может тебе XMLТипЗнч() подойдет ?
|
|||
5
AlexTim03
24.10.12
✎
14:56
|
(0) А еще есть второй метод НайтиПоПолномуИмени,
в который передается строка - полное имя, которое также можно получить из метаданных. Прекрасно работает при КомСоединении |
|||
6
Ахиллес
24.10.12
✎
15:17
|
(0) Можно. Но по КОМ ты всё равно только тип КомОбъект вернёшь, а дальше уже сам его разбирай и делай с ним, что хошь.
&НаСервере Процедура ПолучитьТипы() connection = ОбщийМодульСерверный.ПолучитьСоединение(); Метатип = connection.Справочники.Банки.ПустаяСсылка().Метаданные(); КонецПроцедуры &НаКлиенте Процедура Сформировать(Команда) ПолучитьТипы(); КонецПроцедуры |
|||
7
zakidonoff
24.10.12
✎
15:25
|
(1) Так я же привел пример из 7.7 - не? Нашел его на просторах инета.
(2) Это и есть альтернативный вариант, которым приходится пользоваться - брутальный перебор слишком ресурсозатратен и не оптимален. (3) Интересная штука - щас поиграюсь... (4) Тип = Метаданные.НайтиПоТипу(ТипЗнч(Документы.ПоступлениеТоваровУслуг.НайтиПоНомеру("").Товары)); Возвращает Коллекцию объектов метаданных элемента таблицы "товары" соответствующего менеджера и объекта. Вопрос в том, как создать эту коллекцию с нуля? Тип = Новый ОписаниеТипов(КоллекцияОбъектовМетаданных)... Что-то вроде этого. (5) Всё работает, только вот формирование соответствующей строки полного имени требует опять таки перебирать коллекцию метаданных, не есть гут =( (6) Суть в том, что я дёргаю полностью коллекцию метаданных удаленного объекта: вОбъект = connection.Документы.Валюты.НайтиПоКоду("643"); Объект = Документы.Валюты.НайтиПоКоду("643"); вМета = connection.Метаданные; Мета = Метаданные; Получаю два объекта. Теперь, чтобы найти, скажем, коллекцию объектов метаданных реквизитов внешнего объекта вОбъект, я мог бы сделать так: Реквизиты = Мета.НайтиПоТипу(ТипЗнч(Объект)).Реквизиты; вРеквизиты = вМета.НайтиПоТипу(ТипЗнч(вОбъект)).Реквизиты; кллекцию реквизитов я прекраснейшим образом получу. А вот коллекцию вРеквизитов - куй. Отсюда вопрос, как можно обойти неработающую для com соединения стандартную функцию ТипЗнч()? |
|||
8
Feanorko
24.10.12
✎
15:31
|
(7) "вРеквизиты = вМета.НайтиПоТипу(ТипЗнч(вОбъект)).Реквизиты;
" - феерично. Какого рожна подсовываешь внешнему соединению ссылку из своей базы? |
|||
9
Feanorko
24.10.12
✎
15:32
|
+(8) а не, ошибся, пардон)
|
|||
10
zakidonoff
24.10.12
✎
15:34
|
(3) А декодер у неё есть?
(4) вОбъект - так в том и вопрос: как сделать типом во внешней базы. вРеквизиты = вМета.НайтиПоТипу(connection.NewObject("Тип", "аналогичный тип").Реквизиты; также не сработает |
|||
11
Feanorko
24.10.12
✎
15:39
|
(10) пишут, что так работает:
ТипЗнч = СоединениеСБазойДанных.FromXMLType(СоединениеСБазойДанных.XMLTypeOf(Значение)); |
|||
12
Kashemir
24.10.12
✎
15:40
|
(10) Декодера нет. Сам распарсь - но судя по твоим дальнейшим комментариям тебе вовсе не внутренний ИД метатипа / Номер таблицы нужен.
(11) Да - работают. |
|||
13
Kashemir
24.10.12
✎
15:43
|
(7) кллекцию реквизитов я прекраснейшим образом получу. А вот коллекцию вРеквизитов - куй.
вОбъект.Метаданные().Реквизиты |
|||
14
Ахиллес
24.10.12
✎
15:45
|
(7) Ошибаешься. Метатип = connection.Справочники.Банки.ПустаяСсылка().Метаданные(); как раз возвращает коллекцию метаданных. Просто "обёрнутую" в КОМОбъект.
|
|||
15
Ахиллес
24.10.12
✎
15:52
|
Кстате, для тех, кто внутри бронетехники. "Реквизиты" по КОМовски будет "Attributes" ;-)
|
|||
16
zakidonoff
24.10.12
✎
17:22
|
(11) То что надо, спасибо =)
Изгалялся несколько иначе: по Com соединению подключал внешнюю обработку, возвращающую одной из функций созданный тип по строковому значению или внешнему объекту ) |
|||
17
zakidonoff
24.10.12
✎
17:23
|
(15) не принципиально. Работает и по русски, хоть в отладчике и отображает только буржуйские названия.
|
|||
18
zakidonoff
24.10.12
✎
17:36
|
(12) Разве?
Значение == ЗначениеИзСтрокиВнутр(ЗНачениеВСтрокуВнутр(Значение)) |
|||
19
zakidonoff
24.10.12
✎
18:04
|
(3) Занятно. Преобразование чудесно работает в типовых базах.
Т.е. если соединяться с двумя базами идентичной конфигурации, то через эту связку можно даже ссылки на конкретные объекты передавать. Быстрее и надежнее, чем даже по уникальному идентификатору выходит. Но если соединяться с базами разных типов (напр торговля и бухгалтерия), то определяет только базовые менеджеры и типы на них. Впрочем, возможно, тоже может пригодиться ) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |