Может данная "особенность" алгоритма всё-таки не есть чья-то хитрая задумка? Похоже на простой косяк. Проводки по задолженности за предприятием или сотрудником формируются в методе closePayment класса RPayController. В тексте метода присутствует такой вот "странный" кусок кода:
X++:
if (rpayTransOld.Amount > 0)
{
debtAmount = rpayTransOld.Amount - roundDown(rpayTransOld.Amount,rPayParameters.PaySheetRound);
}
else
{
debtAmount = rpayTransOld.Amount;
}
if (debtAmount != 0)
{
rPayTransNew.clear();
rPayTransNew.SourceDate = payPeriod;
rPayTransNew.PayPeriod = payPeriod;
rPayTransNew.TransDate = systemdateget();
rPayTransNew.PayCtype = debtAmount > 0 ? costCompanyDebt : costEmplDebt;
rPayTransNew.Amount = currency::amount(debtAmount);
rPayTransNew.PayModuleCode = #ModuleNameClosePayment;
rPayTransNew.initFromEmplTable(emplTable1);
rPayTransNew.doInsert();
}
Таким образом, если сальдо собрали отрицательное,
всё нормально - формируется строка в RPayTrans на эту самую сумму. Тип - "Долг за сотрудником". Если же сальдо получилось положительным, мы из него зачем-то вычитаем... ту же самую, но округлённую сумму

Где логика? По-моему, надо вообще убрать этот if-else.