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

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

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

7.7.7.2. Скрипты#

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

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

7.7.7.2.2. Синхронизация количества для заявок на услуги#

Используется чтобы автоматически синхронизировать количество в объектах потребности и проводках закупок с суммой без НДС из позиции заявки. Применяется для заявок на услуги, где объём определяется финансово. При наличии связи с договором также пересчитывает спецификацию.

Место применения: Сервис > Инструменты > 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();

7.7.7.2.3. Ручное распределение позиции акта по проводкам закупки#

Используется чтобы вручную распределить количество из позиции приходного акта по нескольким проводкам закупки. Для каждой проводки рассчитывается доступный объём, и фиксируется привязка к объекту потребности. Применяется в сложных сценариях, когда автоматический подбор недостаточен. Требует указания конкретных идентификаторов в коде.

Внимание

В текущем виде содержит захардкоженные 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();

7.7.7.2.4. Поиск договора и заявки по позиции заявки#

Используется чтобы найти номер заявки, номер позиции и связанный договор по идентификатору (gid) позиции заявки на потребность. Применяется для аудита или отладки связей между документами.

Внимание

Перед выполнением замените '100651/23472' на актуальный gid позиции.

Место применения: Сервис > Инструменты > Выполнить запрос.

Тип: SQL-запрос

with PurchTrans AS (
  select
    purchreq.snumdoc AS RequestNumber,
    reqdet.nRow as PositionNumber,
    contract.sDocNumber AS ContractNumber
  FROM
    Prs_PurchReqDet reqdet
    JOIN Prs_NeedObj needobj on needobj.gidsrcobj = reqdet.gid
    JOIN Prs_PurchTrans trans on  trans.idneedobj = needobj.id
    JOIN Prs_PurchReqPos reqpos on reqpos.id = reqdet.idpurchreqpos
    join Prs_PurchReq purchreq on purchreq.id = reqpos.idpurchreq
    JOIN Cnt_Contract contract on  contract.id = trans.idcontract 
    WHERE reqdet.gid = '100651/23472'
)
SELECT * FROM PurchTrans;

7.7.7.2.5. Получение всех объектов потребности по заявке#

Используется чтобы получить список всех объектов потребности, связанных с указанной заявкой на закупку. Помогает выявить пропущенные или несформированные позиции.

Внимание

Перед выполнением замените <тут id заявки> на реальный идентификатор.

Место применения: Сервис > Инструменты > Выполнить запрос.

Тип: SQL-запрос

select * from prs_needobj no
left join prs_purchreqpos reqpos on no.giddetneed = reqpos.gid 
left join prs_purchreq reqdoc on reqpos.idpurchreq = reqdoc.id
where reqdoc.id = <тут id заявки>;

7.7.7.2.6. Анализ распределения потребностей по документам закупки#

Используется чтобы найти проводки закупки, связанные с заданными объектами потребности, и отфильтровать их по типу связанного документа (например, заказы или договоры). Применяется для анализа маршрутизации потребностей.

Внимание

Перед выполнением замените список gid в IN (...) и шаблоны LIKE на актуальные значения.

Место применения: Сервис > Инструменты > Выполнить запрос.

Тип: SQL-запрос

with Transes AS (
  select
    no.gid as NeedObj,
    pt.gid as PurchTrans,
    pt.gidDocObj as DocObj
  from
    Prs_PurchTrans pt
    join Prs_NeedObj no on pt.idNeedObj = no.id
    and no.gid in ('298400/21852', '298400/21853')
    where pt.gidDocObj like '30151/%' or pt.gidDocObj like '125351/%'
)
SELECT * FROM Transes;

7.7.7.2.7. Детализация структуры заявки и связанных потребностей#

Используется чтобы отобразить полную цепочку данных: версии заявки, её позиции, детализацию и связанные объекты потребности. Позволяет проверить корректность формирования потребностей и проанализировать заданные количества.

Внимание

Перед выполнением замените 23753 на id нужной заявки.

Место применения: Сервис > Инструменты > Выполнить запрос.

Тип: SQL-запрос

select 
reqver.nnum as snumreqver
,needobj.id as idneedobj
,needobj.nqty as nqtyneedobj
,needobj.giddetneed as giddetneed
,purchpos.id as idpurchpos
,purchdet.id as idpurchdet
from prs_purchreqver reqver
left join prs_purchreqdet as purchdet on purchdet.idpurchreqver = reqver.id
left join prs_purchreqpos as purchpos on purchdet.idpurchreqpos = purchpos.id
left join prs_needobj as needobj on needobj.gidsrcobj = purchdet.gid
where purchpos.idpurchreq = 23753