logo

[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 включительно.
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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, и пространства имен:
1
2
3
4
5
6
7
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;
Сценарии:
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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.Записать();
}