.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;            
        }

Оцени полезность:

5   голосов , оценка 4 из 5
Похожие ответы