.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;
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д