.NET 4.x Изменение/заполнение реквизитов справочника 1С средствами C#
Формулировка задачи:
Добрый день!
Пишу свою программу на C# для управления справочником 1С. Сейчас бьюсь над заполнением реквизитов.
Добавил новый реквизит, привязал его к полю на форме. Теперь пытаюсь заполнить его из программы.
Текст ошибки:
Попробовал воспользоваться другим способом:
Здесь другая ошибка:
Подскажите пожалуйста, как решить эту проблему.
private dynamic Connect1() { string user = @"""user"""; string pas = @"""password"""; string file = @"""path"""; dynamic result = ""; V83.COMConnector com1s = new V83.COMConnector(); com1s.PoolCapacity = 10; com1s.PoolTimeout = 60; com1s.MaxConnections = 2; string con = "File=" + file + ";Usr=" + user + ";Pwd=" + pas + ";"; try { result = com1s.Connect(con); } catch (Exception ex) { MessageBox.Show("Ошибка соединения с 1С.\r\n" + ex.Message); } return result; } private string Search(dynamic result, string name) { bool res = false; dynamic NomCode = "NOT_FOUND"; dynamic referContactors; dynamic ЗапросНоменклатура; dynamic РезультатНоменклатура; string НоменклатураНомер = "NULL"; ЗапросНоменклатура = result.NewObject("Запрос"); ЗапросНоменклатура.Текст = "ВЫБРАТЬ Номенклатура.Код, Номенклатура.МаркировкаКрана, Номенклатура.СерийныйНомер, Номенклатура.Наименование КАК Наименование " + "ИЗ Справочник.Номенклатура КАК Номенклатура "; РезультатНоменклатура = ЗапросНоменклатура.Выполнить(); referContactors = РезультатНоменклатура.Выбрать(); bool next = true; while (next) { next = referContactors.Следующий(); НоменклатураНомер = Convert.ToString(referContactors.СерийныйНомер); if (НоменклатураНомер == name) { NomCode = referContactors.Код; referContactors.МаркировкаКрана = name; // ошибка в этой строке res = true; break; } } return NomCode; } private void button2_Click(object sender, EventArgs e) { object res = Connect1(); Search(res, "SN-0.1-00"); }
MissingMemberException
Ошибка при вызове "МаркировкаКрана".
private void button2_Click(object sender, EventArgs e) { string user = @"""login"""; string pas = @"""password"""; string file = @"""path"""; string con = "File=" + file + ";Usr=" + user + ";Pwd=" + pas + ";"; string res = Connect1C(con); FillcBoxStorage(); } object v83Base = null; private string Connect1C(string connection) { // создание COM объекта для соединения с 1С string result =""; V83.COMConnector connector = new V83.COMConnector() v83Base = connector.Connect((string)connection); FillcBoxStorage(); return result; } private void FillcBoxStorage() { object setValue = "TestValue"; object storage = ExecuteCreateObject(v83Base, "NewObject", new object[] { "Запрос" }); SetProperty(storage, "Текст", new object[] { RequestStorage }); object result = ExecuteFunction(storage, "Выполнить", null); object selection = ExecuteFunction(result, "Выбрать", null); while ((bool) ExecuteFunction(selection, "Следующий", null)) { if (Convert.ToString(GetProperty(selection, "СерийныйНомер")) == "SN-0.1-00") { SetProperty(selection, "Наименование", new object[] { setValue }); // ошибка (процедура описана ниже) MessageBox.Show("ok"); } } } private static BindingFlags CREATE_OBJECT = BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.CreateInstance; private static BindingFlags INVOKE_METHOD = BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static; private static BindingFlags GET_PROPERTY = BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.Static; private static BindingFlags SET_PROPERTY = BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Static; public static object ExecuteCreateObject(object Object1C, string NameObject, object[] Arguments) { return Object1C.GetType().InvokeMember(NameObject, CREATE_OBJECT, null, Object1C, Arguments); } public static void SetProperty(object Object1C, string NameObject, object[] Arguments) { Object1C.GetType().InvokeMember(NameObject, SET_PROPERTY, null, Object1C, Arguments); // ошибка } public static object GetProperty(object Object1C, string NameObject) { return Object1C.GetType().InvokeMember(NameObject, GET_PROPERTY, null, Object1C, null); } public static object ExecuteFunction(object Object1C, string NameObject, object[] Arguments) { return Object1C.GetType().InvokeMember(NameObject, INVOKE_METHOD, null, Object1C, Arguments); } public static string RequestStorage = "ВЫБРАТЬ Номенклатура.Код, Номенклатура.МаркировкаКрана, Номенклатура.СерийныйНомер, Номенклатура.Наименование КАК Наименование " + "ИЗ Справочник.Номенклатура КАК Номенклатура ";
TargetInvocationException
{"Член группы не найден. (Исключение из HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND))"}
Решение задачи: «.NET 4.x Изменение/заполнение реквизитов справочника 1С средствами C#»
textual
Листинг программы
private string Search(dynamic result, object name) { dynamic NomCode = "NOT_FOUND"; dynamic referContactors; dynamic ЗапросНоменклатура; dynamic РезультатНоменклатура; object НоменклатураНомер = "NULL"; dynamic ЭлементСсылка; dynamic Элемент; ЗапросНоменклатура = result.NewObject("Запрос"); ЗапросНоменклатура.Текст = "ВЫБРАТЬ Номенклатура.Код, Номенклатура.МаркировкаКрана, Номенклатура.СерийныйНомер, Номенклатура.Наименование КАК Наименование " + "ИЗ Справочник.Номенклатура КАК Номенклатура "; РезультатНоменклатура = ЗапросНоменклатура.Выполнить(); referContactors = РезультатНоменклатура.Выбрать(); bool next = true; while (next) { next = referContactors.Следующий(); if (Convert.ToString(referContactors.Код) == Convert.ToString(name)) { ЭлементСсылка = result.Справочники.Номенклатура.НайтиПоКоду(name); Элемент = ЭлементСсылка.ПолучитьОбъект(); Элемент.СерийныйНомер = "Новое наименование"; Элемент.Записать(); break; } } return NomCode; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д