powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Изменение/заполнение реквизитов справочника 1С средствами C#
13 сообщений из 13, страница 1 из 1
Изменение/заполнение реквизитов справочника 1С средствами C#
    #39160682
Rial
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Пишу свою программу на C# для управления справочником 1С. Сейчас бьюсь над заполнением реквизитов.
Добавил новый реквизит, привязал его к полю на форме. Теперь пытаюсь заполнить его из программы.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
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
Ошибка при вызове "МаркировкаКрана".
Попробовал воспользоваться другим способом:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
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))"}
Подскажите пожалуйста, как решить эту проблему.
...
Рейтинг: 0 / 0
Изменение/заполнение реквизитов справочника 1С средствами C#
    #39160684
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напрямую работать с объектами 1С не самое лучшее решение. Что-нибудь поменяется в структуре базы и твой код надо будет править.

Лучше написать обертку на 1С, а из твоего кода только ее вызов. В случае изменений править надо будет только обертку. И отлаживать так легче.

Деталей не подскажу, с 1С давно не сталкивался, там есть внешние обработки, т.е. модули с кодом не включенные в конфигурацию.
...
Рейтинг: 0 / 0
Изменение/заполнение реквизитов справочника 1С средствами C#
    #39160693
Rial
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TНапрямую работать с объектами 1С не самое лучшее решение. Что-нибудь поменяется в структуре базы и твой код надо будет править.

Лучше написать обертку на 1С, а из твоего кода только ее вызов. В случае изменений править надо будет только обертку. И отлаживать так легче.

Деталей не подскажу, с 1С давно не сталкивался, там есть внешние обработки, т.е. модули с кодом не включенные в конфигурацию.
Я поэтому и пишу на C#, т.к. я не знаю, как работает 1С.
В принципе, это можно реализовать средствами 1С, но я потрачу на это слишком много времени...
...
Рейтинг: 0 / 0
Изменение/заполнение реквизитов справочника 1С средствами C#
    #39160698
dvim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,Напрямую работать с объектами 1С не самое лучшее решение. Что-нибудь поменяется в структуре базы и твой код надо будет править.

Лучше написать обертку на 1С, а из твоего кода только ее вызов. В случае изменений править надо будет только обертку. И отлаживать так легче.

Можно сделать и так и так.
Но плюс работы с объектами напрямую - то, что при обновлении баз все происходит автоматом, можно работать с разными базами.
Для 90% случаев это важнее. (Плюс если в 1с поменяется логика - как я январе ОсновнойДоговорКонтрагента убрали "редиски" - то код все равно придется менять. Либо в обработчике 1с , либо на шарпе)


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
                  Agent1C = m_Instace_1C.Справочники.Контрагенты.СоздатьЭлемент();
                    if (!b_NeedFullName) Agent1C.Наименование = AgentCis.SynthName;
                    else Agent1C.Наименование = AgentCis.ShortName;
                    Agent1C.НаименованиеПолное = AgentCis.Name;
                    Agent1C.ИНН = AgentCis.INN;
                    Agent1C.КПП = AgentCis.KPP;
                    Agent1C.КодПоОКПО = AgentCis.OKPO;
                    Agent1C.Комментарий = "добавлено из С# ";
                    Agent1C.ЮридическийАдрес = AgentCis.JurAddr;
                    Agent1C.ФактическийАдрес = AgentCis.PostAddr;
                    if (AgentCis.Phones.Length > 0) sPhones = "Тел.: " + AgentCis.Phones;
                    if (AgentCis.Faxes.Length > 0) sPhones += " Факсы: " + AgentCis.Faxes;
                    Agent1C.Телефон = sPhones.Trim();
             
                    Agent1C.ЮрФизЛицо = m_Instace_1C.Перечисления.ЮрФизЛицо.ЮрЛицо;
                    Agent1C.Записать();

                    //---это для того, чтобы снять галку "ВходитВХолдинг". ПЦ, товарищи!!!
                    Agent1C.ГоловнойКонтрагент = Agent1C.Ссылка();
                    Agent1C.Записать();
...
Рейтинг: 0 / 0
Изменение/заполнение реквизитов справочника 1С средствами C#
    #39160700
dvim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dvim,

Вот рабочий пример записи контрагента.
...
Рейтинг: 0 / 0
Изменение/заполнение реквизитов справочника 1С средствами C#
    #39160706
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RialЯ поэтому и пишу на C#, т.к. я не знаю, как работает 1С.
В принципе, это можно реализовать средствами 1С, но я потрачу на это слишком много времени...
Я так же думал. Нафиг мне с 1С разбираться. В итоге убил кучу времени, понял что пишу на 1С, но не в 1С. Потом переписал на 1С и стало все нормально.
Ты используешь объекты 1С - значит это уже язык 1С.
...
Рейтинг: 0 / 0
Изменение/заполнение реквизитов справочника 1С средствами C#
    #39160711
Rial
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dvimDima T,Напрямую работать с объектами 1С не самое лучшее решение. Что-нибудь поменяется в структуре базы и твой код надо будет править.

Лучше написать обертку на 1С, а из твоего кода только ее вызов. В случае изменений править надо будет только обертку. И отлаживать так легче.

Можно сделать и так и так.
Но плюс работы с объектами напрямую - то, что при обновлении баз все происходит автоматом, можно работать с разными базами.
Для 90% случаев это важнее. (Плюс если в 1с поменяется логика - как я январе ОсновнойДоговорКонтрагента убрали "редиски" - то код все равно придется менять. Либо в обработчике 1с , либо на шарпе)


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
                  Agent1C = m_Instace_1C.Справочники.Контрагенты.СоздатьЭлемент();
                    if (!b_NeedFullName) Agent1C.Наименование = AgentCis.SynthName;
                    else Agent1C.Наименование = AgentCis.ShortName;
                    Agent1C.НаименованиеПолное = AgentCis.Name;
                    Agent1C.ИНН = AgentCis.INN;
                    Agent1C.КПП = AgentCis.KPP;
                    Agent1C.КодПоОКПО = AgentCis.OKPO;
                    Agent1C.Комментарий = "добавлено из С# ";
                    Agent1C.ЮридическийАдрес = AgentCis.JurAddr;
                    Agent1C.ФактическийАдрес = AgentCis.PostAddr;
                    if (AgentCis.Phones.Length > 0) sPhones = "Тел.: " + AgentCis.Phones;
                    if (AgentCis.Faxes.Length > 0) sPhones += " Факсы: " + AgentCis.Faxes;
                    Agent1C.Телефон = sPhones.Trim();
             
                    Agent1C.ЮрФизЛицо = m_Instace_1C.Перечисления.ЮрФизЛицо.ЮрЛицо;
                    Agent1C.Записать();

                    //---это для того, чтобы снять галку "ВходитВХолдинг". ПЦ, товарищи!!!
                    Agent1C.ГоловнойКонтрагент = Agent1C.Ссылка();
                    Agent1C.Записать();

Я находил примеры добавления новой записи в справочник Номенклатура, но это не помогло, к сожалению...
...
Рейтинг: 0 / 0
Изменение/заполнение реквизитов справочника 1С средствами C#
    #39160712
Rial
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TЯ так же думал. Нафиг мне с 1С разбираться. В итоге убил кучу времени, понял что пишу на 1С, но не в 1С. Потом переписал на 1С и стало все нормально.
Ты используешь объекты 1С - значит это уже язык 1С.
Проконсультироваться, какие объекты 1С нужно использовать - 3 минуты.
Разобраться в самой 1С - несколько часов.
...
Рейтинг: 0 / 0
Изменение/заполнение реквизитов справочника 1С средствами C#
    #39160713
dvim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

То, что разрабатывать этот код удобнее на 1с - факт.
Я обычно разрабатываю его на 1с в внешней обработке , потом переношу в c#

Этим достигаю то, что код работает на стандартной конфе - 0 проблем с обновлениями и с заменой конфигураций
...
Рейтинг: 0 / 0
Изменение/заполнение реквизитов справочника 1С средствами C#
    #39160720
dvim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rial,

Потому что получаешь ссылку и ее правишь - такой код и в 1с не заработает.
Нужно волшебное "ПолучитьОбъект"

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
ЭлементСсылка = справочники.Номенклатура.НайтиПоКоду(10);
Если Не ЗначениеЗаполнено(ЭлементСсылка) Тогда
Сообщить("На фиг такую работу...");
Возврат;
КонецЕсли;
Элемент = ЭлементСсылка.ПолучитьОбъект();
Элемент.Наименование = "Новое наименование";
Элемент.Записать();
...
Рейтинг: 0 / 0
Изменение/заполнение реквизитов справочника 1С средствами C#
    #39160726
Rial
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dvimRial,

Потому что получаешь ссылку и ее правишь - такой код и в 1с не заработает.
Нужно волшебное "ПолучитьОбъект"

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
ЭлементСсылка = справочники.Номенклатура.НайтиПоКоду(10);
Если Не ЗначениеЗаполнено(ЭлементСсылка) Тогда
Сообщить("На фиг такую работу...");
Возврат;
КонецЕсли;
Элемент = ЭлементСсылка.ПолучитьОбъект();
Элемент.Наименование = "Новое наименование";
Элемент.Записать();


А ларчик то просто открывался)
Огромнейшее Вам спасибо, все заработало! :)
...
Рейтинг: 0 / 0
Изменение/заполнение реквизитов справочника 1С средствами C#
    #39160736
dvim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rial,
Еще раз

1 - Создаем тестовую внешнюю обработку в 1с. Там пишем код и тестируем его
2 - Переносим код из п1 в C#
3- не забываем что com.connector глючная штука и иногда выдает ексепшны с падением программы. Делаем костылятор для этого (В самой программы эти ошибки не обрабатываются).
...
Рейтинг: 0 / 0
Изменение/заполнение реквизитов справочника 1С средствами C#
    #39160761
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТы используешь объекты 1С - значит это уже язык 1С.
не язык, а объектную модель
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Изменение/заполнение реквизитов справочника 1С средствами C#
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]