[ELMA3] Пример создания документа 1С "Заказ покупателя"
Для того, чтобы работать с документами 1С в сценарии, необходимо подключиться к конфигурации 1С (подробнее см. статью Подключение системы ELMA к конфигурации 1С через COMConnector).
Для работы сценариев необходимо подключить следующие сборки:
1 2 | EleWise.ELMA.Integration1C Microsoft.CSharp |
Пространства имен:
1 2 3 4 5 6 7 8 | using EleWise.ELMA.Integration1C; using EleWise.ELMA.Integration1C.Data; using EleWise.ELMA.Integration1C.V81; using EleWise.ELMA.Model.Common; using EleWise.ELMA.Model.Entities; using EleWise.ELMA.Model.Managers; using EleWise.ELMA.Model.Types.Settings; using EleWise.ELMA.Services; |
Очень часто требуется автоматизировать процесс согласования заявки покупателя в системе ELMA.
Запуск процесса согласования представляет из себя создание блока заявки, в котором отбираются позиции из справочника «Номенклатура» из системы 1С.
По итогам согласования заявки ее автоматически необходимо создать в 1С.
Рассмотрим пример скрипта реализующего требуемый функционал.
Для того, чтобы создать документ «Заказ покупателя», следует проверить все ли необходимые справочники доступны в настроенной конфигурации 1С.
Создание контекстных переменных для документа "Заказ покупателя"
Для работы сценария Вам потребуются следующие контекстные переменные:
- context.DataZakaza – дата создания документа;
- context.Valyuta – переменная типа Справочник 1С: Валюты;
- context.Organizaciya – переменная типа Справочник 1С: Организации;
- context.Kontragent – переменная типа Справочник 1С: Контрагенты;
- context.TipCen – переменная типа Справочник 1С: Тип цен;
- context.Sklad – переменная типа Справочник 1С: Склад;
- context.Podrazdeleniya – переменная типа Справочник 1С: Подразделения;
- context.Otvetstvennyy – переменная типа Справочник 1С: Сотрудники;
- context.Zakaz – блок заказа, в котором в переменной Poziciya хранится значение номенклатурной позиции из Справочника 1С: Номенклатура.
Документ создается на основе определенных выше полей, также задаются некоторые дополнительные параметры, например, учитывать НДС или нет:
1 | нДок.УчитыватьНДС = "true" ; |
Если имеется договор контрагента, то он также заполняется:
1 | нДок.ДоговорКонтрагента = Менеджер1С.ЗаполнениеДокументов.ПолучитьДоговорПоОрганизацииИКонтрагенту(context.Organizaciya.GetComReference().Ref, context.Kontragent.GetComReference().Ref); |
Подключение к конфигурации 1С
Необходимо указать название конфигурации, прописанной в настройках подключения в Дизайнере ELMA:
Пример сценария без использования PublicAPI
Текст сценария:
1 2 3 | //соединяемся с 1С var service = Locator.GetServiceNotNull<Integration1CService>(); ComObject connector = service.GetComConnector( "elma-test" ); |
Пример сценария с использованием PublicAPI
Текст сценария:
1 2 | //соединяемся с 1С var connector = PublicAPI.Services.Integration1C.GetComConnector( "elma-test" ); |
Создание менеджеров для работы со справочниками
1 2 3 4 5 6 7 | //создаем менеджеры для справочника "Договор контрагента" и для документа "Заказ покупателя" dynamic bookRef = connector.GetFunctionValue( "NewObject" , "CatalogManager.ДоговорыКонтрагентов" ); dynamic docRef = connector.GetFunctionValue( "NewObject" , "DocumentManager.ЗаказПокупателя" ); var Менеджер1С = (dynamic) connector.Reference; //создаем договор контрагента var нДок = docRef.СоздатьДокумент(); |
Заполнение атрибутов документа
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | //заполняем атрибуты документа нДок.Дата = context.DataZakaza; var валюта = context.Valyuta.GetComReference().Ref; нДок.Организация = context.Organizaciya.GetComReference().Ref; нДок.Контрагент = context.Kontragent.GetComReference().Ref; нДок.ТипЦен = context.TipCen.GetComReference().Ref; нДок.СкладГруппа = context.Sklad.GetComReference().Ref; нДок.Подразделение = context.Podrazdeleniya.GetComReference().Ref; нДок.Ответственный = context.Otvetstvennyy.GetComReference().Ref; нДок.УчитыватьНДС = "true" ; нДок.СуммаВключаетНДС = "true" ; нДок.ВалютаДокумента = валюта; нДок.КратностьВзаиморасчетов = 1; нДок.КурсВзаиморасчетов = 1; нДок.СтруктурнаяЕдиница = нДок.Организация.ОсновнойБанковскийСчет; нДок.Комментарий = context.Kommentariy; var мСтруктура = Менеджер1С.ЗаполнениеДокументов.ПолучитьСтруктуруПараметровДляПолученияДоговораЗаказаПокупателя(); var МетаданныеДокумента = нДок.Метаданные(); context.EstjDogovorKontragenta = Менеджер1С.ОбщегоНазначения.ЕстьРеквизитДокумента( "ДоговорКонтрагента" , МетаданныеДокумента); if (context.EstjDogovorKontragenta == true ) { нДок.ДоговорКонтрагента = Менеджер1С.ЗаполнениеДокументов.ПолучитьДоговорПоОрганизацииИКонтрагенту(context.Organizaciya.GetComReference().Ref, context.Kontragent.GetComReference().Ref); } Менеджер1С.ЗаполнениеДокументов.ПриИзмененииЗначенияКонтрагента(нДок, мСтруктура); |
Заполнение блока "Товары" с позициями номенклатуры
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | //заполняем блок "Товары" в документе 1С foreach (var item in context.Zakaz){ var НоваяСтрока = нДок.Товары.Добавить(); НоваяСтрока.Номенклатура = item.Poziciya.GetComReference().Ref; НоваяСтрока.Количество = item.Kolichestvo; НоваяСтрока.ЕдиницаИзмерения = НоваяСтрока.Номенклатура.ЕдиницаХраненияОстатков; НоваяСтрока.Коэффициент = 1; Менеджер1С.ОбработкаТабличныхЧастей.ПриИзмененииНоменклатурыТабЧасти(НоваяСтрока, нДок); Менеджер1С.ОбработкаТабличныхЧастей.ЗаполнитьЕдиницуЦенуПродажиТабЧасти(НоваяСтрока, нДок, валюта); Менеджер1С.ОбработкаТабличныхЧастей.ЗаполнитьСтавкуНДСТабЧасти(НоваяСтрока, нДок, "Реализация" ); Менеджер1С.ОбработкаТабличныхЧастей.РассчитатьКоличествоМестТабЧасти(НоваяСтрока, нДок); Менеджер1С.ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(НоваяСтрока, нДок); Менеджер1С.ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(НоваяСтрока, нДок); Менеджер1С.ОбработкаТабличныхЧастей.РассчитатьПлановуюСебестоимостьВСтрокеТабЧасти(НоваяСтрока, нДок, валюта); Менеджер1С.УправлениеЗапасами.ДобавитьСоставНабора(НоваяСтрока, нДок); dynamic Цены = connector.GetFunctionValue( "NewObject" , "InformationRegisterManager.ЦеныНоменклатуры" ); dynamic ном = connector.GetFunctionValue( "NewObject" , "Структура" ); ном.Вставить( "Номенклатура" ,item.Poziciya.GetComReference().Ref); ном.Вставить( "ТипЦен" , context.TipCen.GetComReference().Ref); var ВыборкаЦены = Цены.ПолучитьПоследнее(context.DataZakaza, ном); } |
Сохранение и проведение документа
1 | нДок.Записать(); |
1 2 3 | if (context.ProvestiDokument == true ){ нДок.Записать(Менеджер1С.РежимЗаписиДокумента.Проведение); } |