Перейти к основному содержанию
`Ctrl`+`K`

# Замена контрагента договора с обновлением связанных данных

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

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

Внимание

Требует адаптации под конкретный договор и структуру данных. Перед запуском укажите актуальный идентификатор договора в переменной `idvCnt`, проверьте стороны договора в вызовах `Cnt_SideApi.findByMnemoCode(...)` и убедитесь, что прямые SQL-обновления соответствуют задаче. Скрипт изменяет данные сразу в нескольких связанных объектах.

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

    const idvCnt = 49740L;//id договора
    const ropCnt = Cnt_ContractApi.load(idvCnt);
    const ropContr = Bs_ContrasApi.load(parseId(ropCnt.gidOtherSettler));
    if (isNull(ropContr.idCorporation)) {
      raise("Не найден головной контрагент");
    }
    const gidvOldSettler = ropCnt.gidOtherSettler;
    const gidvNewSettler = Bs_ContrasApi.getGid(ropContr.idCorporation);
    if (ropCnt.gidOtherSettler == gidvNewSettler) {
      raise("В договоре уже стоит головной контрагент");
    }

    var rop_Cnt_ContractSide1 = Cnt_ContractSideApi.insertByParent(ropCnt);
    Cnt_ContractSideApi.setidSide(rop_Cnt_ContractSide1, Cnt_SideApi.findByMnemoCode("consignor")); //!!!подставить нужное!!!
    Cnt_ContractSideApi.setgidSettler(rop_Cnt_ContractSide1, gidvOldSettler);
    var rop_Cnt_ContractSide2 = Cnt_ContractSideApi.insertByParent(ropCnt);
    Cnt_ContractSideApi.setidSide(rop_Cnt_ContractSide2, Cnt_SideApi.findByMnemoCode("receiver")); //!!!подставить нужное!!!
    Cnt_ContractSideApi.setgidSettler(rop_Cnt_ContractSide2, gidvOldSettler);
    session.flush();

    tsql(`update Cnt_Contract c set gidOtherSettler = '`+gidvNewSettler+`' where c.id = `+idvCnt).execute();
    tsql(`update Cnt_Contract c set gidOtherSettler = '`+gidvNewSettler+`' where c.idParentContract = `+idvCnt).execute();
    //tsql(`update Cnt_ContractSide c set gidSettler = '`+gidvNewSettler+`' where c.bMain = 1 and c.idContract = `+idvCnt).execute();

    var func = function() {
      var sQ0 = `
    			select t.id
    			from Cnt_ContractSide t
    			where  t.bMain = 1 and t.idContract = `+idvCnt;
    	var qq = sql(sQ0).asList();
    	for (w: qq) {
    	  const rop = Cnt_ContractSideApi.load(w.id);
    	  Cnt_ContractSideApi.setgidSettler(rop, gidvNewSettler);
    	}
    }
    Cnt_ContractApi.forDisabledTaxType(func);

    //график платежей
    tsql(`update Cnt_PaySchedule c set gidSettler = '`+gidvNewSettler+`' where c.idMainContract = `+idvCnt).execute();
    //все ДПП
    tsql(`update Pm_ExpectedPay c set gidSettler = '`+gidvNewSettler+`' where c.idContract = `+idvCnt).execute();
    //все ЗнП
    tsql(`update pm_payrequest c set gidSettlerPayFor = '`+gidvNewSettler+`' where c.idContract = `+idvCnt).execute();
    tsql(`update Pm_PayRequestSumDistrJournal c set gidSettlerPayFor = '`+gidvNewSettler+`' where c.idContract = `+idvCnt).execute();
    //все ПП
    tsql(`update Pm_OrderBankOut c set gidSettlerPayFor = '`+gidvNewSettler+`' where c.idContract = `+idvCnt).execute();
    //ПМ регистр
    tsql(`update Pm_PayMoveReg c set gidSettler = '`+gidvNewSettler+`' where c.idContract = `+idvCnt).execute();
    //Объекты баланса
    tsql(`update Pm_BalObj c set gidSettler = '`+gidvNewSettler+`' where c.idContract = `+idvCnt).execute();
    //ключи поисковые обновить
    var sQ1 = `
    select t.id
    from Pm_BalObj t
    where  t.idContract = `+idvCnt
    ;
    var l1 = sql(sQ1).asList();
    for (w: l1) {
      const rop = Pm_BalObjApi.load(w.id);
      Pm_BalObjApi.setsFindKey(rop, Pm_BalObjApi.gensFindKey(w.id));
    }
    flush();

    tsql(`update Pm_PayMoveReg c set sFindKey = t.sFindKey from Pm_BalObj t where c.idBalObj = t.id and c.idContract = `+idvCnt).execute();
    tsql(`update Pm_PayMoveReg c set sFindKeyFrom = t.sFindKey from Pm_BalObj t where c.idBalObjFrom = t.id and c.idContract = `+idvCnt).execute();

    //оплаты
    tsql(`update Pm_PayMove c set gidSettlerFrom = '`+gidvNewSettler+`' where c.idContractFrom = `+idvCnt).execute();
    tsql(`update Pm_PayMove c set gidSettlerTo = '`+gidvNewSettler+`' where c.idContractTo = `+idvCnt).execute();

    var sQ2 = `
    select t.id
    from Pm_PayMove t
    where  t.idContractFrom = `+idvCnt+`
    union
    select t.id
    from Pm_PayMove t
    where  t.idContractTo = `+idvCnt
    ;
    var l2 = sql(sQ2).asList();
    for (w: l2) {
      const rop = Pm_PayMoveApi.load(w.id);
      Pm_PayMoveApi.refreshFindKeyFrom(rop);
      Pm_PayMoveApi.refreshFindKeyTo(rop);
    }
    flush();
    //акты
    tsql(`update Stm_ActIn c set gidSettler = '`+gidvNewSettler+`' where c.idContract = `+idvCnt).execute();
    // с.ф.
    tsql(`update Stm_InvBillDocIn c set gidSettler = '`+gidvNewSettler+`' from stm_actin a where c.id = a.idInvBillDocIn and a.idContract = `+idvCnt).execute();
    tsql(`update Stm_BookInclSetting c set gidSettler = a.gidSettler from Stm_InvBillDocIn a where c.gidDoc = a.gid and a.gidSettler = '`+gidvNewSettler+`'`).execute();
    //проводки
    var sQ3 = `
    select distinct t.idtrans id
    from act_transreg t
    where  t.idContract = `+idvCnt+`
    and    t.gidSettler = '`+gidvOldSettler+`'
    and    t.bCredit = 1
    `;
    var l3 = sql(sQ3).asList();

    for (w: l3) {
      const rop = Act_TransApi.load(w.id);
      Act_TransApi.setAttrCr(rop,"gidSettlerBranch",gidvOldSettler);
      Act_TransApi.setAttrCr(rop,"gidSettler",gidvNewSettler);
    }
    flush();
    var sQ4 = `
    select distinct t.idtrans id
    from act_transreg t
    where  t.idContract = `+idvCnt+`
    and    t.gidSettler = '`+gidvOldSettler+`'
    and    t.bCredit = 0
    `;
    var l4 = sql(sQ4).asList();

    for (w: l4) {
      const rop = Act_TransApi.load(w.id);
      Act_TransApi.setAttrDeb(rop,"gidSettlerBranch",gidvOldSettler);
      Act_TransApi.setAttrDeb(rop,"gidSettler",gidvNewSettler);
    }
    commit();