|
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 - ещё нет (и вряд ли будет за ненадобностью).
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |