Управление потребностями#

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

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

Скрипты#

Коррекция ссылок на источник и объект потребности в проводке закупки#

Используется чтобы вручную обновить ссылки на источник (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();