Перейти к основному содержанию
`Ctrl`+`K`

# Создание позиции счета-фактуры от позиции авансового отчета

Создает позицию счета-фактуры на основании данных позиции авансового отчета. Скрипт показывает пример создания сущностей одного документа с использованием данных другого документа, проверки значений на `null`, вывода идентификаторов созданных объектов в лог и импорта Java-библиотеки.

Место применения: `Сервис > Инструменты > Выполнить JEXL-скрипт`

Тип: JEXL-скрипт

    // Испортируем методы
    let classLoader = session.getClass().getClassLoader();
    let BigDecimal = classLoader.loadClass('java.math.BigDecimal');

    // Объявляем переменные
    const idvDoc = toLong(33203); // id счета-фактуры, с которым работаем
    const gidvSrcDet = toString('51451/33557'); // gid позиции документа источника, с которой хотим связать создаваемую позицию
    const gidvGdsSrv = Gds_ServiceApi.load(Gds_ServiceApi.findByMnemoCode('Аванс')).gid(); // gid служебной услуги для авансового счета-фактуры
    const nvMethodCalculation = 2b;

    // Получаем атрибуты позиции документа источника
    const aSrcDetAttr = sql(`select
    docsrcdet.idvatrate as idvatrate
    ,docsrcdet.scaption as scaption
    ,docsrcdet.nqty as nqty
    ,docsrcdet.nsumexprep as nsum
    ,docsrcdet.nsumrepbase as nsumbase
    ,docsrcdet.nsumvatexprep as nsumvat
    ,docsrcdet.nsumvatexpbase as nsumvatbase
    ,repitem.scode as scoderepitem
    from pm_advrepdet docsrcdet
    left join bs_advrepitem repitem on docsrcdet.idadvrepitem = repitem.id
    where docsrcdet.gid = '`+gidvSrcDet+`'
    ;`).asSingle();

    let nvQtySrcDet = null;
    let svSrcDetCaption = null;
    let idvSrcDetVATRate = null;
    let svRepItemCode = null;
    let nvSrcDetSum = null;
    let nvSrcDetSumBase = null;
    let nvSrcDetSumVAT = null;
    let nvSrcDetSumVATBase = null;

    if(isNotNull(aSrcDetAttr.idvatrate)) {
       idvSrcDetVATRate = aSrcDetAttr.idvatrate;
    }
    if(isNotNull(aSrcDetAttr.scoderepitem)) {
       svRepItemCode = aSrcDetAttr.scoderepitem;
    }
    if(isNotNull(aSrcDetAttr.scaption)) {
       svSrcDetCaption = aSrcDetAttr.scaption;
    }
    if(isNotNull(aSrcDetAttr.nqty)) {
       nvQtySrcDet = BigDecimal.valueOf(toDouble(aSrcDetAttr.nqty));
    }
    if(isNotNull(aSrcDetAttr.nsum)) {
       nvSrcDetSum = aSrcDetAttr.nsum;
    }
    if(isNotNull(aSrcDetAttr.nsumbase)) {
       nvSrcDetSumBase = aSrcDetAttr.nsumbase;
    }
    if(isNotNull(aSrcDetAttr.nsumvat)) {
       nvSrcDetSumVAT = aSrcDetAttr.nsumvat;
    }
    if(isNotNull(aSrcDetAttr.nsumvatbase)) {
       nvSrcDetSumVATBase = aSrcDetAttr.nsumvatbase;
    }

    // Создаем объекты счета-фактуры (с которым работаем) и позиции, которую хотим добавить
    const ropDoc = Stm_InvBillDocInApi.load(idvDoc);
    const ropDocDet = Stm_BillDetApi.insertByParent(ropDoc);

    // Заполняем атрибуты созданной позиции
    Stm_BillDetApi.setgidSrc(ropDocDet, gidvSrcDet);
    Stm_BillDetApi.setgidGdsSrv(ropDocDet, gidvGdsSrv);
    Stm_BillDetApi.setsOtherProduct(ropDocDet, toString(svRepItemCode + " / Элемент АО " + svRepItemCode + " " + svSrcDetCaption));
    Stm_BillDetApi.setidVATRate(ropDocDet, idvSrcDetVATRate);
    Stm_BillDetApi.setnMethodCalculation(ropDocDet, nvMethodCalculation);
    Stm_BillDetApi.setnQty(ropDocDet, nvQtySrcDet);
    Stm_BillDetApi.setnQtyBase(ropDocDet, nvQtySrcDet);
    Stm_BillDetApi.setnSum(ropDocDet, nvSrcDetSum);
    Stm_BillDetApi.setnSumDoc(ropDocDet, nvSrcDetSum);
    Stm_BillDetApi.setnSumBase(ropDocDet, nvSrcDetSumBase);
    Stm_BillDetApi.setnSumToPay(ropDocDet, nvSrcDetSum);
    Stm_BillDetApi.setnSumToPayBase(ropDocDet, nvSrcDetSum);
    Stm_BillDetApi.setnSumToPayDoc(ropDocDet, nvSrcDetSum);
    Stm_BillDetApi.setnSumVAT(ropDocDet, nvSrcDetSumVAT);
    Stm_BillDetApi.setnSumVATBase(ropDocDet, nvSrcDetSumVATBase);
    Stm_BillDetApi.setnSumVATDoc(ropDocDet, nvSrcDetSumVATBase);
    Stm_BillDetApi.setnSumNoTax(ropDocDet, nvSrcDetSum - nvSrcDetSumVAT);
    Stm_BillDetApi.setnSumNoTaxBase(ropDocDet, nvSrcDetSum - nvSrcDetSumVAT);
    Stm_BillDetApi.setnSumNoTaxDoc(ropDocDet, nvSrcDetSum - nvSrcDetSumVAT);
    Stm_BillDetApi.setnSumToPayNoTax(ropDocDet, nvSrcDetSum - nvSrcDetSumVAT);
    Stm_BillDetApi.setnSumToPayNoTaxBase(ropDocDet, nvSrcDetSum - nvSrcDetSumVAT);
    Stm_BillDetApi.setnSumToPayNoTaxDoc(ropDocDet, nvSrcDetSum - nvSrcDetSumVAT);
    Stm_BillDetApi.setnSumToPayVAT(ropDocDet, nvSrcDetSumVAT);
    Stm_BillDetApi.setnSumToPayVATBase(ropDocDet, nvSrcDetSumVATBase);
    Stm_BillDetApi.setnSumToPayVATDoc(ropDocDet, nvSrcDetSumVATBase);

    // Выводим в лог gid созданной позиции счета-фактуры
    Btk_InfoLogPkg.info("Счет-фактура: " + toString(ropDoc.gid));
    Btk_InfoLogPkg.info("Новая позиция счета-фактуры: " + toString(ropDocDet.gid));