1С и .NET
От: abdula  
Дата: 08.10.03 11:41
Оценка:
Как из С# подключиться к 1С?
раньше делал через OLE (VFoxPro, VBasik).
Re: 1С и .NET
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 08.10.03 11:42
Оценка:
Здравствуйте, abdula, Вы писали:

A>Как из С# подключиться к 1С?

A>раньше делал через OLE (VFoxPro, VBasik).
Соди на http://www.gotdotnet.ru/ там есть пример.
и солнце б утром не вставало, когда бы не было меня
Re[2]: 1С и .NET
От: abdula  
Дата: 08.10.03 12:10
Оценка:
S> Соди на http://www.gotdotnet.ru/ там есть пример.
это не то
запускаеться мой *.exe, он лезет в 1С и грузит себе все необходимое из нее, после небольшой обработки, выгружаем в 1С.
в данном случае юзеру не нать запускать 1С.
Re[3]: 1С и .NET
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 08.10.03 12:28
Оценка:
Здравствуйте, abdula, Вы писали:

S>> Соди на http://www.gotdotnet.ru/ там есть пример.

A>это не то
A>запускаеться мой *.exe, он лезет в 1С и грузит себе все необходимое из нее, после небольшой обработки, выгружаем в 1С.
A>в данном случае юзеру не нать запускать 1С.

Посмотри v77websrv или я тебе ее скину. Честно не промню где взял. Но принцип обычный, на рефлексии.

lateBoundType=Type.GetTypeFromProgID("v77S.Application");
v77=Activator.CreateInstance(lateBoundType);
arg[0]=lateBoundType.InvokeMember("RMTrade",BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static,null,v77,null);
arg[1]=@"/D"+v77base+" /N"+user+" /P"+password;
arg[2]="NO_SPLASH_SHOW";



lateBoundType.InvokeMember("Initialize", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v77,arg);
object[] arg2=new object[]{@""+v77object};

object getv77object=lateBoundType.InvokeMember("CreateObject", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null,v77, arg2);
getv77object.GetType().InvokeMember("ВыбратьЭлементы", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, getv77object,null);


while(((double)getv77object.GetType().InvokeMember("ПолучитьЭлемент", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, getv77object,null))==1)

{

myDataRow = myDataTable.NewRow();
for (int i=0; i<param.Length; i++)
{
myDataRow[(param[i].ToString())]=getv77object.GetType().InvokeMember((param[i].ToString()), BindingFlags.GetProperty, null,getv77object,null);

}
myDataTable.Rows.Add(myDataRow);

}


Marshal.ReleaseComObject(getv77object);
Marshal.ReleaseComObject(v77);
return myDataSet;

}
и солнце б утром не вставало, когда бы не было меня
Re[4]: 1С и .NET
От: abdula  
Дата: 08.10.03 13:06
Оценка:
S> Посмотри v77websrv или я тебе ее скину. Честно не промню где взял. Но принцип обычный, на рефлексии.
спасибо большое, у меня ее нет, проверь свою почту указанную на здешней регистации, там мой рабочий ящик, пропускная способность 2метра
Re[5]: 1С и .NET
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 08.10.03 13:38
Оценка:
Здравствуйте, abdula, Вы писали:

S>> Посмотри v77websrv или я тебе ее скину. Честно не промню где взял. Но принцип обычный, на рефлексии.

A>спасибо большое, у меня ее нет, проверь свою почту указанную на здешней регистации, там мой рабочий ящик, пропускная способность 2метра
Лови отослал. 68 кб.
Удачи.
и солнце б утром не вставало, когда бы не было меня
Re[4]: 1С и .NET
От: al Россия  
Дата: 08.10.03 14:11
Оценка:
Здравствуйте, Serginio1, Вы писали:

А не проще ли использовать VB.NET?


Re[5]: 1С и .NET
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 08.10.03 14:15
Оценка:
Здравствуйте, al, Вы писали:

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


al>А не проще ли использовать VB.NET?

Я не пользуюсь. Честно говоря использую прямой досту к БД 1С.
и солнце б утром не вставало, когда бы не было меня
Re[5]: 1С и .NET
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 08.10.03 14:25
Оценка: 9 (1)
Здравствуйте, al, Вы писали:

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


al>А не проще ли использовать VB.NET?

Да кстати на метаданных 1С очень легко строится объектная обертка вокруг "объектов" 1С и уже работаешь с типизированными объектами в отличии от VB.NET
и солнце б утром не вставало, когда бы не было меня
Re[6]: 1С и .NET
От: abdula  
Дата: 09.10.03 06:07
Оценка:
Здравствуйте, Serginio1, Вы писали:
S> Лови отослал. 68 кб.
S> Удачи.
Спасибо большое, получил.
Щас буду юзать
Re: 1С и .NET
От: Vladosha Россия  
Дата: 09.10.03 06:29
Оценка:
Здравствуйте, abdula, Вы писали:
A>Как из С# подключиться к 1С?

    string BaseCatalog = @"C:\1C\Base1\",
        User = "Auto",
        Pass = "";
        //OneUserOnly = " /m",
        //WithOutSplash = "NO_SPLASH_SHOW";

    object [] arg = new object[3];
    Type lateBoundType = Type.GetTypeFromProgID("v77S.Application");
    object v77 = Activator.CreateInstance(lateBoundType);
    //Initialize
    arg[0] = lateBoundType.InvokeMember("RMTrade", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v77, null);
    arg[1] = @"/D"+BaseCatalog+" /N"+User+" /P"+Pass;//+OneUserOnly;
    arg[2] = "";//WithOutSplash;
    lateBoundType.InvokeMember("Initialize", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v77, arg);
    //EvalCreation
    object [] arg1 = new object[] {"ProcessCountriesList()"};
    lateBoundType.InvokeMember("EvalExpr", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v77, arg1);

    //before exit
    System.Runtime.InteropServices.Marshal.ReleaseComObject(v77);

Данный пример вызывает 1С 7.7 Торговля SQL, запускает функцию из глобального модуля ProcessCountriesList() и выходит. Далее — обточить напильником по необходимости.
... << RSDN@Home 1.1 beta 1 >>
С уважением, Vladosha.
Re[2]: 1С и .NET
От: abdula  
Дата: 09.10.03 11:28
Оценка:
Здравствуйте, Vladosha, Вы писали:
V> string BaseCatalog = @"C:\1C\Base1\",
V> User = "Auto",
V> Pass = "";
V> //OneUserOnly = " /m",
V> //WithOutSplash = "NO_SPLASH_SHOW";

V> object [] arg = new object[3];

V> Type lateBoundType = Type.GetTypeFromProgID("v77S.Application");
V> object v77 = Activator.CreateInstance(lateBoundType);
V> //Initialize
V> arg[0] = lateBoundType.InvokeMember("RMTrade", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v77, null);
V> arg[1] = @"/D"+BaseCatalog+" /N"+User+" /P"+Pass;//+OneUserOnly;
V> arg[2] = "";//WithOutSplash;
V> lateBoundType.InvokeMember("Initialize", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v77, arg);
V> //EvalCreation
V> object [] arg1 = new object[] {"ProcessCountriesList()"};
V> lateBoundType.InvokeMember("EvalExpr", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v77, arg1);

V> //before exit

V> System.Runtime.InteropServices.Marshal.ReleaseComObject(v77);
V>[/c#]
V>Данный пример вызывает 1С 7.7 Торговля SQL, запускает функцию из глобального модуля ProcessCountriesList() и выходит. Далее — обточить напильником по необходимости.

напильником не обтачиваеться
object [] arg1 = new object[] {"глЕстьРеквизитШапки()", "", ""};

lateBoundType.InvokeMember("ExecuteBach", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v77, arg1);
на этой строке выкидывает...

в 1С:
Функция глЕстьРеквизитШапки(ИмяРеквизита, ВидДокумента) Экспорт

Если ПустоеЗначение(ИмяРеквизита) = 1 Тогда
Возврат 0;

ИначеЕсли Метаданные.ОбщийРеквизитДокумента(ИмяРеквизита).Выбран() = 1 Тогда
Возврат 1;

ИначеЕсли ПустоеЗначение(ВидДокумента) = 1 Тогда
Возврат 0;

ИначеЕсли Метаданные.Документ(ВидДокумента).РеквизитШапки(ИмяРеквизита).Выбран() = 1 Тогда
Возврат 1;

Иначе
Возврат 0;
КонецЕсли;

КонецФункции

стою на асфальте я в лыжи обутый ...
Re: 1С и .NET
От: abdula  
Дата: 10.10.03 07:16
Оценка:
Люди, все работает!!!
на будущее:
если рабочий каталог базы 1С: C:\1с\FSBUCH
То в С# его так и пишите, такие фишки как: c:\1C\FSbuch не прокатят (утро вечера мудренее )
string sPach = @"/DC:\1с\FSBUCH /N";

Ребята, спасибо Вам за примеры, без них долго сам разбирался.
Re[3]: 1С и .NET
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 10.10.03 09:00
Оценка:
Здравствуйте, abdula, Вы писали:

A>напильником не обтачиваеться



A>lateBoundType.InvokeMember("ExecuteBach", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v77, arg1);

A>на этой строке выкидывает...

A>в 1С:

A>Функция глЕстьРеквизитШапки(ИмяРеквизита, ВидДокумента) Экспорт


A>стою на асфальте я в лыжи обутый ...

В первых ExecuteBach это вызов процедуры. Зачем 3 аргумента, если нужен 1.
Применяй напрямую вызов глобальной функции 1С помеченной как экспорт.
A>object [] arg1 = new object[] { "", ""};
lateBoundType.InvokeMember("глЕстьРеквизитШапки", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v77, arg1);
A>на этой строке выкидывает...

или object [] arg1 = new object[] {"глЕстьРеквизитШапки(""""","""")"};
A>lateBoundType.InvokeMember("EvalExpr", BindingFlags.Public | BindingFlags.InvokeMethod |
и солнце б утром не вставало, когда бы не было меня
Re[3]: 1С и .NET
От: Vladosha Россия  
Дата: 10.10.03 14:56
Оценка:
У меня в 1С так:

Функция ProcessCountriesList() Экспорт
    //Очистить справочник стран
    Спр = СоздатьОбъект("Справочник.Страны");
    Спр.ВыбратьЭлементы();
    Пока Спр.ПолучитьЭлемент()=1 Цикл
        Спр.Удалить(1);
        Спр.ВыбратьЭлементы();
    КонецЦикла;

    Возврат 1;

КонецФункции


Название функции по-английски, чтоб вопросов лишних не возникало. Насчет параметров:
V>> object [] arg1 = new object[] {"ProcessCountriesList()"};
V>> lateBoundType.InvokeMember("EvalExpr", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v77, arg1);
В моем случае параметров нет, подозреваю что в твоем случае нужно получить некую строку для вызова, типа "<имя_функции>(<параметр1>,...)" и передавать ее при создании arg1.

A>object [] arg1 = new object[] {"глЕстьРеквизитШапки()", "", ""};

A>lateBoundType.InvokeMember("ExecuteBach", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v77, arg1);
A>на этой строке выкидывает...
Что такое ExecuteBach??? Я такой команды у 1C не знаю. Вот EvalExpr, означает выполнить команду, переданную в строке. В принципе вместо этого может быть любая команда 1С, но для уменьшения вызывающего кода и кол-вов вызовов 1С через Reflection, я писал часть обработчика в 1С и дергал одну единственную функцию. Можно даже пойти дальше — через C# дернуть 1С, а она в свою очередь создает COM-объект или делает что угодно. Просто большое кол-во вызовов через OLE (как пишут в 1С) нередко приводит ее в ступор, что она перестает отвечать на запросы. Из-за этого большинство интеграторов механизм обмена данными между конфигурациями часто делают через файл, а не через OLE (т.е. COM). Не знаю что будет в 1С 8.0, но явно не намного лучше

Короче предлагаю закрыть тему про 1С, т.к. это форум про .Net.

A>стою на асфальте я в лыжи обутый ...

Скоро зима
... << RSDN@Home 1.1 beta 1 >>
С уважением, Vladosha.
Re[4]: 1С и .NET
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 10.10.03 15:41
Оценка: :)
Здравствуйте, Vladosha, Вы писали:

V>Короче предлагаю закрыть тему про 1С, т.к. это форум про .Net.


A>>стою на асфальте я в лыжи обутый ...

V>Скоро зима
А чо це то ке НЕТ.
и солнце б утром не вставало, когда бы не было меня
Re[4]: 1С и .NET
От: RaraAvis  
Дата: 12.10.03 23:48
Оценка:
Здравствуйте, Vladosha, Вы писали:

V>Не знаю что будет в 1С 8.0, но явно не намного лучше


Не, в 8-ке с дот нетом все нормально — если использовать ComConnection,

или WinForms контрол в форму v8 засунуть. Правда чего то у меня из-за контрола 8-ка не выгружается, зараза
Re[2]: 1С и .NET
От: esky  
Дата: 22.02.04 07:48
Оценка:
Здравствуйте, abdula, Вы писали:

A>Люди, все работает!!!

A>на будущее:
A>если рабочий каталог базы 1С: C:\1с\FSBUCH
A>То в С# его так и пишите, такие фишки как: c:\1C\FSbuch не прокатят (утро вечера мудренее )
A>string sPach = @"/DC:\1с\FSBUCH /N";

A>Ребята, спасибо Вам за примеры, без них долго сам разбирался.


А как это все на вб.нет сделать
Re[6]: 1С и .NET
От: ablazhko  
Дата: 05.02.06 22:00
Оценка:
Здравствуйте, Serginio1, Вы писали:

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


S>>> Посмотри v77websrv или я тебе ее скину. Честно не промню где взял. Но принцип обычный, на рефлексии.

A>>спасибо большое, у меня ее нет, проверь свою почту указанную на здешней регистации, там мой рабочий ящик, пропускная способность 2метра
S> Лови отослал. 68 кб.
S> Удачи.

Прошу прощение за вклинивание. Скажите плиз что такое v77websrv и где его можна взять. Еще интересует есть ли у кого пример работы с БД 1С из дот нет. У меня проблема с кодировкой кириллицы. Еще интересует как получить возвращаемое значение функции 1С используя кода приведенный вами ниже:

object [] arg1 = new object[] {"ProcessCountriesList()"};
lateBoundType.InvokeMember("EvalExpr", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v77, arg1);
Re[7]: 1С и .NET
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 06.02.06 09:24
Оценка:
Здравствуйте, ablazhko, Вы писали:

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


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


S>>>> Посмотри v77websrv или я тебе ее скину. Честно не промню где взял. Но принцип обычный, на рефлексии.

A>>>спасибо большое, у меня ее нет, проверь свою почту указанную на здешней регистации, там мой рабочий ящик, пропускная способность 2метра
S>> Лови отослал. 68 кб.
S>> Удачи.

A>Прошу прощение за вклинивание. Скажите плиз что такое v77websrv и где его можна взять. Еще интересует есть ли у кого пример работы с БД 1С из дот нет. У меня проблема с кодировкой кириллицы. Еще интересует как получить возвращаемое значение функции 1С используя кода приведенный вами ниже:


A>object [] arg1 = new object[] {"ProcessCountriesList()"};

A> lateBoundType.InvokeMember("EvalExpr", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v77, arg1);


Посмотри
http://1c.proclub.ru/modules/mydownloads/personal.php?cid=81&amp;lid=2710
http://www.erp-volga.com/hare/add-in/addin.websrv.html
http://gzip.rsdn.ru/article/dotnet/cs1c.xml
Автор(ы): Алексей Столповских
Дата: 20.11.2004
Данная статья описывает технологию создания COM+-компонента для 1С на C#. Код компонента был написан с использованием Microsoft Visual Studio.NET 2003, классов Microsoft .NET Framework 1.1 и протестирован на операционной системе Windows Server 2003 System.



http://www.gotdotnet.ru/LearnDotNet/NETFramework/589.aspx

Сейчас непомню Посмотри перегруженный InvokeMember где передается массив индексов возвращаемых значений
и солнце б утром не вставало, когда бы не было меня
Re[7]: 1С и .NET
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 06.02.06 09:36
Оценка:
Здравствуйте, ablazhko, Вы писали:


Посмотри еще
http://www.codeproject.com/csharp/SafeCOMWrapper.asp
и солнце б утром не вставало, когда бы не было меня
Re[7]: 1С и .NET
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 06.02.06 09:52
Оценка:
Здравствуйте, ablazhko, Вы писали:


A>object [] arg1 = new object[] {"ProcessCountriesList()"};

A> lateBoundType.InvokeMember("EvalExpr", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v77, arg1);

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemtypeclassinvokemembertopic3.asp
и солнце б утром не вставало, когда бы не было меня
Re[7]: 1С и .NET
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 06.02.06 10:35
Оценка:
Здравствуйте, ablazhko, Вы писали:

До кучи http://msdn.microsoft.com/msdnmag/issues/03/09/CustomMarshaling/
и солнце б утром не вставало, когда бы не было меня
Re[7]: 1С и .NET
От: t_a_n_k Россия http://www.ufastudio.ru
Дата: 24.08.06 04:48
Оценка:
Здравствуйте, ablazhko, Вы писали:

A>интересует как получить возвращаемое значение функции 1С


Все еще актуально. Посмотрел ссылки в конце ветки, ниче толком не понял
...Безумству храбрых поем мы песню... (с) М.Горький
Re[8]: 1С и .NET
От: Red Bird Россия  
Дата: 24.08.06 06:46
Оценка:
Здравствуйте, t_a_n_k, Вы писали:

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


A>>интересует как получить возвращаемое значение функции 1С


___>Все еще актуально. Посмотрел ссылки в конце ветки, ниче толком не понял


Тоже не все понял из этой ветки...

Вообще сейчас для обмена данными, что с V77, что с V8 можно (и даже нужно) использовать XML.
Благо на диске ИТС лежат две конфигурации:

Поэтому для offline проще (и надежнее) обмениваться данными через XML.
Re[9]: 1С и .NET
От: t_a_n_k Россия http://www.ufastudio.ru
Дата: 24.08.06 06:50
Оценка:
Здравствуйте, Red Bird, Вы писали:

RB>Поэтому для offline проще (и надежнее) обмениваться данными через XML.


xml в моем случае не подходит — нужно именно ловить возвращаемые значения.
...Безумству храбрых поем мы песню... (с) М.Горький
Re[10]: 1С и .NET
От: t_a_n_k Россия http://www.ufastudio.ru
Дата: 24.08.06 09:10
Оценка:
У меня получилось примерно следующее:

string BaseCatalog=@"\\Test_base", User="TestDimon",Pass="123";
object[] arg=new object[3];
Type lateBoundType=Type.GetTypeFromProgID("v77S.Application",true);
object v77=Activator.CreateInstance(lateBoundType);
arg[0]=lateBoundType.InvokeMember("RMTrade",BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static,null,v77,null);
arg[1]=@"/D"+BaseCatalog+" /N"+User+" /P"+Pass;
arg[2]="";
lateBoundType.InvokeMember("Initialize",BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static,null,v77,arg);
object [] arg1 = new object[] {"FuckAchtung()"};
// выполняем ф-ию
object Params=lateBoundType.InvokeMember("EvalExpr", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v77, arg1);
// получаем значения
txtInfo.Text+="Value: "+(string)Params;
//before exit
System.Runtime.InteropServices.Marshal.ReleaseComObject(v77);
// чистим память, иначе процесс все равно остается.
GC.GetTotalMemory(true);


Ф-ия в 1С позращает один параметр.
...Безумству храбрых поем мы песню... (с) М.Горький
Re[11]: 1С и .NET
От: Red Bird Россия  
Дата: 24.08.06 11:14
Оценка:
Здравствуйте, t_a_n_k, Вы писали:

Ну, общем, да.

Только у меня 1cv7s.exe выгуржается из памяти по:
//before exit
System.Runtime.InteropServices.Marshal.ReleaseComObject(v77);
Re[12]: 1С и .NET
От: t_a_n_k Россия http://www.ufastudio.ru
Дата: 24.08.06 11:17
Оценка:
Здравствуйте, Red Bird, Вы писали:

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


RB>Ну, общем, да.


RB>Только у меня 1cv7s.exe выгуржается из памяти по:

RB>
RB>//before exit
RB>System.Runtime.InteropServices.Marshal.ReleaseComObject(v77);
RB>


Ну дык она и должна в этом месте выгружаться, но как я понял не всегда.
У меня процесс висит, пока память не почищу.
...Безумству храбрых поем мы песню... (с) М.Горький
Re[4]: 1С и .NET
От: t_a_n_k Россия http://www.ufastudio.ru
Дата: 14.09.06 06:31
Оценка:
Господа, а как же все-таки передать аргумент в вызываеммую 1С-ную ф-ию?
Например делаю так:

object [] arg1 = new object[] {"SomeFunction()"};


Удачно проходит только аргумент, как строка:

object [] arg1 = new object[] {"SomeFunction(\"bla-bla\")"};


А как передать в функцию массив или еще че-нить?
...Безумству храбрых поем мы песню... (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.