Связь с 1С
От: Аноним  
Дата: 22.09.11 11:19
Оценка:
Добрый день,
Стоит задача сделать связку между существующим ПО (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. Но как это "правильный" создать, не могу сообразить.
Re: Связь с 1С
От: adontz Грузия http://adontz.wordpress.com/
Дата: 22.09.11 11:20
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

Никак. Вам нужен dynamic из 4.0
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Связь с 1С
От: rumatavz  
Дата: 22.09.11 11:28
Оценка:
В студии добавить ссылку на нужный COM объект. Студия создаст для него дотнетовскую обертку с которой уже можно будет работать.
Ну или воспользуйтесь reflection.
Re[2]: Связь с 1С
От: hardcase Пират http://nemerle.org
Дата: 22.09.11 11:32
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


A>Никак. Вам нужен dynamic из 4.0


В VB.NET он был всегда.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Связь с 1С
От: Аноним  
Дата: 22.09.11 11:36
Оценка:
R>В студии добавить ссылку на нужный COM объект. Студия создаст для него дотнетовскую обертку с которой уже можно будет работать.
Соответствующий COM объект обеспечивает связь, но ничего не знает о внутренней структуре 1C, поэтому не содержит нужных методов. Поэтому просто добавление его не помогает.
Re: Связь с 1С
От: codenet Россия  
Дата: 23.09.11 00:52
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А>Добрый день,

А>Стоит задача сделать связку между существующим ПО (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); //ну и тут свои поля подставить
Re: Связь с 1С
От: Аноним  
Дата: 23.09.11 06:28
Оценка:
А 1С умеет выставлять наружу web-сервисы. Если нужно только получать информацию — самое то, что надо, а если делать полноценный обмен — свои грабли вылезут.
Re[2]: Связь с 1С
От: hardcase Пират http://nemerle.org
Дата: 23.09.11 11:28
Оценка:
Здравствуйте, codenet, Вы писали:

А может просто перестать кушать кактус и использовать VB.NET?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: Связь с 1С
От: Аноним  
Дата: 23.09.11 12:25
Оценка:
Здравствуйте, hardcase, Вы писали:

H>А может просто перестать кушать кактус и использовать VB.NET?1


Я не агитирую людей писать на языках которые им не нравятся или по каким то причинам не подходят ,вопрос стоял про C#.

P\S
мне например синтаксис vb неприятен ничего личного.
Re[4]: Связь с 1С
От: hardcase Пират http://nemerle.org
Дата: 23.09.11 16:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, hardcase, Вы писали:


H>>А может просто перестать кушать кактус и использовать VB.NET?1


А>Я не агитирую людей писать на языках которые им не нравятся или по каким то причинам не подходят ,вопрос стоял про C#.


А>P\S

А>мне например синтаксис vb неприятен ничего личного.

Одно дело воротить мегатонны невнятного кода (пример был выше), а другое — написать простую типизированную обертку к COM объекту на VB.NET и спокойно использовать ее из C#. Решать вам.
/* иЗвиНите зА неРовнЫй поЧерК */
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.