Имя: Пароль:
1C
1С v8
v8: Проблема СОM соединение
0 Alpachino
 
20.02.13
15:40
Написал обработку,которая интегрирует с др базами 8.2. Получилось следующее:
СписокБаз = Новый ТаблицаЗначений;
СписокБаз.Колонки.Добавить("Фирма",Новый ОписаниеТипов(,,Новый КвалификаторыСтроки(50)));
СписокБаз.Колонки.Добавить("IP_сервера",Новый ОписаниеТипов(,,Новый КвалификаторыСтроки(50)));
СписокБаз.Колонки.Добавить("ИмяБазы",Новый ОписаниеТипов(,,Новый КвалификаторыСтроки(50)));
СписокБаз.Колонки.Добавить("ИмяПользователя",Новый ОписаниеТипов(,,Новый КвалификаторыСтроки(50)));
СписокБаз.Колонки.Добавить("ПарольПользователя",Новый ОписаниеТипов(,,Новый КвалификаторыСтроки(50)));
   
//////1 база    
НовСтр = СписокБаз.Добавить();
НовСтр.Фирма = Справочники.Фирмы.НайтиПоКоду("4");
НовСтр.IP_сервера = "********";
НовСтр.ИмяБазы = "*****";
НовСтр.ИмяПользователя = "*****";
НовСтр.ПарольПользователя = "*****";

//2 база
НовСтр = СписокБаз.Добавить();
НовСтр.Фирма = Справочники.Фирмы.НайтиПоКоду("5");
НовСтр.IP_сервера = "*****";
НовСтр.ИмяБазы = "******";
НовСтр.ИмяПользователя = "*****";
НовСтр.ПарольПользователя = "*****";
   
НайденныйУзел = СписокБаз.Найти(Фирма, "Фирма");
   Если НайденныйУзел <> Неопределено Тогда
       
       Попытка
Соединитель = Новый ComObject ("V82.COMConnector");
Состояние("Соединение с базой " + НайденныйУзел.ИмяБазы);
Соединение = Соединитель.Connect("Srvr="""+НайденныйУзел.IP_сервера+""";Ref="""+НайденныйУзел.ИмяБазы+""";Usr="""+НайденныйУзел.ИмяПользователя+""";Pwd="""+НайденныйУзел.ПарольПользователя+""";")
       Исключение
Предупреждение("Не удалось установить соединение с базой "+НайденныйУзел.ИмяБазы+" по причине: "    +Символы.ПС+ОписаниеОшибки());
           возврат
КонецПопытки;
ЗапросКОМ = Соединение.NEWOBJECT("Запрос");
ЗапросКОМ.Текст = "ВЫБРАТЬ
|РасчетыСПокупателями.Регистратор КАК Документ,
|ЛОЖЬ КАК Флаг
|ИЗ
|РегистрНакопления.РасчетыСПокупателями КАК РасчетыСПокупателями
|ГДЕ
|РасчетыСПокупателями.Регистратор ССЫЛКА Документ.УслугиПокупателю
|    И РасчетыСПокупателями.Период МЕЖДУ &ДатаНачало И &ДатаКонец
|    И РасчетыСПокупателями.Фирма = &Фирма
|    И РасчетыСПокупателями.Контрагент = &Контрагент
|    И РасчетыСПокупателями.Договор = &Договор";
ЗапросКОМ.УстановитьПараметр("ДатаНачало",ЗапросКОМ.УстановитьПараметр("ДатаНачало",НачалоДня(ДатаНачало)));
ЗапросКОМ.УстановитьПараметр("ДатаКонец",ЗапросКОМ.УстановитьПараметр("ДатаКонец",КонецДня(ДатаКонец)));
ЗапросКОМ.УстановитьПараметр("Фирма", ЗапросКОМ.УстановитьПараметр("Фирма",Фирмы));
ЗапросКОМ.УстановитьПараметр("Контрагент",ЗапросКОМ.УстановитьПараметр("Контрагент",Контрагент));
ЗапросКОМ.УстановитьПараметр("Договор",ЗапросКОМ.УстановитьПараметр("Договор",Договор));
ДокументыУслугиПокупателю.Загрузить(ЗапросКОМ.Выполнить().Выгрузить());
КонецЕсли;



Ошибка выходит при ЗапросКом.Выпонлнить() и Реквизиты: ДатаНачало,ДатаКонец, Фирма, Контрагент и Договор указываются в форме обработки. Как их правильно передать, чтобы по заданным значениям она находила в других базах ?????
1 GLazNik
 
20.02.13
15:42
Что это?
ЗапросКОМ.УстановитьПараметр("ДатаНачало",ЗапросКОМ.УстановитьПараметр("ДатаНачало",НачалоДня(ДатаНачало)));
А про контрагентов и договоров олешная база даже и не знает
2 Alpachino
 
20.02.13
15:43
(0) Выдает такую ошибку

{ВнешняяОбработка.АСУ_ПодборНаОснованииРеализацииИзПодчиненныхОрганизаций.МодульОбъекта(81)}: Поле объекта не обнаружено (Фирма)
ЗапросКОМ.УстановитьПараметр("Фирма", ЗапросКОМ.УстановитьПараметр("Фирма",Фирмы));
3 Лодырь
 
20.02.13
15:44
Даты ты можешь передать просто, а справочники тебе придется передавать через некие ключи. Например контрагентов через ИНН, договора через номер договора и так далее.
4 афаф
 
20.02.13
15:48
Еще бы он не выдавал.
Вместо вот этого:
ЗапросКОМ.УстановитьПараметр("Договор",ЗапросКОМ.УстановитьПараметр("Договор",Договор));
Пишем:
ЗапросКОМ.УстановитьПараметр("Договор",Договор);
Только учитывайте, что если Договор - ссылка из локальной базы - работать не будет, т.к. база с которой установлено соединение ничего не знает о том, что водится в базе в которой вы сидите.

Если нужно передать именно ссылку в базе с которой установлено соединение, то нужно делать что то вроде:
МойДоговор = Соединение.Справочники.Договоры.НайтиПоКоду(МойКод);
и уже полученный МойДоговор отдавать в виде параметра запросу.
5 GLazNik
 
20.02.13
15:50
+(4) либо в запросе оперировать примитивными типами: число, строка, дата, булево. Например:

И РасчетыСПокупателями.Контрагент.Код = &КодКонтрагента
6 Alpachino
 
20.02.13
15:57
(5) Хм, как я понял, ради того что бы вытащит Документ, придется в запросе и учитывать котрагента,фирму и договор?
т.е.
ЗапросКОМ = Соединение.NEWOBJECT("Запрос");
ЗапросКОМ.Текст = "ВЫБРАТЬ
|РасчетыСПокупателями.Регистратор КАК Документ,
|ЛОЖЬ КАК Флаг
|ИЗ
|РегистрНакопления.РасчетыСПокупателями КАК РасчетыСПокупателями
|ГДЕ
|РасчетыСПокупателями.Регистратор ССЫЛКА Документ.УслугиПокупателю
|    И РасчетыСПокупателями.Период МЕЖДУ &ДатаНачало И &ДатаКонец
|И РасчетыСПокупателями.Контрагент.Код = &КодКонтрагента
|И РасчетыСПокупателями.Фирма.Код = &КодФирма
|И РасчетыСПокупателями.Договор.Код = &КодДоговор"; ????
7 Alpachino
 
20.02.13
16:00
(4) Нужно передать ссылку с которой устан-но соединение.

Можно по подробнее!?
8 Alpachino
 
20.02.13
16:31
(4) Попробовал написать как ты предложил, но у меня договоров очень много,у меня нет желания прописывать все коды договоров!

ИЛИ Я ТЕБЯ НЕ ПОНЯЛ)))

Мне хотелось бы по указанным данным в реквизитах обработки, находил значения в другой базе!? Как быть в этом случаем!?
9 Vaflya
 
20.02.13
16:46
...СОМ = СОМConnector;....

СОМЗапрос = СОМ.NewObject("Запрос");
СОМЗапрос.Текст = "";
СОМЗапрос.УстановитьПараметр("Параметр", СОМ.Справочники.Договора.НайтиПоКоду(ЭтаОбработка.Договор.Код));

в этом случае номера договоров должны быть одинаковыми в обеих базах. ну тут уже вопрос синхронизации баз, считаю что GIUDы в этом плане рулят --> "Мне хотелось бы по указанным данным в реквизитах обработки, находил значения в другой базе!? Как быть в этом случаем!?"
10 zladenuw
 
20.02.13
16:49
(0) я бы тянул данные для отбора с бази источника и их же передавал в запрос
11 Alpachino
 
21.02.13
08:37
(9) Благодарю, помогло))
12 Alpachino
 
21.02.13
13:45
Еще 1 вопрос интересует уважаемые форумчане...

ЗапросКОМ = Соединение.NEWOBJECT("Запрос");
ЗапросКОМ.Текст = " ВЫБРАТЬ
|РасчетыСПокупателями.Регистратор КАК Документ,
|ЛОЖЬ КАК Флаг
|ИЗ
|РегистрНакопления.РасчетыСПокупателями КАК РасчетыСПокупателями
|ГДЕ
|РасчетыСПокупателями.Регистратор ССЫЛКА Документ.УслугиПокупателю
|
|    И РасчетыСПокупателями.Фирма = &Фирма
||    И РасчетыСПокупателями.Договор = &Договор";

ЗапросКОМ.УстановитьПараметр("Параметр", СОМ.Справочники.Договора.НайтиПоНаименованию(ЭтотОбъект.Договор.Наименование));
ЗапросКОМ.УстановитьПараметр("Параметр", СОМ.Справочники.Фирмы.НайтиПоНаименованию(ЭтотОбъект.Фирма.Наименование));

Результат = ЗапросКОМ.Execute().Choose();
       
ЭтотОбъект.ДокументыУслугиПокупателю.Загрузить(Результат);



Почему спотыкается на ЭтотОбъект.ДокументыУслугиПокупателю.Загрузить(Результат)

Как быть!?
13 ДенисЧ
 
21.02.13
13:46
(12) Это ты хочешь ком-объекты в документ грузить? О)о
14 GANR
 
21.02.13
13:59
Если одна база - копия другой, то ещё можно так:

КонтрагентКОМ = СОМ.ЗначениеИзСтрокиВнутр(ЗначениеВСтрокуВнутр(Контрагент));
ЗапросКОМ.УстановитьПараметр("Контрагент", КонтрагентКОМ);
15 Alpachino
 
21.02.13
14:00
(13) На форме обработки создана ТЧ "ДокументыУслугиПокупателю", хочу чтобы через КОМ-объекты вытащить список док-в.
16 GANR
 
21.02.13
14:00
(12) ВДУМЧИВО см. (14)
17 Alpachino
 
21.02.13
14:01
(14) Базы одинаковы.
18 GANR
 
21.02.13
14:01
Контрагент = ЗначениеИзСтрокиВнутр(COM.ЗначениеВСтрокуВнутр(КонтрагентКОМ));
19 GANR
 
21.02.13
14:02
(17) для (12) используй (18), для каждого столбца и строки ТаблицаЗначенийКОМ = Результат.Выгрузить()
20 GANR
 
21.02.13
14:04
P.S. Я в свое время таким макаром (19) подсунул старые проводки документов из архивной копии базы после неудачного перепроведения.
21 Alpachino
 
21.02.13
14:06
(14) ЗапросКОМ.УстановитьПараметр("Параметр", СОМ.Справочники.Договора.НайтиПоНаименованию(ЭтотОбъект.Договор.Наименование));
ЗапросКОМ.УстановитьПараметр("Параметр", СОМ.Справочники.Фирмы.НайтиПоНаименованию(ЭтотОбъект.Фирма.Наименование));

Через отладку проходит нормально, определяет номер, но ссылку док-та он не видет, помечает как (КОМ - объект) и когда начинаю выгружать то в ТЧ.Документ пустой, а флаг есть....
22 Alpachino
 
21.02.13
14:08
(20) Я хочу выгрузить док-ты в ТЧ и потом производить с ними другие операции, т.е. создавать на основании их др.докты.


Вот в чем вся суть обработки.
23 Alpachino
 
21.02.13
14:09
(20) GANR, а выгружаемые КОМ-объекты можно открывать,просматривать?
24 hhhh
 
21.02.13
14:09
(21) ну тип какой задан в колонке ТЧ.Документ?
25 Alpachino
 
21.02.13
14:10
(24) Тип указан, как ДокументСсылка.УслугиПокупателю.
26 GANR
 
21.02.13
14:13
(22) Оооо... Если нужно создать документы со всеми потрохами, то используй обработку ВыгрузкаЗагрузкаДанныхXML (можно из кода), свой план обмена нехитрый сделать, или стандартную подсистему ОбменДанными (если нет - из БСП выдрать) если нужно только изменения перегонять.
27 Alpachino
 
21.02.13
14:15
(20) Результат =Запрос.Execute().Choose();
Для каждого стр из Результат Цикл
нс = ДокументыУслугиПокупателю.Добавить();
нс.Флаг = Результат.Columns.флаг;
нс.Документ = Результат.Columns.Документ.Номер;
КонецЦикла;


Ты имел в виду таким образом??
28 hhhh
 
21.02.13
14:19
(23) естественно можно просматривать, но только если ты специальную форму нарисуешь, у нее должны быть поля естественно только типа строки, числа и даты и их ты будешь из своего ком-объекта заполнять.
29 Alpachino
 
21.02.13
14:22
(28) сейчас подправлю тип поля на строку,посмотрим, что будет)
30 GANR
 
21.02.13
14:23
(27) примерно так:

РезультатКОМ =Запрос.Execute().Unload();
МояТЗ = Новый ТаблицаЗначений;
// создаем колонки ТЗ
// это можно циклом сделать, перебрав колонки РезультатКОМ, а можно так:
//
// МояТЗ = АналогичныйЗапросКЭтойБазе.Выполнить().Выгрузить();
// МояТЗ.Очистить();

Для Каждого Стр из Результат Цикл
   НоваяСтрока = МояТЗ.Добавить();
   Для каждого Колонка Из Результат Цикл
       НоваяСтрока[Колонка.Имя] = ЗначениеИзСтрокиВнутр(COM.ЗначениеВСтрокуВнутр(Стр[Колонка.Имя]));
   КонецЦикла
КонецЦикла;

Но в моем случае (20) объекты, на которые ссылались значения НоваяСтрока[Колонка.Имя] существовали в текущей базе.
31 GANR
 
21.02.13
14:24
РезультатКОМ =Запрос.Execute().Unload();
МояТЗ = Новый ТаблицаЗначений;

// создаем колонки ТЗ
// это можно циклом сделать, перебрав колонки РезультатКОМ, а можно так:
//  
// МояТЗ = АналогичныйЗапросКЭтойБазе.Выполнить().Выгрузить();
// МояТЗ.Очистить();

Для Каждого Стр из РезультатКОМ Цикл
   НоваяСтрока = МояТЗ.Добавить();
   Для каждого Колонка Из РезультатКОМ.Колонки Цикл
       НоваяСтрока[Колонка.Имя] = ЗначениеИзСтрокиВнутр(COM.ЗначениеВСтрокуВнутр(Стр[Колонка.Имя]));
   КонецЦикла
КонецЦикла;
32 GANR
 
21.02.13
14:24
в (30) - ошибки в коде
33 Alpachino
 
21.02.13
14:45
(32) Сейчас испытаю, как оговорино)
34 Alpachino
 
21.02.13
15:06
(31)GANR, как я понял через  запрос

ЗапросКОМ = Соединение.NEWOBJECT("Запрос");
ЗапросКОМ.Текст = " ВЫБРАТЬ
|РасчетыСПокупателями.Регистратор КАК Документ,
|......................;
Результат = ЗапросКОМ.Execute().Choose();
ЭтотОбъект.ДокументыУслугиПокупателю.Загрузить(Результат);

выгруженные док-ты из др.базы в виде ссылок,а затем для получения данных из этих док-тов не обойтись только!?
35 GANR
 
21.02.13
15:12
(34) не понял
этот код - 100% нерабочий
РезультатКОМ = Запрос.Execute().Choose(); // это выборка
ЭтотОбъект.ДокументыУслугиПокупателю.Загрузить(Результат); // а ты её пытаешься загрузить, да ещё в виде COM !!!

вот так хотя-бы, чтоб ссылки загнать:

Результат = Запрос.Execute().UNLOAD();

Для Каждого Стр из Результат Цикл
   НоваяСтрока = ЭтотОбъект.ДокументыУслугиПокупателю.Добавить();
   Для каждого Колонка Из Результат.Колонки Цикл
       НоваяСтрока[Колонка.Имя] = ЗначениеИзСтрокиВнутр(COM.ЗначениеВСтрокуВнутр(Стр[Колонка.Имя]));
   КонецЦикла
КонецЦикла;
36 Alpachino
 
21.02.13
16:35
(35) GANR не видит он
ЗначениеИзСтрокиВнутр(COM.ЗначениеВСтрокуВнутр(Стр[Колонка.Имя]))
37 Alpachino
 
21.02.13
16:46
а именно не понимает """ЗначениеВСтрокуВнутр"""
38 GANR
 
21.02.13
16:53
(37) попробуй по латыни ValueToStringInternal
39 GANR
 
21.02.13
17:02
(38) хм... похоже, убрали это из платформы
40 GANR
 
21.02.13
17:03
Но часто было такое у COM, что она ела только латинское.
41 Alpachino
 
21.02.13
17:09
(40) Оооо, помогло вроде)))
42 Alpachino
 
21.02.13
17:13
(40)   GANR заработало))) наконец то. Но как я понимаю, это просто ссылка, открыть и посмотреть внутренности нельзя, ДА!?


GANR а внутренности данного док-та чтобы получить, как быть в этом случае
43 GANR
 
21.02.13
17:19
(41) Кстати, версия платформы какая? В 8.2.16.362 по латински уже не пишет, но, возможно, там и по русски съест.
(41) Вот тут сложнее - тут целый рекурсивный алгоритм нарисоваться может, вроде заложенного в обработку ВыгрузкаЗагрузкаДанныхXML - она грузит объекты, их реквизиты, реквизиты реквизитов и т. д. Ну а если уверен, что не больше 1 уровня - можно по ЗначениеИзСтрокиВнутр(COM.ЗначениеВСтрокуВнутр(СсылкаCOM)) всё перегнать.
44 Alpachino
 
21.02.13
17:24
(43) Версия 8.2.14.540 по латински норм прошло)

Ок попробую по  (COM.ЗначениеВСтрокуВнутр(СсылкаCOM))

Думаю, лучше было и быстрее конвертацию данных сделать, прописать правило и усЁ, но что начато то нужно закончить,

Просто не работал с ОЛЕ, но много чего узнал, как 1 из методов))
45 GANR
 
21.02.13
17:29
(44) По COM готовых обработок нету - через XML все обмены.
46 Alpachino
 
21.02.13
17:30
(43) (СсылкаCOM) - это как понять?
47 GANR
 
21.02.13
17:30
(46) Переменная, ссылающаяся на объект во внешней базе.
48 Alpachino
 
21.02.13
17:38
(47) ЗначениеИзСтрокиВнутр(Соединение.ЗначениеВСтрокуВнутр(Соединение.Документы)) ????? или я туплю))??
49 Alpachino
 
21.02.13
17:39
При ЗначениеИзСтрокиВнутр(Соединение.ЗначениеВСтрокуВнутр(стр.Документ)) съедает, результаты есть, смотреть не могу, как строку определяет
50 GANR
 
21.02.13
17:39
(48) Ну, например:
СсылкаCOM = СОМ.Справочники.Фирмы.НайтиПоНаименованию("Твоя фирма");
51 GANR
 
21.02.13
17:44
(49) ЗначениеИзСтрокиВнутр - вероятно, этого документа в текущей базе нет - создать нужно с таким же GUIDом (см. УстановитьСсылкуНового и ПолучитьСсылку в СП). Ну и реквизиты тоже загнать и COM. Короче: проще ВыгрузкаЗагрузкаДанныхXML воспользоваться.
52 GANR
 
21.02.13
17:45
>и COM
из COM
53 Alpachino
 
21.02.13
17:57
(52) Буду пробовать,так и так) БЛАГОДАРЮ ЗА ПОМОЩЬ!!!
54 GANR
 
21.02.13
18:08
(53) Теоретически можно так, и так, но зачем? По XML уже есть готовый, тянущий объекты рекурсивно, алгоритм, на который было затрачено немало человеко-месяцев в фирме 1С, а по COM - ещё нет (и вряд ли будет за ненадобностью).