AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Функционал
NAV
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.12.2009, 18:38   #21  
logger_imported is offline
logger_imported
Участник
Аватар для logger_imported
 
41 / 10 (1) +
Регистрация: 27.10.2006
Итак, сегодня, поколдовав 2 часа над дебаггером, удалось выявить место, где формируются проводки учета производства. Это несравненный CodeUnit 5802 "Inventory Posting To G/L", функция InitInvtPostBuf. Модифицировал функцию для целей разделения проводок.

Новые локальные переменные:
Name DataType Subtype Length
CostToPost1 Decimal
CostToPost2 Decimal
ValueEntry_l Record Value Entry
CostToPostACY1 Decimal
CostToPostACY2 Decimal
ValueEntry_l_tmp Record Value Entry
OutputExists Boolean

Листинг:

Код:
// RBS >20091210
CASE ValueEntry."Item Ledger Entry Type" OF
  // если выход производственного заказа
  ValueEntry."Item Ledger Entry Type"::Output: BEGIN
    OutputExists:=FALSE;

    ValueEntry_l_tmp.RESET;
    ValueEntry_l_tmp.DELETEALL;

    ValueEntry_l.RESET;
    ValueEntry_l.SETCURRENTKEY("Document No.");
    ValueEntry_l.SETFILTER(ValueEntry_l."Document No.",ValueEntry."Document No.");
    //себестоимость потребленных товаров Д20.1 К41
    ValueEntry_l.SETRANGE(ValueEntry_l."Item Ledger Entry Type",ValueEntry_l."Item Ledger Entry Type"::Consumption);
    ValueEntry_l.FINDFIRST;
    REPEAT
      CostToPost1:=CostToPost1+ABS(ValueEntry_l."Cost Posted to G/L");
    UNTIL ValueEntry_l.NEXT = 0;
    //себестоимость работы Д20.2 К70
    ValueEntry_l.SETRANGE(ValueEntry_l."Item Ledger Entry Type",ValueEntry_l."Item Ledger Entry Type"::" ");
    ValueEntry_l.FINDFIRST;
    REPEAT
      CostToPost2:=CostToPost2+ABS(ValueEntry_l."Cost Posted to G/L");
    UNTIL ValueEntry_l.NEXT = 0;
    //проверяем, был ли уже сформирован выход продукции (иначе получим дублирование проводок при коррекции себестоимости)
    ValueEntry_l.SETRANGE("Item Ledger Entry Type",ValueEntry_l."Item Ledger Entry Type"::Output);
    ValueEntry_l.SETFILTER("Cost Posted to G/L",'<>0');
    IF ValueEntry_l.FINDFIRST THEN
      IF ValueEntry_l."Entry No."<>ValueEntry."Entry No." THEN
        OutputExists:=TRUE;
    IF OutputExists=TRUE THEN BEGIN
      PostBufDimNo := PostBufDimNo + 1;
      SetAccNo(TempInvtPostBuf[PostBufDimNo],ValueEntry,AccType,BalAccType);
      SetPostBufAmounts(TempInvtPostBuf[PostBufDimNo],CostToPost,CostToPostACY,InterimAccount);
      PostBufDimNo := PostBufDimNo + 1;
      SetAccNo(TempInvtPostBuf[PostBufDimNo],ValueEntry,BalAccType,AccType);
      SetPostBufAmounts(TempInvtPostBuf[PostBufDimNo],-CostToPost,-CostToPostACY,InterimAccount);
    END ELSE BEGIN
      //формируем себестоимость потребленных товаров Д43 К20.1
      PostBufDimNo := PostBufDimNo + 1;
      SetAccNo(TempInvtPostBuf[PostBufDimNo],ValueEntry,AccType,BalAccType);
      SetPostBufAmounts(TempInvtPostBuf[PostBufDimNo],CostToPost1,CostToPostACY1,InterimAccount);
      PostBufDimNo := PostBufDimNo + 1;
      SetAccNo(TempInvtPostBuf[PostBufDimNo],ValueEntry,BalAccType,AccType);
      SetPostBufAmounts(TempInvtPostBuf[PostBufDimNo],-CostToPost1,-CostToPostACY1,InterimAccount);
      //формируем себестоимость работ Д43 К20.2
      ValueEntry_l_tmp:=ValueEntry;
      ValueEntry_l_tmp."Location Code":='';
      PostBufDimNo := PostBufDimNo + 1;
      SetAccNo(TempInvtPostBuf[PostBufDimNo],ValueEntry_l_tmp,AccType,BalAccType);
      SetPostBufAmounts(TempInvtPostBuf[PostBufDimNo],CostToPost2,CostToPostACY2,InterimAccount);
      PostBufDimNo := PostBufDimNo + 1;
      SetAccNo(TempInvtPostBuf[PostBufDimNo],ValueEntry_l_tmp,BalAccType,AccType);
      SetPostBufAmounts(TempInvtPostBuf[PostBufDimNo],-CostToPost2,-CostToPostACY2,InterimAccount);
    END;
  END;
  ELSE BEGIN
// RBS <20091210
    PostBufDimNo := PostBufDimNo + 1;
    SetAccNo(TempInvtPostBuf[PostBufDimNo],ValueEntry,AccType,BalAccType);
    SetPostBufAmounts(TempInvtPostBuf[PostBufDimNo],CostToPost,CostToPostACY,InterimAccount);
    PostBufDimNo := PostBufDimNo + 1;
    SetAccNo(TempInvtPostBuf[PostBufDimNo],ValueEntry,BalAccType,AccType);
    SetPostBufAmounts(TempInvtPostBuf[PostBufDimNo],-CostToPost,-CostToPostACY,InterimAccount);
// RBS >20091210
  END;
END;
// RBS <20091210

// PS462.begin
TempInvtPostBuf[PostBufDimNo]."FA No." := ValueEntry."FA No.";
TempInvtPostBuf[PostBufDimNo]."Depreciation Book Code" := ValueEntry."Depreciation Book Code";
TempInvtPostBuf[PostBufDimNo]."FA Entry No." := ValueEntry."FA Entry No.";
// PS462.end
Результат в сформированной корреспонденции (три товара и два рабочих центра):

Операция Но. Документ Но. Дата Учета Дебет Счет Но. Дебет Источник Но. Кредит Счет Но. Кредит Источник Но. Сумма
384 101016 10.12.09 20-1100 41-1000 527,08
386 101016 10.12.09 20-1100 41-1000 63,04
388 101016 10.12.09 20-1100 41-1000 741,50
390 101016 10.12.09 20-1200 70-1000 775,00
392 101016 10.12.09 20-1200 70-1000 2 750,00
395 101016 10.12.09 43-1000 20-1200 3 525,00
396 101016 10.12.09 43-1000 20-1100 1 331,62

Операции стоимости никоим образом не затрагиваются. Коррекция себестоимости добавляет необходимые проводки.

Операция Но. Документ Но. Дата Учета Дебет Счет Но. Дебет Источник Но. Кредит Счет Но. Кредит Источник Но. Сумма
435 101016 10.12.09 20-1100 41-1000 155,04
467 101016 10.12.09 43-1000 20-1100 155,04
__________________
Незнание закона не освобождает от ответственности... От ответственности освобождает знание закона!
Компания НЭТИ - http://i-neti.ru/
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 02:05.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.