[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.Записать();
}