Имя: Пароль:
1C
1С v8
Получение ссылки на элемент ПВХ через COM-коннектор
0 SmartUseless
 
20.12.12
16:30
People общеизвестен код получения ссылки на ПВХ
СвойствоКодПроизводителя=ПланыВидовХарактеристик.СвойстваОбъектов.Найт
иПоНаименованию("Код производителя");
которую потом можно использовать в качестве параметра в запросе для получения значения свойства для заданной номеклатуры:
                   ЗапросЗначСвойствПроизв.Текст = "ВЫБРАТЬ
                                   |    ЗначенияСвойствОбъектов.Значение
                                   |ИЗ
                                   |    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
                                   |ГДЕ
                                   |    ЗначенияСвойствОбъектов.Объект = &Объект
                                   |    И ЗначенияСвойствОбъектов.Свойство = &Свойство";
Вопрос как это сделать в БД, к которой подключен через ком-коннектор:    


   V82=Новый COMОбъект("V82.ComConnector");
   Попытка
       ВнешняяБД=V82.Connect(СтрокаПодключения);        
   Исключение
       сообщить("База не может быть открыта");
       Возврат Ложь;    
   КонецПопытки;    

Будет ли работать код подобно этому:
ВнешняяБД.СвойствоКодПроизводителя=ПланыВидовХарактеристик.СвойстваОбъектов.Найт
иПоНаименованию("Код производителя");
1 Kashemir
 
20.12.12
16:32
Мутабельные объекты нельзя передавать. Заверни в строку любым известным тебе способом и разверни на вызывающей стороне.
2 Kashemir
 
20.12.12
16:33
ВнешняяБД.СвойствоКодПроизводителя=ВнешняяБД.ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Код производителя");
3 SmartUseless
 
20.12.12
16:34
Или надо работать через запрос
пытаться получить сслылку на элемент ПВХ:
Запрос=ВнешняяБД.NewObject("Запрос");а в запросе по коду как параметру выполнять запрос к ПВХ ?
4 SmartUseless
 
20.12.12
16:35
(2)Так значит через СОМ-коннектор поиск по наименованию работает?
5 Kashemir
 
20.12.12
16:36
(4) Передавать можно простые типы строка, число, дата булево.
В твоем случае наименование строка - пользуй ради бога, только не забывай на какой-то стороне ты значение получаешь и на какой применяешь.
6 vmv
 
20.12.12
16:40
(0) я делал так для решения проблемы озвученной в (1), которой не избежать.

1. Созавал в базе Приемнике(Источнике) общий серверный модуль

АДД_COMконнектор

там методы

ПолучитьСсылкуВЭтойБазеПоГУИДизВнешней(СтрокаГУИД_Источник, ИмяОбъектаМд_Приемник)

вариант вызова

из базы источника

СомСоединениеСИб.АДД_COMконнектор("Строка(ГУИД)", "Справочник.Номенклатура")

ну как-то так и там временное хранилище можно заюзать для передачи примитивных коллекций по сом-соединиею в базе приемнике, например массив гуидов, соотвестввие и пр.

все работало, лень искать готовые меоды у себя в ворохе баз, ну разве что за 500К
7 SmartUseless
 
20.12.12
16:43
(6) мыло напиши или аську для конекта
8 Kashemir
 
20.12.12
16:45
ЗаписьXML = Новый ЗаписьXML;
   ЗаписьXML.УстановитьСтроку();
   СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ЛюбоеЗначение);
   СтрокаХМЛ = ЗаписьXML.Закрыть();
   
   
   
   ЧтениеXML = ВнешняяБД.СоздатьОбъект("ЧтениеXML");
   ЧтениеXML.УстановитьСтроку(СтрокаХМЛ);
   ЗначениеНаСторонеВнешнейБД = ВнешняяБД.СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
9 Kashemir
 
20.12.12
16:47
+(8) На скорую писал, потому по мелочам мог ошибится
ВнешняяБД.NewObject("ЧтениеXML");
10 SmartUseless
 
20.12.12
16:50
Ну это решение через так называемый технологию универсального обмена данными УОД, тоже надо покрутить..
11 Kashemir
 
20.12.12
16:56
(10) Универсальные решения всяко полезнее чем функционал требующий изменений конфы.
12 Serginio1
 
20.12.12
16:58
(20) Иногда не все методы идут через внешнее соединение например из 7 ки Поэтому я сделал внешнийюОбработку, что бы не корочить конфигурацию
Добавил функции в модуль обработки
Функция ВычислитьВыражение(Выражение) Экспорт
 возврат вычислить(Выражение);    
КонецФункции

Функция ВычислитьСвойствоОбъекта(Объект,Свойство) Экспорт
 возврат Объект[Свойство];    
КонецФункции

и вызов
ДляВнешнегоСоединения= Сервер.ВнешниеОбработки.Создать(ПутьКОбработке);

Если Мета="Справочник" Тогда
           Объект=ДляВнешнегоСоединения.ВычислитьВыражение            ИначеЕсли Мета="Документ" Тогда
           Объект=ДляВнешнегоСоединения.ВычислитьВыражение("Документы."+ВидПриемник+".СоздатьДокумент()");
           ДляВнешнегоСоединения.ВычислитьСвойствоОбъекта(Объект,ТЧПриемника).Добавить();
               Иначе

           Объект=ДляВнешнегоСоединения.ВычислитьВыражение("РегистрыНакопления."+ВидПриемник+".СоздатьНаборЗаписей()");
КонецЕсли;
13 SmartUseless
 
20.12.12
16:59
(11) ну мне для запроса к регистру сведений нужно только два параметра ссылку на номеклатуру и ссылку на элеемент ПВХ, может удастся обойтись методом НайтиПоНаименованию через КОМ-коннектор?
14 vmv
 
20.12.12
16:59
надо забить в общий модуль сом-коннектируемых баз группу поддержки


Функция НайтиЭлементСпрПоGUID   (GUID, ИмяМетаданных, ОбъектСсылка = Неопределено) Экспорт
   
   ТипМетаданных  = "Справочник";
   ОбъектМенеджер = Справочники[ИмяМетаданных];
   
   Если Строка(GUID) = XMLСтрока(ОбъектМенеджер.ПустаяСсылка()) Тогда
       ОбъектСсылка = ОбъектМенеджер.ПустаяСсылка();
       Возврат "";
   КонецЕсли;
   
   ОбъектСсылка = ПолучитьСсылкуПоGUIDиИдентификациии(GUID, ТипМетаданных, ИмяМетаданных, ОбъектМенеджер);    
   
   Если ОбъектСсылка.Пустая() Тогда
       Возврат "";
   Иначе    
       Возврат Строка(ОбъектСсылка);
   КонецЕсли;
   
КонецФункции
Функция НайтиДокументПоGUID     (GUID, ИмяМетаданных, ОбъектСсылка = Неопределено) Экспорт
   
   ТипМетаданных  = "Документ";
   ОбъектМенеджер = Документы[ИмяМетаданных];
   
   Если Строка(GUID) = XMLСтрока(ОбъектМенеджер.ПустаяСсылка()) Тогда
       ОбъектСсылка = ОбъектМенеджер.ПустаяСсылка();
       Возврат "";
   КонецЕсли;
   
   ОбъектСсылка = ПолучитьСсылкуПоGUIDиИдентификациии(GUID, ТипМетаданных, ИмяМетаданных, ОбъектМенеджер);    
   
   Если ОбъектСсылка.Пустая() Тогда
       Возврат "";
   Иначе    
       Возврат Строка(ОбъектСсылка);
   КонецЕсли;
   
КонецФункции
Функция НайтиПланВидовХрПоGUID  (GUID, ИмяМетаданных, ОбъектСсылка = Неопределено) Экспорт
   
   ТипМетаданных  = "ПланВидовХарактеристик";
   ОбъектМенеджер = ПланыВидовХарактеристик[ИмяМетаданных];
   
   Если Строка(GUID) = XMLСтрока(ОбъектМенеджер.ПустаяСсылка()) Тогда
       ОбъектСсылка = ОбъектМенеджер.ПустаяСсылка();
       Возврат "";
   КонецЕсли;
   
   ОбъектСсылка = ПолучитьСсылкуПоGUIDиИдентификациии(GUID, ТипМетаданных, ИмяМетаданных, ОбъектМенеджер);    
   
   Если ОбъектСсылка.Пустая() Тогда
       Возврат "";
   Иначе    
       Возврат Строка(ОбъектСсылка);
   КонецЕсли;
   
КонецФункции
Функция НайтиПланСчетовПоGUID   (GUID, ИмяМетаданных, ОбъектСсылка = Неопределено) Экспорт
   
   ТипМетаданных  = "ПланСчетов";
   ОбъектМенеджер = ПланыСчетов[ИмяМетаданных];
   
   Если Строка(GUID) = XMLСтрока(ОбъектМенеджер.ПустаяСсылка()) Тогда
       ОбъектСсылка = ОбъектМенеджер.ПустаяСсылка();
       Возврат "";
   КонецЕсли;
   
   ОбъектСсылка = ПолучитьСсылкуПоGUIDиИдентификациии(GUID, ТипМетаданных, ИмяМетаданных, ОбъектМенеджер);    
   
   Если ОбъектСсылка.Пустая() Тогда
       Возврат "";
   Иначе    
       Возврат Строка(ОбъектСсылка);
   КонецЕсли;
   
КонецФункции
Функция НайтиПланВидовРсПоGUID  (GUID, ИмяМетаданных, ОбъектСсылка = Неопределено) Экспорт
   
   ТипМетаданных  = "ПланВидовРасчета";
   ОбъектМенеджер = ПланыВидовРасчета[ИмяМетаданных];
   
   Если Строка(GUID) = XMLСтрока(ОбъектМенеджер.ПустаяСсылка()) Тогда
       ОбъектСсылка = ОбъектМенеджер.ПустаяСсылка();
       Возврат "";
   КонецЕсли;
   
   ОбъектСсылка = ПолучитьСсылкуПоGUIDиИдентификациии(GUID, ТипМетаданных, ИмяМетаданных, ОбъектМенеджер);    
   
   Если ОбъектСсылка.Пустая() Тогда
       Возврат "";
   Иначе    
       Возврат Строка(ОбъектСсылка);
   КонецЕсли;
   
КонецФункции
Функция НайтиБизнесПроцессПоGUID(GUID, ИмяМетаданных, ОбъектСсылка = Неопределено) Экспорт
   
   ТипМетаданных  = "БизнесПроцесс";
   ОбъектМенеджер = БизнесПроцессы[ИмяМетаданных];
   
   Если Строка(GUID) = XMLСтрока(ОбъектМенеджер.ПустаяСсылка()) Тогда
       ОбъектСсылка = ОбъектМенеджер.ПустаяСсылка();
       Возврат "";
   КонецЕсли;
   
   ОбъектСсылка = ПолучитьСсылкуПоGUIDиИдентификациии(GUID, ТипМетаданных, ИмяМетаданных, ОбъектМенеджер);    
   
   Если ОбъектСсылка.Пустая() Тогда
       Возврат "";
   Иначе    
       Возврат Строка(ОбъектСсылка);
   КонецЕсли;
   
КонецФункции
Функция НайтиЗадачуПоGUID       (GUID, ИмяМетаданных, ОбъектСсылка = Неопределено) Экспорт
   
   ТипМетаданных  = "Задача";
   ОбъектМенеджер = Задачи[ИмяМетаданных];
   
   Если Строка(GUID) = XMLСтрока(ОбъектМенеджер.ПустаяСсылка()) Тогда
       ОбъектСсылка = ОбъектМенеджер.ПустаяСсылка();
       Возврат "";
   КонецЕсли;
   
   ОбъектСсылка = ПолучитьСсылкуПоGUIDиИдентификациии(GUID, ТипМетаданных, ИмяМетаданных, ОбъектМенеджер);    
   
   Если ОбъектСсылка.Пустая() Тогда
       Возврат "";
   Иначе    
       Возврат Строка(ОбъектСсылка);
   КонецЕсли;
   
КонецФункции
Функция НайтиПланОбменаПоGUID   (GUID, ИмяМетаданных, ОбъектСсылка = Неопределено) Экспорт
   
   ТипМетаданных  = "ПланОбмена";
   ОбъектМенеджер = ПланыОбмена[ИмяМетаданных];
   
   Если Строка(GUID) = XMLСтрока(ОбъектМенеджер.ПустаяСсылка()) Тогда
       ОбъектСсылка = ОбъектМенеджер.ПустаяСсылка();
       Возврат "";
   КонецЕсли;
   
   ОбъектСсылка = ПолучитьСсылкуПоGUIDиИдентификациии(GUID, ТипМетаданных, ИмяМетаданных, ОбъектМенеджер);    
   
   Если ОбъектСсылка.Пустая() Тогда
       Возврат "";
   Иначе    
       Возврат Строка(ОбъектСсылка);
   КонецЕсли;
   
КонецФункции

а ваббще скачай конфу "СЭД "Документооборот Проф." но не чистый документоборот 1С а от команиии "Аналитика. Проекты и решения"

там неплохой функционал по ком-коннекторах, некоторые идеи поравились, некторые допилил. Важно помнить что из внешней базы(источника) можно попасть с ее мутабельными (внешними данными) и на клиент приемника, если использовать общие модули с обеих сторон и передавать на клиенты используя внешние хранилища, но передаваемые данные(коллеекции) дожны быть приметивных типов (имена реквизитов, ГУИДы как хмл-строка и т.д.)

это все
15 Kashemir
 
20.12.12
17:00
(13) Тогда тебе хватит и (2)
16 vmv
 
20.12.12
17:02
последнее замечание в контексте 82 надо раз и навсегда забыть, что существует глобальная коллекция Метаданные и использовать аналогичные методы хмл для поиска классов таблиц, самих таблиц, свойств, типов и т.д.

Т.е. использовать в 8.2 констурукции вида Метаданные.Справочники.Трулаляля - расстрел на месте
17 vmv
 
20.12.12
17:04
+(14) довесок к группе поддержки

//
// Используется когда Ссылка получена посредством ОбъектМенеджер.ПолучитьСсылку(GUID)
//
// Для проверки "заполненности" ссылки можно использовать  ОбъектСсылка.ПолучитьОбъект() = Неопределено,
// но запросом более универсально с точки зрения контроля доступа.
//
Функция СуществуетОбъектПоСсылке(ОбъектСсылка, ТипМетаданных, ИмяМетаданных) Экспорт
   
   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ " + ТипМетаданных + "." + ИмяМетаданных + " ГДЕ Ссылка=&ОбъектСсылка";
   Запрос.Параметры.Вставить("ОбъектСсылка", ОбъектСсылка);
   
   Выборка = Запрос.Выполнить().Выбрать();
   
   Если Выборка.Следующий() Тогда
       Возврат Истина;
   Иначе
       Возврат Ложь;
   КонецЕсли;
   
КонецФункции


Функция ПолучитьСсылкуПоGUIDиИдентификациии(GUID, ТипМетаданных, ИмяМетаданных, ОбъектМенеджер) Экспорт
   
   Если ТипЗнч(GUID) = Тип("Строка") Тогда
       _GUID = Новый УникальныйИдентификатор(GUID);
   Иначе    
       _GUID = GUID;
   КонецЕсли;
   
   ОбъектСсылка = ОбъектМенеджер.ПолучитьСсылку(_GUID);
   
   Если Не СуществуетОбъектПоСсылке(ОбъектСсылка, ТипМетаданных, ИмяМетаданных) Тогда
       ОбъектСсылка = ОбъектМенеджер.ПустаяСсылка();
   КонецЕсли;
   
   Возврат ОбъектСсылка;
   
КонецФункции
18 Kashemir
 
20.12.12
17:06
(6) Кстати зачем столько сложностей ради получения ссылки ?

ВнешняяБД.Справочники.Номенклатура.ПолучитьСсылку(ВнешняяБД.NewObject("УникальныйИдентификатор", "dfeaf1c7-7f8f-11df-92fe-0024e83b55b7"))
19 Serginio1
 
20.12.12
17:08
Должноработать
ВнешняяБД.СвойствоКодПроизводителя=ВнешняяБД.ПланыВидовХарактеристик.СвойстваОбъектов.Найт
иПоНаименованию("Код производителя");
20 Serginio1
 
20.12.12
17:12
А если у тебя известен GUID
УИД=Сервер.NewObject("УникальныйИдентификатор","22151195-0def-11e2-b65b-c86000c70663");
           Регистратор=Сервер.Документы.КорректировкаЗаписейРегистров.ПолучитьСсылку(УИД);
21 SmartUseless
 
20.12.12
17:24
Млин People, ну креатив-то раскорегарился, главное теперь все переварить, ни одного бита не пролить..
22 Serginio1
 
25.12.12
17:39