Имя: Пароль:
1C
1С v8
Эксперименты с метаданными...
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) Занятно. Преобразование чудесно работает в типовых базах.
Т.е. если соединяться с двумя базами идентичной конфигурации, то через эту связку можно даже ссылки на конкретные объекты передавать. Быстрее и надежнее, чем даже по уникальному идентификатору выходит.
Но если соединяться с базами разных типов (напр торговля и бухгалтерия), то определяет только базовые менеджеры и типы на них. Впрочем, возможно, тоже может пригодиться )