Создание, редактирование, сохранение справочника

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

В приложении к статье находится XML-файл с этим процессом, ниже приведен листинг процесса.

Карта процесса:

Блок "Создание"

В данном блоке заполняются контекстные переменные, из которых будет создан элемент справочника.

Пример сценария с использованием PublicAPI

Примечание
Актуальная документация по PublicAPI доступна по ссылке.
Внимание!
Сценарий, указанный ниже, актуален для версий системы ELMA с 3.8 включительно до 3.12.1 включительно.
Текст сценария:
//Создание нового элемента справочника
//Создание подключения
var connector = PublicAPI.Services.Integration1C.GetComConnector("one");
//Создание ссылки на справочник
dynamic reference = connector.GetFunctionValue("NewObject", "CatalogManager.ФизическиеЛица");
var newObject = reference.СоздатьЭлемент();
newObject.Наименование = context.Poljzovatelj.FullName;
newObject.ДатаРождения = context.Poljzovatelj.BirthDate;
newObject.Записать();
dynamic contacts = connector.GetFunctionValue("NewObject", "InformationRegisterManager.КонтактнаяИнформация");
var Adres = contacts.СоздатьМенеджерЗаписи();
Adres.Объект = newObject.Ссылка;
//ссылки на контактную информацию
dynamic TIPAdres = connector.GetFunctionValue("NewObject", "EnumManager.ТипыКонтактнойИнформации");
dynamic VIDAdres = connector.GetFunctionValue("NewObject", "CatalogManager.ВидыКонтактнойИнформации");
//указываем тип и вид контактной информации
Adres.Тип = TIPAdres.Адрес;
Adres.Вид = VIDAdres.ЮрАдресФизЛица;
//заполняем поля из контекстных переменных
Adres.Поле1 = context.Indeks;
Adres.Поле3 = context.Rayon;
Adres.Поле4 = context.Gorod;
Adres.Поле6 = context.Ulica;
Adres.Поле7 = context.Dom;
Adres.Поле9 = context.Kvartira;
//собираем представление из нужной информации
Adres.Представление = context.Gorod + ", " + context.Ulica + ", " + context.Dom;
Adres.Записать();
//аналогично для других данных - указываем вид и тип, заполняем
var Tel = contacts.СоздатьМенеджерЗаписи();
Tel.Объект = newObject.Ссылка;
dynamic TIPTel = connector.GetFunctionValue("NewObject", "EnumManager.ТипыКонтактнойИнформации");
dynamic VIDTel = connector.GetFunctionValue("NewObject", "CatalogManager.ВидыКонтактнойИнформации");
Tel.Тип = TIPTel.Телефон;
Tel.Вид = VIDTel.ТелефонФизЛица;
//тип контактной информации "телефон" и "email" имеют только поле "представление"
Tel.Представление = context.Poljzovatelj.WorkPhone;
Tel.Записать();
var mail = contacts.СоздатьМенеджерЗаписи();
mail.Объект = newObject.Ссылка;
dynamic TIPEmail = connector.GetFunctionValue("NewObject", "EnumManager.ТипыКонтактнойИнформации");
dynamic VIDEmail = connector.GetFunctionValue("NewObject", "CatalogManager.ВидыКонтактнойИнформации");
mail.Тип = TIPEmail.АдресЭлектроннойПочты;
mail.Вид = VIDEmail.EmailФизЛица;
mail.Представление = context.Poljzovatelj.EMail;
mail.Записать();
var fizlico = reference.НайтиПоНаименованию(context.Poljzovatelj.FullName).ПолучитьОбъект();
var comObj = new ComObject(fizlico);
//получаем guid найденного ранее контрагента
var guid_spr = new Guid(connector.GetFunctionValue(V81Consts.String, comObj.Get(V81Consts.GetRef).GetFunctionValue(V81Consts.Uid)).ToString());
//загружаем физическое лицо в контекстную переменную процесса
context.FizLico = PublicAPI.Services.Integration1C.LoadConfObject<EleWise.ELMA.Integration1C.Configs.One.FizicheskieLica>(guid_spr);

Пример сценария без использования PublicAPI

Текст сценария:
//Создание нового элемента справочника
//Создание подключения
var service = Locator.GetServiceNotNull<Integration1CService>();
ComObject connector = service.GetComConnector("one");
//Создание ссылки на справочник
dynamic reference = connector.GetFunctionValue("NewObject", "CatalogManager.ФизическиеЛица");
var newObject = reference.СоздатьЭлемент();
newObject.Наименование = context.Poljzovatelj.FullName;
newObject.ДатаРождения = context.Poljzovatelj.BirthDate;
newObject.Записать();
dynamic contacts = connector.GetFunctionValue("NewObject", "InformationRegisterManager.КонтактнаяИнформация");
var Adres = contacts.СоздатьМенеджерЗаписи();
Adres.Объект = newObject.Ссылка;
//ссылки на контактную информацию
dynamic TIPAdres = connector.GetFunctionValue("NewObject", "EnumManager.ТипыКонтактнойИнформации");
dynamic VIDAdres = connector.GetFunctionValue("NewObject", "CatalogManager.ВидыКонтактнойИнформации");
//указываем тип и вид контактной информации
Adres.Тип = TIPAdres.Адрес;
Adres.Вид = VIDAdres.ЮрАдресФизЛица;
//заполняем поля из контекстных переменных
Adres.Поле1 = context.Indeks;
Adres.Поле3 = context.Rayon;
Adres.Поле4 = context.Gorod;
Adres.Поле6 = context.Ulica;
Adres.Поле7 = context.Dom;
Adres.Поле9 = context.Kvartira;
//собираем представление из нужной информации
Adres.Представление = context.Gorod+", "+context.Ulica+", "+context.Dom;
Adres.Записать();
//аналогично для других данных - указываем вид и тип, заполняем
var Tel = contacts.СоздатьМенеджерЗаписи();
Tel.Объект = newObject.Ссылка;
dynamic TIPTel = connector.GetFunctionValue("NewObject", "EnumManager.ТипыКонтактнойИнформации");
dynamic VIDTel = connector.GetFunctionValue("NewObject", "CatalogManager.ВидыКонтактнойИнформации");
Tel.Тип = TIPTel.Телефон;
Tel.Вид = VIDTel.ТелефонФизЛица;
//тип контактной информации "телефон" и "email" имеют только поле "представление"
Tel.Представление = context.Poljzovatelj.WorkPhone;
Tel.Записать();
var mail = contacts.СоздатьМенеджерЗаписи();
mail.Объект = newObject.Ссылка;
dynamic TIPEmail = connector.GetFunctionValue("NewObject", "EnumManager.ТипыКонтактнойИнформации");
dynamic VIDEmail = connector.GetFunctionValue("NewObject", "CatalogManager.ВидыКонтактнойИнформации");
mail.Тип = TIPEmail.АдресЭлектроннойПочты;
mail.Вид = VIDEmail.EmailФизЛица;
mail.Представление = context.Poljzovatelj.EMail;
mail.Записать();
var fizlico = reference.НайтиПоНаименованию(context.Poljzovatelj.FullName).ПолучитьОбъект();
var comObj = new ComObject(fizlico);
//получаем guid найденного ранее контрагента
var guid_spr = new Guid(connector.GetFunctionValue(V81Consts.String, comObj.Get(V81Consts.GetRef).GetFunctionValue(V81Consts.Uid)).ToString());
//загружаем физическое лицо в контекстную переменную процесса
context.FizLico = EntityManager<EleWise.ELMA.Integration1C.Configs.One.FizicheskieLica>.Instance.LoadOrNull((object)guid_spr);

Блок "Изменение"

В данном блоке необходимо указать ИНН физического лица для поиска по реквизиту и его новое ФИО (ФИО - это лишь пример). После нахождения элемента, редактирование происходит аналогично созданию нового элемента.

Пример сценария с использованием PublicAPI

Примечание
Актуальная документация по PublicAPI доступна по ссылке.
Внимание!
Сценарий, указанный ниже, актуален для версий системы ELMA с 3.8 включительно до 3.12.1 включительно.
Текст сценария:
//редактирование существующего элемента
var connector = PublicAPI.Services.Integration1C.GetComConnector("one");
dynamic reference = connector.GetFunctionValue("NewObject", "CatalogManager.ФизическиеЛица");
//для получения нужного объекта используем НайтиПоРеквизиту, указав название реквизита - ИНН, и его значение
var editU = reference.НайтиПоРеквизиту("ИНН", context.INN).ПолучитьОбъект();
//запишем в контекстную переменную
var comObj = new ComObject(editU);
var guid_spr = new Guid(connector.GetFunctionValue(V81Consts.String, comObj.Get(V81Consts.GetRef).GetFunctionValue(V81Consts.Uid)).ToString());
context.FizLico = PublicAPI.Services.Integration1C.LoadConfObject<EleWise.ELMA.Integration1C.Configs.One.FizicheskieLica>(guid_spr);
//редактируем
//редактирование происходит также как и создание нового элемента, после чего необходимо записать результат
editU.Наименование = context.FIO;
editU.Записать();
Следует отметить, что поиск по реквизиту может не работать с реквизитами, длина которых не ограничена, в этом случае можно использовать поиск по наименованию, или по коду.

Пример сценария без использования PublicAPI

Текст сценария:
//редактирование существующего элемента
var service = Locator.GetServiceNotNull<Integration1CService>();
ComObject connector = service.GetComConnector("one");
dynamic reference = connector.GetFunctionValue("NewObject", "CatalogManager.ФизическиеЛица");
//для получения нужного объекта используем НайтиПоРеквизиту, указав название реквизита - ИНН, и его значение
var editU = reference.НайтиПоРеквизиту("ИНН",context.INN).ПолучитьОбъект();
//запишем в контекстную переменную
var comObj = new ComObject(editU);
var guid_spr = new Guid(connector.GetFunctionValue(V81Consts.String, comObj.Get(V81Consts.GetRef).GetFunctionValue(V81Consts.Uid)).ToString());
context.FizLico = EntityManager<EleWise.ELMA.Integration1C.Configs.One.FizicheskieLica>.Instance.LoadOrNull((object)guid_spr);
//редактируем
//редактирование происходит также как и создание нового элемента, после чего необходимо записать результат
editU.Наименование = context.FIO;
editU.Записать();
Примечание
Для работы вышеописанных сценариев, необходимо подключить сборку 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;

Прикрепленные файлы