Thursday, December 18, 2008

Запуск внешний обработки 1Сv7/1Cv8 из C#

Для того чтоб запустить внешнюю обработку на семерке надо:

object v77 = null;
object retVal = null;

try
{
string BaseCatalog,
User = "",
Pass = "";
object[] arg = new object[3];
Type lateBoundType = Type.GetTypeFromProgID("v77.Application", true);
v77 = Activator.CreateInstance(lateBoundType);

arg[0] = lateBoundType.InvokeMember("RMTrade", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v77, null);
arg[1] = @"/D" + "D:\\Work\\База 1С" + " /N" + User + " /P" + Pass;
arg[2] = "NO_SPLASH_SHOW";

lateBoundType.InvokeMember("Initialize", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v77, arg);

object[] arg1 = new object[] { "ОткрытьФорму(\"Обработка\", ,\"C:\\Parts\\СоздатьЗаказ.ert\")" };
// запускаем обработку если Р=1 то выполнено успешно,если 0 то невыполнено
retVal = lateBoundType.InvokeMember("EvalExpr", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v77, arg1);

}
catch (Exception er)
{ }
finally
{
// убиваем 1С
System.Runtime.InteropServices.Marshal.ReleaseComObject(v77);
GC.GetTotalMemory(true);
}

Для восьмерки надо:

1.Создать метод в обработке с атрибутом эксопрт

функция МояПроцедура() экспорт
возврат 5;
конецфункции

2.В программе:

var v81comType = Type.GetTypeFromProgID("V8.Application");
var v81 = Activator.CreateInstance(v81comType);

Object[] arguments = { @"File=""D:\Work\База 1С"";Usr=""Администратор"";" };
object trade = v81comType.InvokeMember("Connect", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v81, arguments);

object v8_componenta = v81comType.InvokeMember("NewObject", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v81, new object[] { "ВнешниеОбработкиМенеджер" });

object[] arg = { "c:\\111.epf" };
object myCompanent = v81comType.InvokeMember("Создать", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v8_componenta, arg);

object myForm = v81comType.InvokeMember("МояПроцедура", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, myCompanent, null);

System.Runtime.InteropServices.Marshal.ReleaseComObject(v81);
GC.GetTotalMemory(true);

No comments:

Post a Comment