Пример использования интеграции с 1C

В данной статье рассмотрен пример интеграции ELMA и 1С.

Данный процесс затрагивает все основные возможности интеграции 1С и ELMA: получение данных из справочников, создание, редактирование и сохранение справочников, создание, редактирование и проведение документов.

Используются следующие сценарии: создание нового контрагента в 1С, создание нового контрагента в ELMA, создание нового документа в 1С, передача данных из справочника 1С в контекст процесса.
В данном примере пользователь системы ELMA выбирает контрагента и создает счет по этому контрагенту. В том случае, если данный контрагент еще не заведен в 1С / ELMA или не существует ни в одной из систем, происходит его создание в нужной системе, либо в обеих сразу. Если контрагент уже где-то существует, его реквизиты передаются из существующего - в новый. Если это новый контрагент, реквизиты заполняются пользователями. После создания или выбора контрагента для него создается счет.

Используемые контекстные переменные:

  • Naimenovanie – переменная типа Строка;
  • INN – переменная типа Строка;
  • Kontragent1C – переменная типа Контрагенты (Справочник 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.Записать();
}