[ELMA3] Пример создания документа 1С "Заказ покупателя"
Для того, чтобы работать с документами 1С в сценарии, необходимо подключиться к конфигурации 1С (подробнее см. статью Подключение системы ELMA к конфигурации 1С через COMConnector).
Для работы сценариев необходимо подключить следующие сборки:
EleWise.ELMA.Integration1C Microsoft.CSharp
Пространства имен:
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С: Номенклатура.
Документ создается на основе определенных выше полей, также задаются некоторые дополнительные параметры, например, учитывать НДС или нет:
нДок.УчитыватьНДС = "true";
Если имеется договор контрагента, то он также заполняется:
нДок.ДоговорКонтрагента = Менеджер1С.ЗаполнениеДокументов.ПолучитьДоговорПоОрганизацииИКонтрагенту(context.Organizaciya.GetComReference().Ref, context.Kontragent.GetComReference().Ref);
Подключение к конфигурации 1С
Необходимо указать название конфигурации, прописанной в настройках подключения в Дизайнере ELMA:
Пример сценария без использования PublicAPI
Текст сценария:
//соединяемся с 1С var service = Locator.GetServiceNotNull<Integration1CService>(); ComObject connector = service.GetComConnector("elma-test");
Пример сценария с использованием PublicAPI
Текст сценария:
//соединяемся с 1С var connector = PublicAPI.Services.Integration1C.GetComConnector("elma-test");
Создание менеджеров для работы со справочниками
//создаем менеджеры для справочника "Договор контрагента" и для документа "Заказ покупателя" dynamic bookRef = connector.GetFunctionValue("NewObject", "CatalogManager.ДоговорыКонтрагентов"); dynamic docRef = connector.GetFunctionValue("NewObject", "DocumentManager.ЗаказПокупателя"); var Менеджер1С = (dynamic) connector.Reference; //создаем договор контрагента var нДок = docRef.СоздатьДокумент();
Заполнение атрибутов документа
//заполняем атрибуты документа нДок.Дата = 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С 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, ном); }
Сохранение и проведение документа
нДок.Записать();
if (context.ProvestiDokument == true){ нДок.Записать(Менеджер1С.РежимЗаписиДокумента.Проведение); }