|
Доступ к 1С через COM наC# | ☑ | ||
---|---|---|---|---|
0
MildLimit
26.02.13
✎
08:57
|
Есть VS 2010. Пытаюсь подключить Interop.V82 через Данные -> Новый источник -> Объект -> Interop.V82. Все нормально подключается
V82.COMConnector connector = new V82.COMConnector(); dynamic oConnection = connector.Connect("Srvr=1c-serv;Ref=ZUP_82;Usr=user;Pwd=123456"); Но как теперь обратиться к справочникам, документам и т.д., без использования Invoke. На форуме был пример вида dynamic doc = oConnection.Документы.РеализацияТоваровУслуг.СоздатьДокумент(); Но система пишет, что не обнаружила один или несколько типов. Где взять эти определения? |
|||
1
ДенисЧ
26.02.13
✎
09:00
|
Вот сходи на тот форум и спроси, что за чудо они там придумали... :-))
|
|||
2
smitru
26.02.13
✎
09:02
|
"Но система пишет, что не обнаружила один или несколько типов"
Приведи дословно что пишет система. |
|||
3
AaNnDdRrEeYy
26.02.13
✎
09:02
|
using System.Dynamic
надо указать что ты импортировал пространство имен или писать тип полностью System.Dynamic doc = oConnection.Документы.РеализацияТоваровУслуг.СоздатьДокумент(); и еще dynamic он начиная с 4 версии фреемворка только есть |
|||
4
AaNnDdRrEeYy
26.02.13
✎
09:06
|
вот пример который у меня работает
//connection1C - это твой oConnection dynamic catalogsRef = connection1C.GetType().InvokeMember("Справочники", BindingFlags.GetProperty, null, connection1C, null); dynamic НовыйЭлемент = catalogsRef.Справочник1.СоздатьЭлемент(); НовыйЭлемент.Наименование = "Это динаимческое свойство C#"; НовыйЭлемент.Записать(); //Заполнение реквизита в справочнике элементом другого справочника object catalogsRef_2 = connection1C.GetType().InvokeMember("Справочники", BindingFlags.GetProperty, null, connection1C, null); object catalog1_2 = connection1C.GetType().InvokeMember("Справочник1", BindingFlags.GetProperty, null, catalogsRef_2, null); //поиск элемента по коду object FindedCatalog1Element = connection1C.GetType().InvokeMember("НайтиПоКоду", BindingFlags.InvokeMethod, null, catalog1_2, new object[] { "000000003" }); //получаем найденный элемент для редактирования object FindedCatalog1ElementObject = connection1C.GetType().InvokeMember("ПолучитьОбъект", BindingFlags.InvokeMethod, null, FindedCatalog1Element, null); //поиск элемента который будет записан в реквизит первого справочника object catalogsRef_3 = connection1C.GetType().InvokeMember("Справочники", BindingFlags.GetProperty, null, connection1C, null); object catalog1_3 = connection1C.GetType().InvokeMember("Справочник2", BindingFlags.GetProperty, null, catalogsRef_3, null); object FindedCatalog1Element_3 = connection1C.GetType().InvokeMember("НайтиПоКоду", BindingFlags.InvokeMethod, null, catalog1_3, new object[] { "000000001" }); //установка реквизит1 connection1C.GetType().InvokeMember("Реквизит1", BindingFlags.SetProperty, null, FindedCatalog1ElementObject, new object[] { FindedCatalog1Element_3 }); //записываем модифицорованный элемент connection1C.GetType().InvokeMember("Записать", BindingFlags.InvokeMethod, null, FindedCatalog1ElementObject, null); } catch (Exception ex) { string message = ex.Message; if (ex.InnerException != null) message += Environment.NewLine + ex.InnerException.Message; MessageBox.Show(message); } finally { // Уничтожаем объект 1С. if (obj1C != null) { System.Runtime.InteropServices.Marshal.Release(System.Runtime.InteropServices.Marshal.GetIDispatchForObject(obj1C)); System.Runtime.InteropServices.Marshal.ReleaseComObject(obj1C); obj1C = null; } } |
|||
5
Принт
26.02.13
✎
09:14
|
FinalReleaseComObject
|
|||
6
Тролль главный
26.02.13
✎
09:21
|
||||
7
oleg_km
26.02.13
✎
09:30
|
У меня вроде так заработало:
dynamic o1C; string strCon = @"Srvr=""srv1c.server.agp.local:4541"";Ref=""TestEmpty"";"; V82.COMConnector oConn = new V82.COMConnector(); o1C = oConn.Connect(strCon); string cRes = o1C.Test("Проверка"); DateTime dRes = o1C.CurrentUniversalDate(); int nRes = o1C.Метаданные.Документы.Количество(); MessageBox.Show(cRes + "\n" + dRes.ToString() + "\n" + nRes.ToString()); dynamic oQ = o1C.NewObject("Запрос"); oQ.Text = "ВЫБРАТЬ * ИЗ Справочник.СообщенияМеню"; // dynamic o1 = oQ.Execute(); //dynamic oRes = o1.Unload(); |
|||
8
MildLimit
26.02.13
✎
12:19
|
(7) А как была среда VS 2010 настроена? У меня при выполнении твоего кода пишет
"System.__ComObject" не содержит определения для "Test". |
|||
9
MildLimit
26.02.13
✎
15:36
|
Всем спасибо, уже разобрался. Все (7) прекрасно работает.
|
|||
10
oleg_km
26.02.13
✎
15:44
|
(9) О, да? У меня последняя строчка не работает. Метод Execute у запроса возвращает ошибку. Сам объект создается, текст запроса присваивается. Покажи свой код
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |