Пример создания документа 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

Примечание
Актуальная документация по PublicAPI доступна по ссылке.
Внимание!
Сценарий, указанный ниже, актуален для версий системы ELMA с 3.8 включительно до 3.12.1 включительно.

Текст сценария:

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