Интеграция 1С и C#. Обращение к 1С через COM. Создание номенклатуры и выполнение запроса к 1С из C# на примере интеграции с Союз-PLM (система информационной поддержки жизненного цикла изделий). Обработка «Загрузка заказа на сборку». (ERP)

29.12.18

Интеграция - Загрузка и выгрузка в Excel

Союз-PLM представляет собой полнофункциональный программный комплекс для решения  широкого спектра задач управления инженерной технической информацией наукоемких изделий и сложных инженерных объектов в области машиностроения, приборостроения, архитектуры, строительства. На практике, это управление конструкторской документацией, интегрированное с САПР, бизнес-процессы, файловый архив. Все это работает в SQL и шевелится с помощью скриптов на C#. Скрипты свободно  отлаживаются в MS Visual Studio. Подробнее смотрите на их сайте: http://www.programsoyuz.ru/products/system-soyuz-plm.html  Редактирование, конструирование и использование бизнес-процессов на порядок лучше систем на базе 1С из тех, что я изучил.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Пример скрипта выгруки изображений
.txt 11,19Kb
2
2 Скачать (1 SM) Купить за 1 850 руб.
Пример экспорта спецификации
.xlsx 8,87Kb
2
2 Скачать (1 SM) Купить за 1 850 руб.
Обработка загрузки заказа на сборку
.epf 15,42Kb
4
4 Скачать (1 SM) Купить за 1 850 руб.

Молочников Олег Spb. 2016.

Интеграция 1С и C#. Обращение к 1С через COM. Создание номенклатуры и выполнение запроса к 1С из C# на примере интеграции с Союз-PLM (система информационной поддержки жизненного цикла изделий). Обработка «Загрузка заказа на сборку». (ERP) (загрузка через EXCEL)

Что такое Союз-PLM. Согласно брошюрке это:

Союз-PLM представляет собой полнофункциональный программный комплекс для решения  широкого спектра задач управления инженерной технической информацией наукоемких изделий и сложных инженерных объектов в области машиностроения, приборостроения, архитектуры, строительства.

На практике, это управление конструкторской документацией, интегрированное с САПР, бизнес-процессы, файловый архив. Все это работает в SQL и шевелится с помощью скриптов на C#. Скрипты свободно  отлаживаются в MS Visual Studio. Подробнее смотрите на их сайте: http://www.programsoyuz.ru/products/system-soyuz-plm.html  Редактирование, конструирование и использование бизнес-процессов на порядок лучше систем на базе 1С из тех, что я изучил.

Пример кода выполняющего на стороне C# запрос в 1С:

 

	public override void Invoke( EntityAttribute attr, IEnumerable<CollectionElement> selectedElements )
	{
	         string connectionString = "srvr='192.168.0.999'; ref='с_copy'; usr='External'; pwd='123456';";
	        Type oType = Type.GetTypeFromProgID("V83.COMConnector");
	        if (oType != null)
	        {
	            //Создаем COMConnector, соединяемся с базой
	            object V8 = Activator.CreateInstance(oType);
	            object connection;
	            try
	            {
	                connection = oType.InvokeMember("Connect", BindingFlags.Public | BindingFlags.InvokeMethod, null, V8, new object[] { connectionString });
	            }
	            catch (Exception e)
	            {
	                Marshal.ReleaseComObject(V8);
	                    Service.UI.ShowMessage(string.Format("Ошибка подключения к 1С \'{0}\'", (e.InnerException.ToString()), e.Message));
	                return;
	            }
 
	            //Создаем и выполняем запрос (получение списка документов в заданном интервале)
	            object query = oType.InvokeMember("NewObject", BindingFlags.Public | BindingFlags.InvokeMethod, null, connection, new object[] { "Query" });
	            oType.InvokeMember("Текст", BindingFlags.Public | BindingFlags.SetProperty, null, query, new object[] { "ВЫБРАТЬ РеализацияТоваровУслуг.Дата, РеализацияТоваровУслуг.Номер, РеализацияТоваровУслуг.СуммаДокумента ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ГДЕ РеализацияТоваровУслуг.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата1, ДЕНЬ) И КОНЕЦПЕРИОДА(&Дата2, ДЕНЬ)" });
	            oType.InvokeMember("УстановитьПараметр", BindingFlags.Public | BindingFlags.InvokeMethod, null, query, new object[] { "Дата1", new DateTime(2016, 3, 1, 0, 0, 0) });
	            oType.InvokeMember("УстановитьПараметр", BindingFlags.Public | BindingFlags.InvokeMethod, null, query, new object[] { "Дата2", new DateTime(2016, 10, 1, 0, 0, 0) });
	            object queryResult = oType.InvokeMember("Выполнить", BindingFlags.Public | BindingFlags.InvokeMethod, null, query, new object[] { });
	            object queryResultSelection = oType.InvokeMember("Выбрать", BindingFlags.Public | BindingFlags.InvokeMethod, null, queryResult, new object[] { });
	            StringBuilder sb = new StringBuilder();
                sb.Length = 0;
                 while ((bool)oType.InvokeMember("Следующий", BindingFlags.Public | BindingFlags.InvokeMethod, null, queryResultSelection, new object[] { }))
	            {
	                object field_date = oType.InvokeMember("Дата", BindingFlags.Public | BindingFlags.GetProperty, null, queryResultSelection, new object[] { });
	                object field_num = oType.InvokeMember("Номер", BindingFlags.Public | BindingFlags.GetProperty, null, queryResultSelection, new object[] { });
	                object field_sum = oType.InvokeMember("СуммаДокумента", BindingFlags.Public | BindingFlags.GetProperty, null, queryResultSelection, new object[] { });
	                sb.Append("Дата:");
	                sb.Append(field_date);
	                sb.Append(",\t№ ");
	                sb.Append(field_num);
	                sb.Append("\t - ");
	                sb.Append(field_sum);
                    sb.Append("\n");
	            }
            Service.UI.ShowMessage(sb.ToString());
 
            //Освобождаем память
            Marshal.ReleaseComObject(queryResultSelection);
	            Marshal.ReleaseComObject(queryResult);
	            Marshal.ReleaseComObject(query);
	            Marshal.ReleaseComObject(connection);
	            Marshal.ReleaseComObject(V8);
	        }
     }
  
}

 

Пример кода создающего на стороне C# номенклатуру в 1С:

   public override void Invoke(EntityAttribute attr, IEnumerable<CollectionElement> selectedElements)
    {
        string connectionString = "srvr='192.168.0.999'; ref='с_copy'; usr='External'; pwd='External';";
        Type oType = Type.GetTypeFromProgID("V83.COMConnector");
        if (oType != null)
        {
            //Создаем COMConnector, соединяемся с базой
            object V8 = Activator.CreateInstance(oType);
            object connection;
            try
            {
                connection = oType.InvokeMember("Connect", BindingFlags.Public | BindingFlags.InvokeMethod, null, V8, new object[] { connectionString });
            }
            catch (Exception e)
            {
                Marshal.ReleaseComObject(V8);
                Service.UI.ShowMessage(string.Format("Ошибка подключения к 1С  \'{0}\'", (e.InnerException.ToString()), e.Message));
                return;
            }
            string NameOfItem1C = "Тест создания номенклатуры из C#3";
 
            object Items1C = oType.InvokeMember("NewObject", BindingFlags.Public | BindingFlags.InvokeMethod, null, connection, new object[] { "СправочникМенеджер.Номенклатура" });
            object FindItem1C = oType.InvokeMember("НайтиПоНаименованию", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, Items1C, new object[] { NameOfItem1C });
            bool IfItem1CExist = Convert.ToBoolean(oType.InvokeMember("ЗначениеЗаполнено", BindingFlags.Public | BindingFlags.InvokeMethod, null, connection, new object[] { FindItem1C }));
            if (IfItem1CExist==false) {
                object NewItem1C = oType.InvokeMember("СоздатьЭлемент", BindingFlags.Public | BindingFlags.InvokeMethod, null, Items1C, new object[] { });
                object SpeciesOfItems1C = oType.InvokeMember("NewObject", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, connection, new object[] { "СправочникМенеджер.ВидыНоменклатуры" });
                object Material_SpeciesOfItems1C = oType.InvokeMember("НайтиПоНаименованию", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, SpeciesOfItems1C, new object[] { "Материал" });
                NewItem1C.GetType().InvokeMember("ВидНоменклатуры", BindingFlags.PutDispProperty | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly, null, NewItem1C, new object[] { Material_SpeciesOfItems1C });
                oType.InvokeMember("ЗаполнитьРеквизитыПоВидуНоменклатуры", BindingFlags.Public | BindingFlags.InvokeMethod, null, Items1C, new object[] { NewItem1C });
                NewItem1C.GetType().InvokeMember("Наименование", BindingFlags.PutDispProperty | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly, null, NewItem1C, new object[] { NameOfItem1C });
                NewItem1C.GetType().InvokeMember("НаименованиеПолное", BindingFlags.PutDispProperty | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly, null, NewItem1C, new object[] { NameOfItem1C });
                try
                {
                    NewItem1C.GetType().InvokeMember("Записать", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, NewItem1C, new object[] { });
                }
                catch (Exception e)
                {
                    Marshal.ReleaseComObject(Items1C);
                    Marshal.ReleaseComObject(connection);
                    Marshal.ReleaseComObject(V8);
                    Service.UI.ShowMessage(string.Format("Ошибка записи номенклатуры  \'{0}\'", (e.InnerException.ToString()), e.Message));
                    return;
                }
            }
         //Освобождаем память 
            Marshal.ReleaseComObject(Items1C);
            Marshal.ReleaseComObject(connection);
            Marshal.ReleaseComObject(V8);
 } }    }
 

Для работы этого кода вам придется в свойствах конфигурации в окне "Заголовок для скриптов" дописать:

using System.Reflection;
using System.Runtime.InteropServices;

В случае, если у вас возникает ошибка несоответсвия версий , рекомедую поискать comcntr.dll в regedit  и поправить пути.
В случае, если у вас возникает ошибка 800700c1 не является приложением Win32то весьма рекомендую статью //infostart.ru/public/197627/  ("Ошибка V82.COMConnector на сервере 64. Решение проблемы")

 

По дополнительному запросу Союз-PLM  высылает шаблон документа “Сводная спецификация”.  Мы слегка модифицируем этот документ, добавив в шаблон в табличную часть поле “Покупной / IsPurchased” (Bool). Этот атрибут нам нужен, для того что бы мы знали какие детали мы купим в  виде готового узла, а какие подузлы будем собирать сами из комплектующих, которые, в свою очередь, тоже  надо обеспечить (купить или сделать) для сборки.

В скрипте формирования табличной части в процедуре public void ParseItem( ) меняем одну строку для заполнения нового атрибута.

                    // Однотипно заполняемые атрибуты
                    Line[ "IsPurchased" ] = IsPurchased;  // Эту строку мы добавили
                    Line[ "Order" ] = attr.CollectionElements.Count;

 Больше ничего менять не надо, нам вполне подойдет штатная выгрузка в Excel, прямо в документе, для передачи данных в 1С.

Подключаем обработку в ERP (НСИ и администрирование -> Печатные формы -> Дополнительные отчеты и обработки.) В документе “Заказ на сборку” в меню заполнение появится кнопка “Загрузить заказ на сборку из файла”.

 

Выбираем файл данных, которые будем загружать.  Указываем схему обеспечения и папку по умолчанию  для вновь созданной номенклатуры. Нажимаем кнопку прочитать файл.

К статье прилагается пример excel файла для загрузки, на случай если вы будете формировать его в другой системе.  После нажатия кнопки строится дерево узлов комплектующих. 

Если для узла есть соответствие в ERP, то по сочетанию Обозначение+” ”+Наименование подбирается номенклатура из ERP.  Производится визуальный контроль заполнения колонки “Номенклатура ERP”. Если есть  номенклатура, которая названа по другому чем в PLM, но которую надо привести к стандарту, она выбирается в этой колонке вручную. 

После нажатия кнопки “Создать/обновить номенклатуру в ERP” будет создана недостающая номенклатура, а указанная приведена к стандарту.  В созданной номенклатуре артикул будет заполнен Обозначением.   

Нажатие кнопки “Добавить в документ” выгружает данные в документ. Количество комплектующих умножается на количество изделий, которые надо собрать в заказе на сборку. Если для узла стоит флаг “Покупной”, то он выгружается без подузлов.

К статье прилагается скрипт на C# для выгрузки  всех актуальных чертежей в форматах “tiff” и “pdf” для шаблона “исполнение изделия в версии (ЭСИ ГОСТ 2.053)”.   К теме имеет отношение слабое, но вдруг кому пригодиться.

 

Обработка гарантированно работает на платформе 8.3 (тестировано на релизе 8.3.8.1652) с конфигурациями 1С:ERP Управление предприятием 2 (тестировано на релизе 2.1.3.136)  только на управляемых формах.

 

Акция! Вы можете скачать эту разработку в  составе архива всех моих разработок, которые я предлагаю за StartMone, по Специальной  цене//infostart.ru/public/960899/#archive

 

P.S.: Надеюсь, вам понравится эта и другие мои статьи и разработки на //infostart.ru/profile/48714/.

 

Очень жду ваших комментариев  и пожеланий.

 

Молочников Олег Spb. 2016.

 

Обработка Загрузка Союз-PLM интеграция com

См. также

Внешние источники данных Программист Бизнес-аналитик Пользователь Платформа 1С v8.3 Управляемые формы Анализ и прогнозирование 1C:Бухгалтерия Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.

28500 руб.

15.11.2022    22374    23    49    

39

SALE! 20%

Загрузка и выгрузка в Excel Оптовая торговля Печатные формы Бухгалтер Пользователь Платформа 1С v8.3 Управляемые формы Платформа 1C v8.2 1C:Бухгалтерия 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление холдингом 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная обработка для загрузки документов из Excel в 1С. Забудьте о ручном вводе: загружайте документы из Excel в 1С за секунды! Не требует указания параметров (номера колонок, номер первой строки таблицы и т.д.) и предварительной настройки. Просто выбираете файл Excel, документ 1С и нажимаете кнопку "Загрузить". Обработка сама находит таблицу в файле Excel, необходимые для загрузки данные в ней (номенклатура, количество, НДС, цена, сумма) и загружает ее в 1С.

6000 5100 руб.

09.11.2016    240208    1100    906    

1031

Загрузка и выгрузка в Excel Маркетплейсы Программист Бухгалтер Пользователь Платформа 1С v8.3 Бухгалтерский учет 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Управленческий учет Платные (руб)

Реальный помощник, с помощью которого Вы преобразуете необходимые документы для Wildberries, OZON, ЯндексМаркет, Мегамаркет, Aliexpress, Детский мир, МагнитЭкспресс (быв.Казань-Экспресс), Леруа Мерлен, ЭНФАНТА (Акушерство), ЛаМода, Летуаль, Твой дом, Золотое Яблоко в документы "Отчет комиссионера (агента) о продажах" и другие. Работает в 1С:БП 3.0, 1С:БП 3.0 КОРП, 1С:УТ 11, 1С:УНФ, 1С:КА 2, 1С:ERP Управление предприятием. Возможность подключить любые маркетплейсы. Анализ продаж ОZON. 30 дней БЕСПЛАТНОГО пользования!

5400 руб.

12.08.2021    37331    397    68    

170

Зарплата Внешние источники данных Бюджетный учет Перенос данных 1C Системный администратор Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 8 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

120000 руб.

19.08.2020    26167    25    1    

28

Загрузка и выгрузка в Excel Логистика, склад и ТМЦ Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Бухгалтер Пользователь Платформа 1С v8.3 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Эволюция не стоит на месте - новая удобная версия функциональной обработки для Вашего бизнеса! Что же Вы получаете? Удобный и интуитивно понятный интерфейс с 3-мя этапами работы. 2 режима - автоматический и ручной. Чтение XLSX, XLSM, CSV, XML/YML форматов без офиса, на любом сервере! Визуальное связывание колонок файла и реквизитов простым перетаскиванием колонок. Создание или обновление номенклатуры с иерархией, характеристик, доп. реквизитов, упаковок, загрузка практически неограниченного количества картинок на одну номенклатуру (с возможностью загрузки в несколько потоков одновременно), с хранением в томах или в базе. Загрузка номенклатуры поставщиков или поиск по их данным номенклатуры. Загрузка доп. реквизитов в характеристики. Загрузка штрихкодов с генерацией новых. Создание элементов справочников и ПВХ "на лету" для выбранных реквизитов. (Обновление от 10.02.2025, версия 9.9 - 9.15)

16800 руб.

20.11.2015    158396    385    378    

517

Внешние источники данных Зарплата Бюджетный учет Программист Бухгалтер Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 7.хх учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

84000 руб.

24.04.2017    52381    104    165    

91

Внешние источники данных Платформа 1С v8.3 1C:Бухгалтерия Платные (руб)

Готовая интеграция для управляемых форм. Встраивается в вашу 1С как расширение. Реализует автоматический обмен данными между 1С (1С:Фитнес клуб и аналогов) и СКУД RusGuard, автоматизирует бизнес-процессы по созданию и учету сотрудников в СКУД. Значительно упрощает работу специалистов отдела кадров и отдела безопасности: избавляет от двойного ввода информации в 1С и СКУД.

94999 руб.

11.07.2024    1201    1    0    

3

Зарплата Внешние источники данных Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 8 организаций (далее Парус) в конфигурацию 1С:Зарплата и управление персоналом, ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

120000 руб.

07.06.2021    13630    2    3    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. vz1987 15 16.12.17 02:10 Сейчас в теме
Спасибо за статью!
Может кому-нибудь пригодится, опишу свои грабли, на которые наступил: ловил исключение "Error loading type library/DLL. (Exception from HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY))" на строке кода
 connection = oType.InvokeMember("Connect", BindingFlags.Public | BindingFlags.InvokeMethod, null, V8, new object[] { connectionString });
.
Гугление данного кода ошибки вело меня совсем не в ту степь. А проблема оказалась в том, что Visual Studio была запущена не от Администратора.
2. premierex 206 07.06.19 09:29 Сейчас в теме
(0) Вот в этом участке кода
try
{
NewItem1C.GetType().InvokeMember("Записать", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, NewItem1C, new object[] { });
}
catch (Exception e)
{
Marshal.ReleaseComObject(Items1C);
Marshal.ReleaseComObject(connection);
Marshal.ReleaseComObject(V8);
Service.UI.ShowMessage(string.Format("Ошибка записи номенклатуры \'{0}\'", (e.InnerException.ToString()), e.Message));
return;
}
}
//Освобождаем память
Marshal.ReleaseComObject(Items1C);
Marshal.ReleaseComObject(connection);
Marshal.ReleaseComObject(V8);
Показать

высвобождение интерфейсов в констукции catch(...){...} и выход из процедуры, мне кажется, избыточны. Достаточно вывести предупреждение и дать программе завершить процедуру. Ниже по коду как-раз таки высвобождаются интерфейсы и происходит выход.
А в общем целом познавательно.
Оставьте свое сообщение