Имя: Пароль:
1C
 
описание типов через 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
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) тоже назад забираю. ))))