|
v7: C# и ?.7 - как получить OLE объект | ☑ | ||
---|---|---|---|---|
0
EvgeniuXP
07.05.14
✎
12:45
|
Подключение из С# к 1С:Предприятие 7.7 происходит, но данная (см. ниже) функция возвращает булево значение, а нужен OLE-объект, как его получить?
dynamic Connection = v77comConnector.InvokeMember("Initialize", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v77, arguments); При подключении к 8.х InvokeMember возвращает COM-объект, а 7.7 булево... |
|||
1
iamnub
07.05.14
✎
12:47
|
(0)
Я не уверен, но в 7.7 возвращается результат подключения. А COM-объект - это тот объект, у которого ты вызываешь метод InvokeMember. |
|||
2
EvgeniuXP
07.05.14
✎
12:49
|
(1) а как тогда вернуть OLE-объект, чтобы потом через него вызвать EvalExpr("глВызовФункции()")? или только через InvokeMember вызывать все глобальные функции 7.7...
|
|||
3
EvgeniuXP
07.05.14
✎
12:53
|
т.е. в 8-ке я получу этот объект (OLE из C#), а потом инвоками вызываю глобальные функции 7.7?
|
|||
4
EvgeniuXP
07.05.14
✎
14:20
|
инвоками не получается, там еще надо параметр на локальную переменную передавать...
как получить БазаOLE из C#, чтоб потом в 8-ке написать код: БазаOLE.EvalEpr("МояФункция()"); Возвращаю Connection, подключение есть к 7.7, тип _COM.System (в отладчике шарпа), а процедуру EvalExpr не возможно вызвать - проверяю вызов в С#, если пишем Connection.EvalExpr("МояФункция()"); |
|||
5
EvgeniuXP
07.05.14
✎
14:22
|
у восьмеры Connection.МояГлФункция() - отрабатывает нормально...
|
|||
6
Torquader
07.05.14
✎
15:33
|
В семёрке всё немного интереснее.
Сначала вы создаёте объект предприятия, через который уже можно выполнять некоторые функции (например EvalExpr("ТекущаяДата()") отработает и без подключения). Когда вы делаете подключение Initialize, то вы объект 1С подключаете к базе данных - в ответ вам выдают успешность этого события. Работать же далее нужно продолжать с тем же объектом, которые вы получили. |
|||
7
Torquader
07.05.14
✎
15:34
|
OLE=CreateObject("V77.Application")
If OLE.Initialize(OLE.RMTrade,ДанныеЗапуска,"NO_SPLASH_SHOW")=0 Then MsgBox "Error",0,"Error" Quit ENd If Set Ref=OLE.CreateObject("Reference") и т.д. |
|||
8
EvgeniuXP
07.05.14
✎
17:58
|
(7) OLE=CreateObject("V77.Application") - если так создавать, тот тут уже OLE и дальше нормально всё отработает. а если через v77comConnector.InvokeMember("Initialize"...) - то номер уже не проходит... я эту функцию два раза вызываю, один для RMTrade, другой для Initialize - и что-то тут не так...
|
|||
9
EvgeniuXP
08.05.14
✎
17:00
|
более короткий вопрос:
какой тип возврата указать, чтобы функция C# вернула OLE-объект в 1С 8.х? ??? GetCOM() { ... return OLE; } |
|||
10
Serginio1
08.05.14
✎
17:01
|
Object
|
|||
11
EvgeniuXP
08.05.14
✎
17:02
|
(10) а веб-сервис его воспримет?
пробовал Object[] - была ошибка... |
|||
12
Serginio1
08.05.14
✎
17:03
|
А лучше dynamic
|
|||
13
Serginio1
08.05.14
✎
17:03
|
А почему массив?
|
|||
14
Serginio1
08.05.14
✎
17:04
|
||||
15
EvgeniuXP
08.05.14
✎
18:10
|
(13) чтобы использовать два параметра в InvokeMember, один который вызывает этот метод, другой - передается параметром как COM.
|
|||
16
Serginio1
08.05.14
✎
23:24
|
Зачем InvokeMember когда есть динамики?
Лучше возвращать не массив а объект класса. Массив преобразуется в SafeArray |
|||
17
EvgeniuXP
08.05.14
✎
23:37
|
(16) я C# плохо знаю
|
|||
18
EvgeniuXP
09.05.14
✎
00:01
|
в WinXP
c:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe –r работает, а в Win8.1 x64 - нет, хотя запускал из папки x64, параметр не поддерживается - как в Win8.1 сделать, чтобы можно было отлаживать и работали точки останова? |
|||
19
Serginio1
09.05.14
✎
12:21
|
Я уже непомню но скачай IIS express Visual Studio 2013
Или в 2013 уже все встроено http://www.codehint.ru/articles/2013-10-05_getting_started_asp_net_5 |
|||
20
Serginio1
09.05.14
✎
12:24
|
||||
21
EvgeniuXP
09.05.14
✎
12:39
|
(20) а не подскажешь тогда, как массив вернуть из C#?
т.е. получить что-то в виде этого: C#: ???object[]??? Get() { ... dynamic v77= v77comConnector.InvokeMember("MTrade", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v77, arguments); dynamic Connection = v77comConnector.InvokeMember("Initialize", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v77, arguments); ... object[0] = v77; object[1] = Connection; return object; } А в 1С-ке написать что-то типа этого: Массив = ВебСервер.Get(); v77 = Массив[0]; Connection = Массив[1]; arguments = ВебСервер.GetArguments("аргументы для формирования на C#"); Connection.InvokeMember("EvalExpr", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v77, arguments); Написал всё приблизительно, т.к. не помню как уже написал на работе (WinXP и VS2010), а дома не работает (Win81 и VS2013 - надо разбираться) |
|||
22
Serginio1
09.05.14
✎
13:12
|
(21)
Вообще смотри в отладчике что получаешь. Обычно это ОбъектXDTO. Если это список то СписокXDTO И обращение к нему через Для Каждого или ПолучитьXDTO Сейчас нет справки под рукой. |
|||
23
Serginio1
09.05.14
✎
13:17
|
Я не понял ты СОМ объекты через сервисы передаешь?
|
|||
24
Serginio1
09.05.14
✎
13:27
|
Если ВебСервер это СОМ объект то массив передается как SafeArray и доступ к элементам смотри справку
|
|||
25
EvgeniuXP
09.05.14
✎
14:57
|
(24) спс, завтра попробую с SafeArray повозиться.
|
|||
26
EvgeniuXP
09.05.14
✎
14:58
|
(23) да, причем два хотел сразу передать.
|
|||
27
Serginio1
09.05.14
✎
15:29
|
(26) Не получится у тебя через Вэб сервисы СОМ передать.
Только сериализуемые. |
|||
28
EvgeniuXP
09.05.14
✎
15:47
|
(27) о-о-о-о, это ж плохо... в 7.7 попробуй потом все это десериализовать....
|
|||
29
EvgeniuXP
09.05.14
✎
15:48
|
(+28) когда передаем данные в виде ТЗ (примитивные типы, число, строка) из 8.х в 7.7..
|
|||
30
Serginio1
09.05.14
✎
17:50
|
(28) Используя 14 можно подключаться к любым вэб сервисам хоть из 8 ки хть из 7 ки. Либо использовать COM
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |