Function
GetPaymentString(CustomerNo:Code[10],CalcDate: Date,CustPostingGroup:Code[10]): Text[250]
CustomerNo код клиента
CalcDate дата на момент которой считать предоплату
CustPostingGroup учетная группа клиента
C\AL Locals
Customer record Customer
CLE record Cust. Ledger Entry
balance decimal
result returnvalue Text[250]
Код:
result:='';
IF customer.GET(CustomerNo) THEN
BEGIN
customer.SETRANGE("Date Filter",0D,CalcDate); // фильтр чтобы посчитать вычисимые поля
IF CustPostingGroup = '' THEN
CustPostingGroup:=customer."Customer Posting Group";
// если пустая учетная группа берем из настроек клиента.
// если с клиентом работаем по разным счетам(субсчетам) например продаем услуги и товары
// в этом случае нам понадобится учетная группа клиента
customer.CALCFIELDS("Net Change (LCY)"); //вычисляем баланс
// во здесь аккуратнее стандартное поле не считает баланс по учетным группам
// можно отредактировать в формулу вычисления или добавить свое поле
// чтобы считать именно предоплату по этой учетной группе (например за товар)
IF customer."Net Change (LCY)" <0 THEN // есть предоплата
BEGIN
balance:=ABS(customer."Net Change (LCY)");
CLE.SETRANGE("Document Type",CLE."Document Type"::Payment);
// фильтр по оплатам (будем печатать в сф только оплаты)
CLE.SETRANGE("Customer No.",customer."No.");
CLE.SETRANGE("Posting Date",0D,CalcDate);
CLE.SETRANGE("Customer Posting Group", CustPostingGroup);
IF CLE.FIND('-') THEN
REPEAT
CLE.MARK(TRUE); // помечаем записи оплат, потом пойдем вычислять с последней
UNTIL CLE.NEXT = 0;
WHILE CLE.FIND('+') AND (balance>0) DO
BEGIN
CLE.CALCFIELDS("Remaining Amount"); // непримененная сумма, только для открытых операций
IF CLE.Open THEN
balance:=balance - ABS(CLE."Remaining Amount")
ELSE
balance:=balance - ABS(CLE.Amount);
result:=CLE."External Document No." + ' от '+FORMAT(CLE."Posting Date") + ','+result;
CLE.MARK(FALSE);
CLE.MARKEDONLY(TRUE);
END;
END;
END;
Вот в принципе и вся логика для Навижина.
Если найдете косяки обязательно сообщите.