Добрый день,
Стоит задача сделать связку между существующим ПО (net 3.5 sp1 C#) и 1С:Предприятие не пользуясь платными посредниками.
Есть пример для VB
Dim cntr As V82.COMConnector
Dim trade As Object
Dim name As Object
cntr = New V82.COMConnector
trade = cntr.Connect("File=""\\1C\Test1C\Копия 120911 Бух.Смарт"";Usr=""Билинг"";Pwd=""ser25"";")
name = trade.ВнешнийОбмен.ИмяКлиента("000000025")
Работает на "ура". Как то же самое написать на C# ? Насколько я знаю C# не позволяет еще на этапе компиляции обращаться к заранее не декларированным методам, поэтому строка типа name = trade.ВнешнийОбмен.ИмяКлиента("000000025") через компилятор не пройдет. Нужно, как мне кажется, создать правильный класс, а не Object. Но как это "правильный" создать, не могу сообразить.
В студии добавить ссылку на нужный COM объект. Студия создаст для него дотнетовскую обертку с которой уже можно будет работать.
Ну или воспользуйтесь reflection.
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
A>Никак. Вам нужен dynamic из 4.0
В VB.NET он был всегда.
Здравствуйте, Аноним, Вы писали:
А>Добрый день,
А>Стоит задача сделать связку между существующим ПО (net 3.5 sp1 C#) и 1С:Предприятие не пользуясь платными посредниками.
А>Есть пример для VB
А>А>Dim cntr As V82.COMConnector
А> Dim trade As Object
А> Dim name As Object
А> cntr = New V82.COMConnector
А> trade = cntr.Connect("File=""\\1C\Test1C\Копия 120911 Бух.Смарт"";Usr=""Билинг"";Pwd=""ser25"";")
А> name = trade.ВнешнийОбмен.ИмяКлиента("000000025")
А>
А>Работает на "ура". Как то же самое написать на C# ? Насколько я знаю C# не позволяет еще на этапе компиляции обращаться к заранее не декларированным методам, поэтому строка типа name = trade.ВнешнийОбмен.ИмяКлиента("000000025") через компилятор не пройдет. Нужно, как мне кажется, создать правильный класс, а не Object. Но как это "правильный" создать, не могу сообразить.
вот пример подключения поиска и редактирования без динамиков на fw 2.0
object _dictionary = null;
public bool Connect(string path)
{
try
{
Type connector = Type.GetTypeFromProgID("V81.ComConnector");
object connectorInstance = Activator.CreateInstance(connector);
object _connection = connectorInstance.GetType().InvokeMember("Connect", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, connectorInstance, new object[] { "File=\"" + path + "\"" });
_dictionary = _connection.GetType().InvokeMember("NewObject", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, _connection, new object[] { "СправочникМенеджер.Товары" });
}
catch(Exception rex)
{
return false;
}
return true;
}
public void EditPosition(object _record,object tovar, object nakassetovar, object cena, object articul, object prockup, object cenavkup, object drobkolvo, object skidkanet, object zapretpovrem)
{
try
{
object _recordobj = _dictionary.GetType().InvokeMember("ПолучитьОбъект", BindingFlags.InvokeMethod, null, _record, null);
_dictionary.GetType().InvokeMember("Наименование", BindingFlags.Public | BindingFlags.SetProperty, null, _recordobj, new object[] { tovar });
_dictionary.GetType().InvokeMember("НаименованиеДляКассы", BindingFlags.Public | BindingFlags.SetProperty, null, _recordobj, new object[] { nakassetovar });
_dictionary.GetType().InvokeMember("Цена", BindingFlags.Public | BindingFlags.SetProperty, null, _recordobj, new object[] { cena });
_dictionary.GetType().InvokeMember("ЦенаВКупонах", BindingFlags.Public | BindingFlags.SetProperty, null, _recordobj, new object[] { cenavkup });
_dictionary.GetType().InvokeMember("ПроцКупонизации", BindingFlags.Public | BindingFlags.SetProperty, null, _recordobj, new object[] { prockup });
_dictionary.GetType().InvokeMember("РазрешитьДробноеКоличество", BindingFlags.Public | BindingFlags.SetProperty, null, _recordobj, new object[] { drobkolvo });
_dictionary.GetType().InvokeMember("БезСкидки", BindingFlags.Public | BindingFlags.SetProperty, null, _recordobj, new object[] { skidkanet });
_dictionary.GetType().InvokeMember("ЗапретПродажи", BindingFlags.Public | BindingFlags.SetProperty, null, _recordobj, new object[] { zapretpovrem });
_dictionary.GetType().InvokeMember("Write", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, _recordobj, null);
}
catch (Exception ex)
{
;
}
}
public object FindPos(object naim, object value)
{
try
{
object _record = _dictionary.GetType().InvokeMember("НайтиПоРеквизиту", BindingFlags.InvokeMethod, null, _dictionary, new object[] { naim, value });
int vvv = (Int32)_dictionary.GetType().InvokeMember("Код", BindingFlags.GetProperty, null, _record, null);
if (vvv != 0)
return _record;
return null;
}
catch (Exception ex)
{
;
}
return null;
}
и где-то
Connect("File=""\\1C\Test1C\Копия 120911 Бух.Смарт"";Usr=""Билинг"";Pwd=""ser25"";")
object pos = FindPos("Артикул", code);
if (pos != null)
EditPosition(pos, massiv5, massiv5, massiv6, code.Trim(), prockup, cenavkup, ves, skidka, zapret); //ну и тут свои поля подставить
А 1С умеет выставлять наружу web-сервисы. Если нужно только получать информацию — самое то, что надо, а если делать полноценный обмен — свои грабли вылезут.
Здравствуйте, hardcase, Вы писали:
H>А может просто перестать кушать кактус и использовать VB.NET?1
Я не агитирую людей писать на языках которые им не нравятся или по каким то причинам не подходят ,вопрос стоял про C#.
P\S
мне например синтаксис vb неприятен
ничего личного.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, hardcase, Вы писали:
H>>А может просто перестать кушать кактус и использовать VB.NET?1
А>Я не агитирую людей писать на языках которые им не нравятся или по каким то причинам не подходят ,вопрос стоял про C#.
А>P\S
А>мне например синтаксис vb неприятен ничего личного.
Одно дело воротить мегатонны невнятного кода (пример был выше), а другое — написать простую типизированную обертку к COM объекту на VB.NET и спокойно использовать ее из C#. Решать вам.