-
Вопрос скорее на знание C# (почумуто документацию по нему нормальный я так и не нашёл). Всю жизнь я сидел в DELPHI. Мне надо подключится к 1C:Предприятию и работать с ней через OLE. В C# толи так всё сложно (хотя как я понял его для этого и делали, чтобы быть простым...). Вот примерный код как я работал c 1C через Delphi. procedure TForm1.Button1Click(Sender: TObject); var onesobj: Olevariant; //OLE-объект программы 1С:Предприятие ware: olevariant; //Агрегатные объекты begin onesobj := createoleobject('V1CEnterprise.Application'); //Создаем OLE-объект //Инициализируем объект onesobj.initialize(onesobj.rmtrade,'/DE:\TRUKR /M /NСаша /P12345',''); //Создаем необходимые агрегатные объекты ware := onesobj.createobject('Справочник.Номенклатура'); ware.selectitems(1); //Открываем выборку элементов справочника while ware.GetItem(1)>0 do //Выбираем все элементы begin Memo1.Lines.Add(ware.getAttrib('Наименование')); end; end;
Этот же код сделать в C# ятолком так и не смог, точнее скореевсего смогу, но это както сложно выходит....
protected void Button1_Click(object sender, EventArgs e) { Type t = null; /* нужна для позднего связывания */ Object obj = null; /* нужна для ссылки на COM сервер */ Object book = null; /* нужна для ссылки на объект справочника */ Object element = null; /* нужна для ссылки на элемент справочника */ Boolean OK = false;
/* Вызовем внутренние методы 1С */ t = Type.GetTypeFromProgID("V77s.Application");
obj = System.Activator.CreateInstance(t);
Object[] arg = new Object[3]; arg[0] = obj.GetType().InvokeMember(@"RMTrade", BindingFlags.Public | BindingFlags.InvokeMethod, null, obj, null); arg[1] = @"/dE:\TRUKR /n /p";
OK = (Boolean)obj.GetType().InvokeMember(@"Initialize", BindingFlags.Public | BindingFlags.InvokeMethod, null, obj, arg);
object[] arg2 = new object[] { @"Справочник.Номенклатура" };
book = obj.GetType().InvokeMember(@"createobject", BindingFlags.Public | BindingFlags.InvokeMethod, null, obj, arg2); }
Т.е. смысл в том, что в делфях для вызова метода OLE я просто писал его через точку, в скобках параметры и не парил мозги... а тут както так громоздко.... Поясните, может как то можно вернутся к наглядности кода? или хотябы как можно это всё упростить? Спасибо!
-
Ну да, нет в языке поддержки позднего связывания, потому так громоздко. А значительно упростить работу можно создав interop assembly на основе нужной библиотеки типов.
-
А не поскажешь что это и как это делать (пример, почиатаь чтото)....
-
Понятия не имею, как это делать в BDS. В VS достаточно в references проекта добавить библиотеку типов COM, будет сгенерирована interop сборка. Наверное, должно быть подобное средство и в BDS. Можно воспользоваться утилитой tlbimp.exe из .NET SDK, и полученную сборку включить в проект. Почитать можно здесь http://msdn2.microsoft.com/en-us/library/z6tx9dw3(VS.71).aspx
-
Я и делаю в VS, но есть проблемка: в реестре написано, что контейнер :C:\PROGRA~1\1Cv77\BIN\1cv7s.exe. Када я я его пытаюсь добавить, то пишет, что No types librarys were found. короче что в нём нифига нет.... в близлижащих дллках тоже ничё не нашёл.... как быть?
-
HKEY_CLASSES_ROOT\CLSID\{63112D80-94F0-11D2-9F39-008048DA120F}: V77.Application HKEY_CLASSES_ROOT\CLSID\{63112D80-94F0-11D2-9F39-008048DA120F}\InprocHandler32\:ole32.dll HKEY_CLASSES_ROOT\CLSID\{63112D80-94F0-11D2-9F39-008048DA120F}\LocalServer32: C:\PROGRA~1\1Cv77\BIN\1cv7s.exe HKEY_CLASSES_ROOT\CLSID\{63112D80-94F0-11D2-9F39-008048DA120F}\ProgID: V77.Application
-
А зачем искать по реестру? При добавлении ссылки показываются все зарегистрированные библиотеки типов. Неужели её там нет?
-
В том то и дело, что нет.... Может я чегото не понимаю... просто это получается не COM объект, а OLE.... может это на что то влияет?
-
Раскопки на машине с установленной 1С показали, что она, по-видимому, действительно не регистрирует библиотеку типов для своих automation-объектов, и, скорее всего, её и не содержит.
Печально, но придётся-таки писать длинные заклинания.
:(
|