[ELMA3] Создание, редактирование, сохранение справочника
В этом примере подробно рассматривается создание и редактирование справочников 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;