[ELMA3] Пример использования интеграции с 1C
В данной статье рассмотрен пример интеграции ELMA и 1С.
Данный процесс затрагивает все основные возможности интеграции 1С и ELMA: получение данных из справочников, создание, редактирование и сохранение справочников, создание, редактирование и проведение документов.
Используются следующие сценарии: создание нового контрагента в 1С, создание нового контрагента в ELMA, создание нового документа в 1С, передача данных из справочника 1С в контекст процесса.
В данном примере пользователь системы ELMA выбирает контрагента и создает счет по этому контрагенту. В том случае, если данный контрагент еще не заведен в 1С / ELMA или не существует ни в одной из систем, происходит его создание в нужной системе либо в обеих сразу. Если контрагент уже где-то существует, его реквизиты передаются из существующего в новый. Если это новый контрагент, реквизиты заполняются пользователями. После создания или выбора контрагента для него создается счет.
Используемые контекстные переменные:
- Naimenovanie – переменная типа Строка;
- INN – переменная типа Строка;
- Kontragent1S – переменная типа Контрагенты (Справочник 1С);
- KontragentELMA – переменная типа Контрагент (Объект);
- Way – переменная типа Целое число.
Примеры сценариев с использованием PublicAPI
Примечание
Актуальная документация по PublicAPI доступна по ссылке.
Внимание!
Сценарии, указанные ниже, актуальны для версий системы ELMA с 3.8 включительно до 3.12.1 включительно.
public void savein1c(Context context)//блок Контрагент есть в ELMA { //получаем доступ к 1с //получаем com connector, где "one" это название конфигурации var connector = PublicAPI.Services.Integration1C.GetComConnector("one"); //получаем ссылку на справочник Контрагенты dynamic Kref = connector.GetFunctionValue("NewObject", "CatalogManager.Контрагенты"); //используя язык 1с, производим необходимые операции, справка по объектам 1С //есть в Конфигураторе 1С в Синтакс-помощнике var newK = Kref.СоздатьЭлемент(); //присваеваем значение контекстных переменных newK.Наименование = context.KontragentELMA.Name; newK.ИНН = context.KontragentELMA.INN; //сохраняем запись в справочнике newK.Записать(); context.Naimenovanie = context.KontragentELMA.Name; context.Naimenovanie = context.KontragentELMA.INN; } public void saveinelma(Context context)//блок Контрагент есть в 1С { //создаем контрагента в элме на основе контрагента 1С (в зависимости от типа контрагента: юридическое или физическое лицо) //Создание юридического лица: var from1C = PublicAPI.CRM.Contractor.ContractorLegal.Create(); //Создание физического лица: //var from1C = PublicAPI.CRM.Contractor.ContractorIndividual.Create(); //присвоение переменных нового контрагента из контрагента 1С from1C.Name = context.Kontragent1S.Naimenovanie; from1C.INN = context.Kontragent1S.INN; //в качестве создателя указываем текущего пользователя from1C.CreationAuthor = PublicAPI.Services.Authentication.GetCurrentUser(); from1C.Save(); context.Naimenovanie = context.Kontragent1S.Naimenovanie; context.INN = context.Kontragent1S.Naimenovanie; } public void newKontragent(Context context)//блок Новый контрагент { //создаем контрагента в 1С с помощью контекстных переменных var connector = PublicAPI.Services.Integration1C.GetComConnector("one"); dynamic Kref = connector.GetFunctionValue("NewObject", "CatalogManager.Контрагенты"); var newK = Kref.СоздатьЭлемент(); newK.Наименование = context.Naimenovanie; newK.ИНН = context.INN; newK.Записать(); //создаем контрагента в ELMA с помощью контекстных переменных //Создание юридического лица: var fromCont = PublicAPI.CRM.Contractor.ContractorLegal.Create(); //Создание физического лица: //var fromCont = PublicAPI.CRM.Contractor.ContractorIndividual.Create(); fromCont.Name = context.Naimenovanie; fromCont.INN = context.INN; fromCont.CreationAuthor = PublicAPI.Services.Authentication.GetCurrentUser(); fromCont.Save(); } public void wayCh(Context context)//блок Далее { //Создаем нового контрагента в ELMA if (context.KontragentELMA == null && context.Kontragent1S != null) { context.Way = 0; } //Создаем нового контрагента в 1С if (context.Kontragent1S == null && context.KontragentELMA != null) { context.Way = 1; } //Создаем нового контрагента в ELMA и 1С if (context.Kontragent1S == null && context.KontragentELMA == null) { context.Way = 2; } } public void onLoad(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)//при загрузке формы Создать счет { //если контрагент 1С еще не был выбран, записываем его в контекстную переменную if (context.Way > 0) { var connector = PublicAPI.Services.Integration1C.GetComConnector("one"); dynamic bookRef = connector.GetFunctionValue("NewObject", "CatalogManager.Контрагенты"); var kontragent = bookRef.НайтиПоНаименованию(context.Naimenovanie).ПолучитьОбъект(); var comObj = new ComObject(kontragent); var guid_spr = new Guid(connector.GetFunctionValue(V81Consts.String, comObj.Get(V81Consts.GetRef).GetFunctionValue(V81Consts.Uid)).ToString()); context.Kontragent1S = PublicAPI.Services.Integration1C.LoadConfObject<EleWise.ELMA.Integration1C.Configs.One.Kontragenty>(guid_spr); } } public void newinvoice(Context context)//блок Создание счета { var connector = PublicAPI.Services.Integration1C.GetComConnector("one"); //указываем документ который нужно создать dynamic Dref = connector.GetFunctionValue("NewObject", "DocumentManager.СчетНаОплатуПокупателю"); var newD = Dref.СоздатьДокумент(); //дата создания - текущая дата newD.Дата = DateTime.Now; //получаем ссылку на справочник контрагенты var KRef = context.Kontragent1S.GetComReference().Ref; newD.Контрагент = KRef; newD.Записать(); }
Примеры сценариев без использования PublicAPI
Для работы сценариев необходимо подключить сборку Microsoft.CSharp, и пространства имен:
using EleWise.ELMA.CRM.Models; using EleWise.ELMA.Integration1C; using EleWise.ELMA.Integration1C.Data; using EleWise.ELMA.Security.Models; using EleWise.ELMA.Security.Services; using EleWise.ELMA.Services; using EleWise.ELMA.Integration1C.V81;
Сценарии:
public void savein1c(Context context)//блок Контрагент есть в ELMA { //получаем доступ к 1с var con = Locator.GetServiceNotNull<Integration1CService>(); // "one" это название конфигурации ComObject connector = con.GetComConnector("one"); //получаем ссылку на справочник Контрагенты dynamic Kref = connector.GetFunctionValue ("NewObject", "CatalogManager.Контрагенты"); //используя язык 1с, производим необходимые операции, справка по объектам 1С //есть в Конфигураторе 1С в Синтакс-помощнике var newK = Kref.СоздатьЭлемент(); //присваеваем значение контекстных переменных newK.Наименование = context.KontragentELMA.Name; newK.ИНН = context.KontragentELMA.INN; //сохраняем запись в справочнике newK.Записать(); context.Naimenovanie = context.KontragentELMA.Name; context.Naimenovanie = context.KontragentELMA.INN; } public void saveinelma(Context context)//блок Контрагент есть в 1С { //создаем контрагента в элме на основе контрагента 1С (в зависимости от типа контрагента: юридическое или физическое лицо) //Создание юридического лица: var from1C = InterfaceActivator.Create<ContractorLegal>(); //Создание физического лица: //var from1C = InterfaceActivator.Create<ContractorIndividual>(); //присвоение переменных нового контрагента из контрагента 1С from1C.Name = context.Kontragent1S.Naimenovanie; from1C.INN = context.Kontragent1S.INN; //в качестве создателя указываем текущего пользователя from1C.CreationAuthor = (User)AuthenticationService.GetCurrentUser<EleWise.ELMA.Security.Models.IUser>(); from1C.Save(); context.Naimenovanie = context.Kontragent1S.Naimenovanie; context.INN = context.Kontragent1S.Naimenovanie; } public void newKontragent(Context context)//блок Новый контрагент { //создаем контрагента в 1С с помощью контекстных переменных var con = Locator.GetServiceNotNull<Integration1CService>(); ComObject connector = con.GetComConnector("one"); dynamic Kref = connector.GetFunctionValue ("NewObject", "CatalogManager.Контрагенты"); var newK = Kref.СоздатьЭлемент(); newK.Наименование = context.Naimenovanie; newK.ИНН = context.INN; newK.Записать(); //создаем контрагента в ELMA с помощью контекстных переменных //Создание юридического лица: var fromCont = InterfaceActivator.Create<ContractorLegal>(); //Создание физического лица: //var fromCont = InterfaceActivator.Create<ContractorIndividual>(); fromCont.Name = context.Naimenovanie; fromCont.INN = context.INN; fromCont.CreationAuthor = (User)AuthenticationService.GetCurrentUser<EleWise.ELMA.Security.Models.IUser>(); fromCont.Save(); } public void wayCh(Context context)//блок Далее { //Создаем нового контрагента в ELMA if(context.KontragentELMA == null && context.Kontragent1S != null) { context.Way = 0; } //Создаем нового контрагента в 1С if(context.Kontragent1S == null && context.KontragentELMA != null) { context.Way = 1; } //Создаем нового контрагента в ELMA и 1С if(context.Kontragent1S == null && context.KontragentELMA == null) { context.Way = 2; } } public void onLoad(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)//при загрузке формы Создать счет { //если контрагент 1С еще не был выбран, записываем его в контекстную переменную if(context.Way > 0) { var service = Locator.GetServiceNotNull<Integration1CService>(); ComObject connector = service.GetComConnector("one"); dynamic bookRef = connector.GetFunctionValue("NewObject", "CatalogManager.Контрагенты"); var kontragent = bookRef.НайтиПоНаименованию(context.Naimenovanie).ПолучитьОбъект(); var comObj = new ComObject(kontragent); var guid_spr = new Guid(connector.GetFunctionValue(V81Consts.String, comObj.Get(V81Consts.GetRef).GetFunctionValue(V81Consts.Uid)).ToString()); context.Kontragent1S = EntityManager<EleWise.ELMA.Integration1C.Configs.One.Kontragenty>.Instance.LoadOrNull((object)guid_spr); } } public void newinvoice(Context context)//блок Создание счета { var con = Locator.GetServiceNotNull<Integration1CService>(); ComObject connector = con.GetComConnector("one"); //указываем документ который нужно создать dynamic Dref = connector.GetFunctionValue("NewObject", "DocumentManager.СчетНаОплатуПокупателю"); var newD = Dref.СоздатьДокумент(); //дата создания - текущая дата newD.Дата = DateTime.Now; //получаем ссылку на справочник контрагенты var KRef = context.Kontragent1S.GetComReference().Ref; newD.Контрагент = KRef; newD.Записать(); }