.NET 4.x Изменение/заполнение реквизитов справочника 1С средствами C#

Узнай цену своей работы

Формулировка задачи:

Добрый день! Пишу свою программу на C# для управления справочником 1С. Сейчас бьюсь над заполнением реквизитов. Добавил новый реквизит, привязал его к полю на форме. Теперь пытаюсь заполнить его из программы.
Листинг программы
  1. private dynamic Connect1()
  2. {
  3. string user = @"""user""";
  4. string pas = @"""password""";
  5. string file = @"""path""";
  6. dynamic result = "";
  7. V83.COMConnector com1s = new V83.COMConnector();
  8. com1s.PoolCapacity = 10;
  9. com1s.PoolTimeout = 60;
  10. com1s.MaxConnections = 2;
  11. string con = "File=" + file + ";Usr=" + user + ";Pwd=" + pas + ";";
  12. try
  13. {
  14. result = com1s.Connect(con);
  15. }
  16. catch (Exception ex)
  17. {
  18. MessageBox.Show("Ошибка соединения с 1С.\r\n" + ex.Message);
  19. }
  20. return result;
  21. }
  22. private string Search(dynamic result, string name)
  23. {
  24. bool res = false;
  25. dynamic NomCode = "NOT_FOUND";
  26. dynamic referContactors;
  27. dynamic ЗапросНоменклатура;
  28. dynamic РезультатНоменклатура;
  29. string НоменклатураНомер = "NULL";
  30. ЗапросНоменклатура = result.NewObject("Запрос");
  31. ЗапросНоменклатура.Текст = "ВЫБРАТЬ Номенклатура.Код, Номенклатура.МаркировкаКрана, Номенклатура.СерийныйНомер, Номенклатура.Наименование КАК Наименование " +
  32. "ИЗ Справочник.Номенклатура КАК Номенклатура ";
  33. РезультатНоменклатура = ЗапросНоменклатура.Выполнить();
  34. referContactors = РезультатНоменклатура.Выбрать();
  35. bool next = true;
  36. while (next)
  37. {
  38. next = referContactors.Следующий();
  39. НоменклатураНомер = Convert.ToString(referContactors.СерийныйНомер);
  40. if (НоменклатураНомер == name)
  41. {
  42. NomCode = referContactors.Код;
  43. referContactors.МаркировкаКрана = name; // ошибка в этой строке
  44. res = true;
  45. break;
  46. }
  47. }
  48. return NomCode;
  49. }
  50. private void button2_Click(object sender, EventArgs e)
  51. {
  52. object res = Connect1();
  53. Search(res, "SN-0.1-00");
  54. }
Текст ошибки:
MissingMemberException Ошибка при вызове "МаркировкаКрана".
Попробовал воспользоваться другим способом:
Листинг программы
  1. private void button2_Click(object sender, EventArgs e)
  2. {
  3. string user = @"""login""";
  4. string pas = @"""password""";
  5. string file = @"""path""";
  6. string con = "File=" + file + ";Usr=" + user + ";Pwd=" + pas + ";";
  7. string res = Connect1C(con);
  8. FillcBoxStorage();
  9. }
  10. object v83Base = null;
  11. private string Connect1C(string connection)
  12. {
  13. // создание COM объекта для соединения с 1С
  14. string result ="";
  15. V83.COMConnector connector = new V83.COMConnector()
  16. v83Base = connector.Connect((string)connection);
  17. FillcBoxStorage();
  18. return result;
  19. }
  20. private void FillcBoxStorage()
  21. {
  22. object setValue = "TestValue";
  23. object storage = ExecuteCreateObject(v83Base, "NewObject", new object[] { "Запрос" });
  24. SetProperty(storage, "Текст", new object[] { RequestStorage });
  25. object result = ExecuteFunction(storage, "Выполнить", null);
  26. object selection = ExecuteFunction(result, "Выбрать", null);
  27. while ((bool) ExecuteFunction(selection, "Следующий", null))
  28. {
  29. if (Convert.ToString(GetProperty(selection, "СерийныйНомер")) == "SN-0.1-00")
  30. {
  31. SetProperty(selection, "Наименование", new object[] { setValue }); // ошибка (процедура описана ниже)
  32. MessageBox.Show("ok");
  33. }
  34. }
  35. }
  36. private static BindingFlags CREATE_OBJECT = BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.CreateInstance;
  37. private static BindingFlags INVOKE_METHOD = BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static;
  38. private static BindingFlags GET_PROPERTY = BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.Static;
  39. private static BindingFlags SET_PROPERTY = BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Static;
  40. public static object ExecuteCreateObject(object Object1C, string NameObject, object[] Arguments)
  41. {
  42. return Object1C.GetType().InvokeMember(NameObject, CREATE_OBJECT, null, Object1C, Arguments);
  43. }
  44. public static void SetProperty(object Object1C, string NameObject, object[] Arguments)
  45. {
  46. Object1C.GetType().InvokeMember(NameObject, SET_PROPERTY, null, Object1C, Arguments); // ошибка
  47. }
  48. public static object GetProperty(object Object1C, string NameObject)
  49. {
  50. return Object1C.GetType().InvokeMember(NameObject, GET_PROPERTY, null, Object1C, null);
  51. }
  52. public static object ExecuteFunction(object Object1C, string NameObject, object[] Arguments)
  53. {
  54. return Object1C.GetType().InvokeMember(NameObject, INVOKE_METHOD, null, Object1C, Arguments);
  55. }
  56. public static string RequestStorage = "ВЫБРАТЬ Номенклатура.Код, Номенклатура.МаркировкаКрана, Номенклатура.СерийныйНомер, Номенклатура.Наименование КАК Наименование " +
  57. "ИЗ Справочник.Номенклатура КАК Номенклатура ";
Здесь другая ошибка:
TargetInvocationException {"Член группы не найден. (Исключение из HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND))"}
Подскажите пожалуйста, как решить эту проблему.

Решение задачи: «.NET 4.x Изменение/заполнение реквизитов справочника 1С средствами C#»

textual
Листинг программы
  1. private string Search(dynamic result, object name)
  2.         {
  3.             dynamic NomCode = "NOT_FOUND";
  4.             dynamic referContactors;
  5.             dynamic ЗапросНоменклатура;
  6.             dynamic РезультатНоменклатура;
  7.             object НоменклатураНомер = "NULL";
  8.             dynamic ЭлементСсылка;
  9.             dynamic Элемент;
  10.  
  11.             ЗапросНоменклатура = result.NewObject("Запрос");
  12.             ЗапросНоменклатура.Текст = "ВЫБРАТЬ Номенклатура.Код, Номенклатура.МаркировкаКрана, Номенклатура.СерийныйНомер, Номенклатура.Наименование КАК Наименование " +
  13.                 "ИЗ Справочник.Номенклатура КАК Номенклатура ";
  14.  
  15.             РезультатНоменклатура = ЗапросНоменклатура.Выполнить();
  16.             referContactors = РезультатНоменклатура.Выбрать();
  17.            
  18.             bool next = true;
  19.            
  20.             while (next)
  21.             {
  22.                 next = referContactors.Следующий();              
  23.  
  24.                 if (Convert.ToString(referContactors.Код) == Convert.ToString(name))
  25.                 {
  26.                     ЭлементСсылка = result.Справочники.Номенклатура.НайтиПоКоду(name);
  27.                    
  28.                     Элемент = ЭлементСсылка.ПолучитьОбъект();
  29.                     Элемент.СерийныйНомер = "Новое наименование";
  30.                     Элемент.Записать();
  31.                    
  32.                     break;
  33.                 }                
  34.             }
  35.             return NomCode;            
  36.         }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

5   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы