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