Документы#

Описание раздела#

Скрипты для автоматизации работы с документами в пользовательском интерфейсе: динамическое размещение в навигационной структуре, группировка по папкам на основе параметров документа (бизнес-объект, период и др.).

Скрипты#

Формирование пути к папке документа#

Используется чтобы автоматически организовывать документы в навигационной структуре системы: создаёт папки на основе параметров документа (бизнес-объект, год, месяц) и помещает документ в соответствующую папку. Месяцы отображаются в русскоязычной форме (например, «01 январь»).

Место применения: Настройки системы > Сущности > Классы > Wf_Doc > Тип объекта > [Тип объекта] > Раздел настройки > Настройка документа Wf > Вкладка "Настройки" > Поле "Путь к папке".

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

var gid = Wf_DocApi.getGidLastVer(rop.id);
var ropEntityExec = Rpt_EntityExecApi.getByGidDocVer(gid);
var jParams = toJObject(ropEntityExec.jParams);
var bo = Bs_BisObjApi.findByMnemoCode(jParams.getString("flt_idbisobjmc"));
var idObejctType = Btk_ObjectTypeApi.findByMnemoCode("dirBE"); 
var sMonth = Clr_MonthApi.getMnemoCode(jParams.getLong("flt_dperiodmonth"));

if (sMonth == '01') {sMonth = sMonth + ' ЯНВАРЬ';}
else if (sMonth == '02') {sMonth = sMonth + ' ФЕВРАЛЬ';}
else if (sMonth == '03') {sMonth = sMonth + ' МАРТ';}
else if (sMonth == '04') {sMonth = sMonth + ' АПРЕЛЬ';}
else if (sMonth == '05') {sMonth = sMonth + ' МАЙ';}
else if (sMonth == '06') {sMonth = sMonth + ' ИЮНЬ';}
else if (sMonth == '07') {sMonth = sMonth + ' ИЮЛЬ';}
else if (sMonth == '08') {sMonth = sMonth + ' АВГУСТ';}
else if (sMonth == '09') {sMonth = sMonth + ' СЕНТЯБРЬ';}
else if (sMonth == '10') {sMonth = sMonth + ' ОКТЯБРЬ';} 
else if (sMonth == '11') {sMonth = sMonth + ' НОЯБРЬ';}
else if (sMonth =='12') {sMonth = sMonth + ' ДЕКАБРЬ';};

var string = jParams.getString("flt_idbisobjmc")
+ " "
+ jParams.getString("flt_idbisobjhl")
+ "#{\"idObjectType\": \"" + idObejctType + "\",\"idBisObj\": \"" + bo + "\",\"nImage\": \"" + 4 + "\"}"
+ "/Учет прочих операций#{\"idObjectType\": \"" + idObejctType + "\",\"idBisObj\": \"" + bo + "\",\"nImage\": \"" + 4 + "\"}"
+ "/"
+ toString(jParams.getNumber("flt_nyear"))
+ "#{\"idObjectType\": \"" + idObejctType + "\",\"idBisObj\": \"" + bo + "\",\"nImage\": \"" + 30 + "\"}"
+ "/"
+ sMonth
+ "#{\"idObjectType\": \"" + idObejctType + "\",\"idBisObj\": \"" + bo + "\",\"nImage\": \"" + 46 + "\"}";

new("ru.bitec.app.gtk.lang.NString", string);

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

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

Скрипт показывает пример создания сущностей одного документа с использованием данных другого документа.
Включает проверки на 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));

Создание связи между хозяйственными операциями и документами денежного потока#

Создает записи в коллекции Bts_DocLink для отображения авансового отчета на закладке «Связанные документы» в интерфейсах хозяйственных операций.

Скрипт показывает пример создания связей между документами через коллекцию Bts_DocLink.
Используется для формирования отображения связанных документов в интерфейсе.

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

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

var bvDone = false;
while (!bvDone) {
 let l = sql(`select ar.gid as gidsrc, coalesce(td.gid, cf.giddoc) as gidrec
      from pm_advrepcashflow cf
      join pm_advrep ar on ar.id = cf.idadvrep
      left join act_trans t on t.gid = cf.giddoc
      left join act_transdoc td on td.id = t.idtransdoc
      left join bts_doclink dl on dl.gidsrc = ar.gid and dl.gidrec = coalesce(td.gid, cf.giddoc)
     where ar.gid is not null and cf.giddoc is not null and dl.id is null
     limit 100`).asList();
  for(w:l){
    Bts_DocLinkApi.register(w.gidsrc, w.gidrec);
  }
  if (l.isEmpty()) {
    bvDone = true;
  } else {
    session.commit();
  }
}

Получение подкласса документа#

Получает подкласс документа.

Скрипт показывает два варианта получения подкласса документа: если класс документа заранее неизвестен и если класс документа известен.
Может использоваться как самостоятельный скрипт или как шаблон внутри других JEXL-скриптов.

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

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

// если не знаем класс документа
var rop = Btk_ObjectPkg.loadAnyObject({gid_документа});
var idSubClass = Btk_ObjectTypeApi.load(rop.getByAttrName("idObjectType")).idSubClass // кинет ошибку если в классе документа нет атрибута idObjectType
// если знаем класс документа
var rop = Act_TransApi.load({id_документа});
var idSubClass = Btk_ObjectTypeApi.load(rop.idObjectType).idSubClass

Смена знака сумм проводки#

Меняет знак сумм проводки.

Скрипт показывает, что при работе с API важно учитывать тип данных, который ожидают методы. Метод Act_TransApi.load() принимает значение типа Long, а методы Act_TransApi.setnSum() и Act_TransApi.setnSumBase() — значения типа BigDecimal.

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

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

const nvSum = toBigDecimal(104467.84);
const nvSumBase = toBigDecimal(104467.84);
var ropTrans = Act_TransApi.load(toLong(1204862));
Act_TransApi.setnSum(ropTrans, -nvSum);
Act_TransApi.setnSumBase(ropTrans, -nvSumBase);