Документы#
Описание раздела#
Скрипты для автоматизации работы с документами в пользовательском интерфейсе: динамическое размещение в навигационной структуре, группировка по папкам на основе параметров документа (бизнес-объект, период и др.).
Скрипты#
Формирование пути к папке документа#
Используется чтобы автоматически организовывать документы в навигационной структуре системы: создаёт папки на основе параметров документа (бизнес-объект, год, месяц) и помещает документ в соответствующую папку. Месяцы отображаются в русскоязычной форме (например, «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);