Имя: Пароль:
1C
1С v8
Доступ к 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 у запроса возвращает ошибку. Сам объект создается, текст запроса присваивается. Покажи свой код