Имя: Пароль:
1C
1C 7.7
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
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс