![]() |
![]() |
![]() |
|
описание типов через Com OLE | ☑ | ||
---|---|---|---|---|
0
sam_sam
06.12.09
✎
16:04
|
Есть усок кода
ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда ИдентификаторИсточник = Значение.УникальныйИдентификатор(); ИдентификаторПолучатель = Соединение.NewObject("УникальныйИдентификатор", СокрЛП(ИдентификаторИсточник)); СсылкаНаОбъект = Соединение.ПланыВидовХарактеристик[Значение.Метаданные().Имя].ПолучитьСсылку(ИдентификаторПолучатель); Если СсылкаНаОбъект.ПолучитьОбъект() = Неопределено Тогда НовыйЭлемент = Соединение.ПланыВидовХарактеристик[Значение.Метаданные().Имя].СоздатьЭлемент(); НовыйЭлемент.УстановитьСсылкуНового(СсылкаНаОбъект); НовыйЭлемент.Код = Значение.Код; НовыйЭлемент.ТипЗначения = Соединение.NewObject("ОписаниеТипов(""СправочникСсылка.Организации"")"); НовыйЭлемент.Наименование = Значение.Наименование; НовыйЭлемент.НазначениеСвойства = ПолучитьЗначениеПоВиду(Значение.НазначениеСвойства); НовыйЭлемент.Записать(); Возврат НовыйЭлемент.Ссылка; Иначе Возврат СсылкаНаОбъект; КонецЕсли; Вопрос номер 1. в таком виде Соединение.NewObject("ОписаниеТипов(""СправочникСсылка.Организации"")") не работает, вопрос номер два как из переменной Значение имеющий тип ПланыВидовХарактеристик, получить ИМЯ типа значения как оно задано в конфигураторе. Например Для Каждого Элемент Из Значение.ТипЗначения.Типы() Цикл Сообщить(Элемент) КонецЦикла; выдает Справочник ссылка: Организации, а нужно строку СправочникСсылка.Организации |
|||
1
sam_sam
06.12.09
✎
16:06
|
Соединение это переменная содержащая ссылку на базу COM
|
|||
2
sam_sam
06.12.09
✎
16:42
|
Ладно, нету так нету. Ну и на ссать на этот описание типов и на кривые руки разработчиков com соединения. В общем решил так, дабавил функцию в базу приемник, которая возвращает любой тип по переданной строке.
Типа так НовыйЭлемент.ТипЗначения = Соединение.ДопПроцедурыИФункции.ПолучитьТипПоЗначению(Строка(Значение.ТипЗначения)) |
|||
3
Stim
06.12.09
✎
17:34
|
посмотри здесь:
Книга знаний: v8: Охота на Com-ов; |
|||
4
sam_sam
06.12.09
✎
18:31
|
(3) ну какой же ты не в попад весь....
говорю, что нету там нормальной реализации этого метода. решил так, если кому интересно. СтрокаТипа = ""; Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение.НазначениеСвойства)) Тогда СтрокаТипа = "СправочникСсылка."; ОбъектСсылка = Новый (Значение.НазначениеСвойства); СтрокаТипа = СтрокаТипа + ОбъектСсылка.Метаданные().Имя; ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение.НазначениеСвойства)) Тогда СтрокаТипа = "ПланВидовХарактеристикСсылка."; ОбъектСсылка = Новый (ТипЗнч(Значение.НазначениеСвойства)); СтрокаТипа = СтрокаТипа + ОбъектСсылка.Метаданные().Имя; ИначеЕсли ТипЗнч(Значение.НазначениеСвойства) = Тип("Строка") Тогда СтрокаТипа = "Строка"; ИначеЕсли ТипЗнч(Значение.НазначениеСвойства) = Тип("Число") Тогда СтрокаТипа = "Число"; ИначеЕсли ТипЗнч(Значение.НазначениеСвойства) = Тип("Булево") Тогда СтрокаТипа = "Булево"; КонецЕсли; НовыйЭлемент.ТипЗначения = Соединение.ДопПроцедуры.ПолучитьТипПоЗначению(СтрокаТипа); в базе приемнике в модуле доступном по com пишем Функция ПолучитьТипПоЗначению(СтрокаЗначения) Экспорт Возврат Новый ОписаниеТипов(СтрокаЗначения); КонецФункции вроде работает, тестирую. |
|||
5
Рэйв
06.12.09
✎
18:35
|
Спр=Соединение.Справочники.Организации;
|
|||
6
sam_sam
06.12.09
✎
18:47
|
(5) ??????????
|
|||
7
Рэйв
06.12.09
✎
18:48
|
(6)Тебе нужен менеджер ? Или пустое значение вида справочника организаций?
(5) дает менеджер |
|||
8
sam_sam
06.12.09
✎
18:52
|
(7) Мне нужен в базе открытой по COM тип ОписаниеТипов("СправочникСсылка.Организации") полученный в базе открывающей по Com из какого то значения
зы завязываем тупить в (4) уже все решено. |
|||
9
sam_sam
06.12.09
✎
19:23
|
последний китайский рабочий вариант )))
ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда ИдентификаторИсточник = Значение.УникальныйИдентификатор(); ИдентификаторПолучатель = Соединение.NewObject("УникальныйИдентификатор", СокрЛП(ИдентификаторИсточник)); СсылкаНаОбъект = Соединение.ПланыВидовХарактеристик[Значение.Метаданные().Имя].ПолучитьСсылку(ИдентификаторПолучатель); Если СсылкаНаОбъект.ПолучитьОбъект() = Неопределено Тогда НовыйЭлемент = Соединение.ПланыВидовХарактеристик[Значение.Метаданные().Имя].СоздатьЭлемент(); НовыйЭлемент.УстановитьСсылкуНового(СсылкаНаОбъект); НовыйЭлемент.Код = Значение.Код; НовыйЭлемент.Наименование = Значение.Наименование; СтрокаТипа = ""; ТипЗначения = Значение.ТипЗначения.Типы(); Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗначения[0]) Тогда СтрокаТипа = "СправочникСсылка."; ОбъектСсылка = Новый (ТипЗначения[0]); СтрокаТипа = СтрокаТипа + ОбъектСсылка.Метаданные().Имя; ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипЗначения[0]) Тогда СтрокаТипа = "ПланВидовХарактеристикСсылка."; ОбъектСсылка = Новый (ТипЗначения[0]); СтрокаТипа = СтрокаТипа + ОбъектСсылка.Метаданные().Имя; ИначеЕсли ТипЗначения[0] = Тип("Строка") Тогда СтрокаТипа = "Строка"; ИначеЕсли ТипЗначения[0] = Тип("Число") Тогда СтрокаТипа = "Число"; ИначеЕсли ТипЗначения[0] = Тип("Булево") Тогда СтрокаТипа = "Булево"; КонецЕсли; НовыйЭлемент.ТипЗначения = Соединение.ДопПроцедуры.ПолучитьТипПоЗначению(СтрокаТипа); НовыйЭлемент.НазначениеСвойства = ПолучитьЗначениеПоВиду(Значение.НазначениеСвойства); НовыйЭлемент.Записать(); Возврат НовыйЭлемент.Ссылка; Иначе Возврат СсылкаНаОбъект; КонецЕсли; зы я юхею накрутили с этими типами офигеть просто можно, вот в семерке все просто было Тип,Вид, возвращало нормальную строку, а не всякую ...ету. |
|||
10
Stim
06.12.09
✎
19:26
|
(9) выложи полный код, я добавлю в базу знаний
|
|||
11
sam_sam
06.12.09
✎
19:27
|
собственно вот этот кусок, за все отвечает
СтрокаТипа = ""; ТипЗначения = Значение.ТипЗначения.Типы(); Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗначения[0]) Тогда СтрокаТипа = "СправочникСсылка."; ОбъектСсылка = Новый (ТипЗначения[0]); СтрокаТипа = СтрокаТипа + ОбъектСсылка.Метаданные().Имя; ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипЗначения[0]) Тогда СтрокаТипа = "ПланВидовХарактеристикСсылка."; ОбъектСсылка = Новый (ТипЗначения[0]); СтрокаТипа = СтрокаТипа + ОбъектСсылка.Метаданные().Имя; ИначеЕсли ТипЗначения[0] = Тип("Строка") Тогда СтрокаТипа = "Строка"; ИначеЕсли ТипЗначения[0] = Тип("Число") Тогда СтрокаТипа = "Число"; ИначеЕсли ТипЗначения[0] = Тип("Булево") Тогда СтрокаТипа = "Булево"; КонецЕсли; НовыйЭлемент.ТипЗначения = Соединение.ДопПроцедуры.ПолучитьТипПоЗначению(СтрокаТипа); в базе приементике в модуле доступном по COM Функция ПолучитьТипПоЗначению(СтрокаЗначения) Экспорт Возврат Новый ОписаниеТипов(СтрокаЗначения); КонецФункции можно все сообщения удалить, только это оставить. Может пригодится кому, если это решение единственно правильное конечно. |
|||
12
sam_sam
06.12.09
✎
19:29
|
(10) Лучше все сообщения потри кроме (9) и (11)
хоть какая то от тебя польза будет ))) |
|||
13
MishaSan
06.12.09
✎
21:07
|
СоединениеСБазойДанных.NewObject("ОписаниеТипов", "ПланВидовХарактеристикСсылка.СвойстваОбъектов");
Так не работатает? |
|||
14
sam_sam
06.12.09
✎
21:14
|
(13) Миша, ну где же ты был? :(
Я уже через зад зделал и все работает... |
|||
15
sam_sam
06.12.09
✎
21:28
|
ну да ладно, много переписывать не пришлось. Я думал у типов один только конструктор.
СтрокаТипа = ""; ТипЗначения = Значение.ТипЗначения.Типы(); Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗначения[0]) Тогда СтрокаТипа = "СправочникСсылка."; ОбъектСсылка = Новый (ТипЗначения[0]); СтрокаТипа = СтрокаТипа + ОбъектСсылка.Метаданные().Имя; ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипЗначения[0]) Тогда СтрокаТипа = "ПланВидовХарактеристикСсылка."; ОбъектСсылка = Новый (ТипЗначения[0]); СтрокаТипа = СтрокаТипа + ОбъектСсылка.Метаданные().Имя; ИначеЕсли ТипЗначения[0] = Тип("Строка") Тогда СтрокаТипа = "Строка"; ИначеЕсли ТипЗначения[0] = Тип("Число") Тогда СтрокаТипа = "Число"; ИначеЕсли ТипЗначения[0] = Тип("Булево") Тогда СтрокаТипа = "Булево"; КонецЕсли; НовыйЭлемент.ТипЗначения = Соединение.NewObject("ОписаниеТипов",СтрокаТипа) (13) Спасибо! Давай еще этот гнилой код формирования строки типа уберем. И лучше не нужно будет. ;) |
|||
16
MishaSan
06.12.09
✎
21:56
|
ТипЗначения = Значение.ТипЗначения.Типы();
СоединениеСБазойДанных.FromXMLType(XMLType(ТипЗначения[0])); не пробовал, но должно сработать |
|||
17
MishaSan
06.12.09
✎
21:56
|
НовыйЭлемент.ТипЗначения = СоединениеСБазойДанных.FromXMLType(XMLType(ТипЗначения[0]));
|
|||
18
MishaSan
06.12.09
✎
21:57
|
Значение = Справчники.Номенклатура.ПустаяСсылка();
НовыйЭлемент.ТипЗначения = СоединениеСБазойДанных.FromXMLType(СоединениеСБазойДанных.XMLTypeOf(Значение)) |
|||
19
MishaSan
06.12.09
✎
21:58
|
(18) неправильно
Значение = Справчники.Номенклатура.ПустаяСсылка(); НовыйЭлемент.ТипЗначения = СоединениеСБазойДанных.FromXMLType(XMLTypeOf(Значение)) |
|||
20
sam_sam
06.12.09
✎
22:06
|
(19) FromXMLType такого даже СП не знает. Где ты его нарыл?
Сейчас попробую. |
|||
21
sam_sam
06.12.09
✎
22:17
|
{Форма.Форма(74)}: Ошибка при вызове метода контекста (FromXMLType): Произошла исключительная ситуация: Несоответствие типов (параметр номер '1')
НовыйЭлемент.ТипЗначения = Соединение.FromXMLType(XMLTypeOf(Значение)); по причине: Произошла исключительная ситуация: Несоответствие типов (параметр номер '1') Ладно в общем, лучшее враг хорошего. Оставлю так как есть, работает и ладно. |
|||
22
sam_sam
06.12.09
✎
22:29
|
(19) А стоп, так же нельзя делать. Так получается, что ты в com базу передаешь тип который создан в другой базе. Конечно оно матеирится будет. Туда нужно передавать тип созданный там. А это в контексте этой задачи масло маслянное.
|
|||
23
MishaSan
06.12.09
✎
22:31
|
А так?
Соединение.FromXMLType(XMLTypeOf(Справочники.Номенклатура.ПустаяСсылка()).ИмяТипа, "") |
|||
24
sam_sam
06.12.09
✎
22:33
|
(23) а так мне зачем?
У меня сейчас вопрос, мне всего то нужна строка вида "СправочникСсылка.Организации", я могу вытянуть только в таком виде Справочник ссылка: Организации. Отсюда и канитель со строкой. |
|||
25
MishaSan
06.12.09
✎
22:34
|
Так точно работает.
Ком_Тип = Соединение.ИзXMLТипа(XMLTypeOf(Справочники.Номенклатура.ПустаяСсылка()).ИмяТипа, XMLTypeOf(Справочники.Номенклатура.ПустаяСсылка()).URIПространстваИмен); |
|||
26
sam_sam
06.12.09
✎
22:39
|
(25) чего то в другую сторону мне кажется.
Смотри у плана обмена есть свойство ТипЗначения, оно может иметь тип Число, строка, дата, СправочникСсылка.Организации, СправочникСсылка.Тататат,....... Так вот его и нужно назначать в зависимости от хранящегося там значения. |
|||
27
sam_sam
06.12.09
✎
22:39
|
(+26) так я максимум что получу, так это тип СправочникСсылка.Номенклатура
|
|||
28
Шурик71
06.12.09
✎
22:40
|
(24) Этого хватит?
Результат = V8.String(Источник.Метаданные().ПолноеИмя()); |
|||
29
MishaSan
06.12.09
✎
22:45
|
Чёрт Справочники.Номенклатура.ПустаяСсылка() -> Значение
|
|||
30
sam_sam
06.12.09
✎
22:48
|
ТипЗначения = Значение.ТипЗначения.Типы();
ОбъектСсылка = Новый (ТипЗначения[0]); Имя = ОбъектСсылка.Метаданные().ПолноеИмя(); вот так нужно было. (28) навел на мысль. Есть! (29) Да не это все не то. зы однако тупняк меня сегодня разобрал не подецки, спасибо всем. |
|||
31
sam_sam
06.12.09
✎
22:51
|
Соответственно сказанное в (2) тоже назад забираю. ))))
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |