[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С.РежимЗаписиДокумента.Проведение);
}