Управление потребностями#
Описание раздела#
Скрипты и запросы для управления и анализа данных потребностей: синхронизация количеств, коррекция ссылок, ручное распределение, а также диагностика связей между заявками, договорами и проводками закупок.
Скрипты#
Коррекция ссылок на источник и объект потребности в проводке закупки#
Используется чтобы вручную обновить ссылки на источник (idSrcTrans) и объект потребности (idNeedObj) в проводках закупок. Применяется при постобработке после миграции или ошибок настройки. Требует указания конкретных идентификаторов в коде.
Внимание
В текущем виде содержит захардкоженные ID — перед использованием необходимо заменить на актуальные значения.
Место применения: Сервис > Инструменты > jexl-скрипт.
Тип: JEXL-скрипт
const avRow = sql(`
select t.id, t.idsrctrans, t.idneedobj
from prs_purchtrans t
where t.gidsrcdetobj = '48051/77672'
`).asList();
for (r : avRow) {
ropPT = Prs_PurchTransApi.load(r.id);
Prs_PurchTransApi.setidSrcTrans(ropPT, 187367L);
Prs_PurchTransApi.setidNeedObj(ropPT, 121832L);
Prs_PurchTransApi.recalcQtyOpenBase(r.idsrctrans, true, true);
Prs_TransPkg.reCalcNeedObjQtyOther(r.idneedobj, true, true);
}
Синхронизация количества для заявок на услуги#
Используется чтобы автоматически синхронизировать количество в объектах потребности и проводках закупок с суммой без НДС из позиции заявки. Применяется для заявок на услуги, где объём определяется финансово. При наличии связи с договором также пересчитывает спецификацию.
Место применения: Сервис > Инструменты > jexl-скрипт.
Тип: JEXL-скрипт
const avRow = sql(`
select det.id as iddet
,n.id as idneedobj
,pt.id as idpurchtrans
from Prs_PurchReqDet det
join Prs_PurchReqVer ver on ver.id = det.idPurchReqVer
join Prs_PurchReq req on req.id = ver.idPurchReq
join Prs_NeedObj n on det.idPurchReqPos = getGidId(n.gidDetNeed)
join Prs_PurchTrans pt on pt.idNeedObj = n.id
join Btk_ObjectType ot on req.idObjectType = ot.id
where ot.sCode = 'Prs_PurchReqCC'
and coalesce(det.nPriceRate, 0) <> 0
order by det.id
`).asList();
for (r : avRow) {
var ropDet = Prs_PurchReqDetApi.load(r.iddet);
var ropNeedObj = Prs_NeedObjApi.load(r.idneedobj);
var ropPurchTrans = Prs_PurchTransApi.load(r.idpurchtrans);
if (parseIdClass(ropPurchTrans.gidSrcDetObj) == Cnt_ContractSpecApi.idClass()) {
// Обновляем объект потребности, а так же проводку
if (ropDet.nTotalSumNoTax != ropNeedObj.nQtyBase) {
Prs_NeedObjApi.setnQtyBase(ropNeedObj, ropDet.nTotalSumNoTax);
}
if (ropDet.nTotalSumNoTax != ropPurchTrans.nQtyBase) {
Prs_PurchTransApi.setnQtyBase(ropPurchTrans, ropDet.nTotalSumNoTax);
// Обновляем позицию спецификации
var ropCntSpec = Cnt_ContractSpecApi.loadByGid(ropPurchTrans.gidSrcDetObj);
Prs_ContractPkg.recalcQtyByPurchTrans(ropCntSpec);
}
}
session.flush();
};
session.commit();
Ручное распределение позиции акта по проводкам закупки#
Используется чтобы вручную распределить количество из позиции приходного акта по нескольким проводкам закупки. Для каждой проводки рассчитывается доступный объём, и фиксируется привязка к объекту потребности. Применяется в сложных сценариях, когда автоматический подбор недостаточен. Требует указания конкретных идентификаторов в коде.
Внимание
В текущем виде содержит захардкоженные ID — перед использованием необходимо заменить на актуальные значения.
Место применения: Сервис > Инструменты > jexl-скрипт.
Тип: JEXL-скрипт
const ropActDet = Stm_ActInDetApi.load(136129L);
var nQty = ropActDet.nQty;
const ropPT1 = Prs_PurchTransApi.load(301653L);
const nQty1 = nQty.min(ropPT1.nQty);
Stmprs_ActInPkg.setObjNeedDetQtyBase(ropActDet.idDoc, ropActDet.gid, nQty1, ropPT1.idNeedObj, ropActDet.idMsr, ropPT1.id);
nQty = nQty - nQty1;
Btk_InfoLogPkg.info(nQty.toString());
const ropPT2 = Prs_PurchTransApi.load(476615L);
const nQty2 = nQty.min(ropPT2.nQty);
Stmprs_ActInPkg.setObjNeedDetQtyBase(ropActDet.idDoc, ropActDet.gid, nQty2, ropPT2.idNeedObj, ropActDet.idMsr, ropPT2.id);
nQty = nQty - nQty2;
Btk_InfoLogPkg.info(nQty.toString());
const ropPT3 = Prs_PurchTransApi.load(476623L);
const nQty3 = nQty.min(ropPT.nQty);
Stmprs_ActInPkg.setObjNeedDetQtyBase(ropActDet.idDoc, ropActDet.gid, nQty3, ropPT3.idNeedObj, ropActDet.idMsr, ropPT3.id);
nQty = nQty - nQty3;
Btk_InfoLogPkg.info(nQty.toString());
const ropPT4 = Prs_PurchTransApi.load(301666L);
const nQty4 = nQty.min(ropPT4.nQty);
Stmprs_ActInPkg.setObjNeedDetQtyBase(ropActDet.idDoc, ropActDet.gid, nQty4, ropPT4.idNeedObj, ropActDet.idMsr, ropPT4.id);
nQty = nQty - nQty4;
Btk_InfoLogPkg.info(nQty.toString());
session.commit();