Вернуться   Андрей Панько. Заметки про Dynamics NAV > Dynamics NAV (Navision)
Справка Пользователи Календарь Поиск Сообщения за день Все разделы прочитаны

Dynamics NAV (Navision) Заметки про Dynamics NAV (ранее Navision) и аддон LS Retail

Ответ
 
Опции темы Поиск в этой теме
  #1  
Старый 12.02.2007, 10:46
apanko apanko вне форума
Администратор
 
Регистрация: 15.08.2006
Сообщения: 1,629
Про товарный журнал

Замечено странное поведение товарного журнала.

Чтобы продемонстрировать создадим Товар1 со следующими параметрами:
Метод учета себестоимости = FIFO
Себестоимость единицы = 100
Косвеная себестоимость % = 20

Теперь зайдем в товарный журнал и введем строку с операцией типа приход 1 штуки Товар1. Обратим внимание на поля Цена единицы (Unit Amount) и Себестоимость единицы (Unit Cost).

Цена единицы = 83,333 (что равно 100%*100/120%)
Себестоимость единицы = 120 (что равно 100 * (100%+20%)/100%)


Если посмотреть внутрь, то окажется что происходит следующее:

В триггере Unit of Measure Code - OnValidate() рассчитывается значение поля "Unit Cost".
В нашем примере "Unit Cost" будет равен 100. Затем на основании "Unit Cost" рассчитывается “Unit Amount”.
Код:
VALIDATE("Unit Amount","Unit Cost");

Соответственно "Unit Amount” в данном случае также будет равен 100. После этого выполняется код в триггере Unit Amount - OnValidate(), где в свою очередь, на основании "Unit Amount", рассчитывается "Unit Cost".
Код:
IF "Entry Type" = "Entry Type"::Приход THEN "Unit Cost" := ROUND( "Unit Amount" * (1 + "Indirect Cost %" / 100),GLSetup."Unit-Amount Rounding Precision") + "Overhead Rate" * "Qty. per Unit of Measure";
В этом случае уже анализируются косвенные и накладные расходы, поэтому "Unit Cost" будет равен 120.
Все бы хорошо, но на последок в триггере UnitofMeasureCode - OnValidate() запускается триггер Quantity - OnValidate() в котором запускается функция GetUnitAmount(CalledByFieldNo). После ее выполнения "UnitAmount" будет равен 83,333.
Код:
"Unit Amount" := ROUND( ((UnitCost - "Overhead Rate") * "Qty. per Unit of Measure") / (1 + "Indirect Cost %" / 100), GLSetup."Unit-Amount Rounding Precision");

Явно прослеживаются сомнения разработчиков: что принять за базу, а что рассчитывать на основании.
Встроенная справка содержит по этому поводу более решительное заявление
Цитата:
Поле Себест. Единицы
В этом поле показана себестоимость единицы товара в строке.
Если в поле Метод Учета Себестоимости в карточке товара выбрано значение Стандарт, программа будет автоматически извлекать данные из поля Себест. Единицы карточки товара.
Если выбрано другое значение и тип операции строки журнала товаров не Покупка, программа вычисляет себестоимость единицы как Цена Единицы плюс Косвен. Себест. %. Кроме того, если в карточке товара были определены накладные расходы, к себестоимости единицы добавляется значение поля Накладные Расходы.
Если тип операции строки журнала товаров – Покупка, программа рассчитывает себестоимость единицы как Цена Единицы и при учете строки журнала товаров учитывает косвенные затраты и накладные расходы отдельно.

Отсюда явно следует, что поле “Unit Cost” рассчитывается на основании “Unit Amount”, поэтому для корректной работы товарного журнала следует внести следующую корректировку.
В функции GetUnitAmount(CalledByFieldNo) приведенный ниже код
Код:
"Entry Type"::Приход: "Unit Amount" := ROUND( ((UnitCost - "Overhead Rate") * "Qty. per Unit of Measure") / (1 + "Indirect Cost %" / 100), GLSetup."Unit-Amount Rounding Precision");
следует заменить на
Код:
"EntryType"::Приход: "Unit Amount" := ROUND((UnitCost * "Qty. per Unit of Measure"), GLSetup."Unit-Amount Rounding Precision");

Стоит отметить, что вносить вышеуказанные исправления смысла на самом деле нет. При учете строки журнала созданная операция стоимости будет содержать только значение 120 (Unit Cost), и никакого упоминания о 83,333 (Unit Amount) в ней нет.

Последний раз редактировалось apanko, 31.01.2008 в 01:42.
Ответить с цитированием
  #2  
Старый 31.01.2008, 02:43
apanko apanko вне форума
Администратор
 
Регистрация: 15.08.2006
Сообщения: 1,629
Пишу очередное фундаментальное исследование (давно их что-то не было). Натыкаюсь на разное.

Только что увидел такое, что пустил слезу.


Исходные данные.
Все тот же товарный журнал. При отработке триггера onValidate на поле "Товар Но." система выполняет сложнейшие расчеты для определения цены ("Unit Amount"). При этом привлекает следующие функции:
· FindItemJnlLinePrice кодеюнита 7020 Purch. Price Calc. Mgt. если тип операции покупка
· FindItemJnlLinePrice кодеюнита 7010 Sales Price Calc. Mgt. если тип операции продажа
Затем система делает нехитрый расчет значения поля Себестоимость Единицы ("Unit Cost") - просто берет его из карточки товара (либо если есть из СКУ).

А затем вызывается триггер onValidate поля Код Единицы Измерения, где сложные расчеты затираются простыми:
Код:
VALIDATE("Unit Amount","Unit Cost");

Хотел бы спросить: где логика?
Но воздержусь - у самого хромает. Не зря поднял старую заметку.
Вся цепочка рассуждений в ней была верной.
А вывод оказался ошибочным.
Править, исходя из указанных предпосылок, надо было расчет поля "Unit Cost".
Т.е. "Unit Cost" берется из карточки (или если есть из СКУ), затем из него вычитается косвенная себестоимость и получается "Unit Amount".

Но повторю, это на основании справки к полю Себестоимость Единицы в товарном журнале.


А если посмотреть в справку к полю Последняя Прямая Себестоимость в карточке товара:
Цитата:
Поле Посл. Прямая Себест.
Данное поле содержит самую последнюю прямую себестоимость единицы товара.
При учете заказа по счету программа автоматически копирует последнюю прямую себестоимость единицы товара из поля Прямая Себест. Единицы таблицы Покупка Строка. Если использовать журналы, программа скопирует прямую себестоимость единицы из поля Цена Единицы, находящегося в строках журнала товаров с типом операции Покупка.
Программа будет использовать прямую себестоимость единицы в качестве настройки по умолчанию в следующий раз, когда товар будет указываться в строке покупки или строке журнала товаров с типом операции Покупка или Приход.
Т.е. исходя из этой логики поле "Unit Amount" для покупок должно непосредственно браться из карточки товара (или если есть из СКУ).

Как-то сложнова-то для двух полей, одно из которых в учете не участвует. Вы не находите?


Ну и напоследок.
Зачем в каждом триггере прописывать алгоритмы расчета полей "Unit Cost" и "Unit Amount" (опустим, что в разных триггерах эти алгоритмы совершенно разные). Когда есть специальные функции для этих целей:

· GetUnitAmount
· RetrieveCost
· RecalculateUnitAmount
Ответить с цитированием
  #3  
Старый 31.01.2008, 21:09
apanko apanko вне форума
Администратор
 
Регистрация: 15.08.2006
Сообщения: 1,629
Цитата:
Сообщение от apanko
Стоит отметить, что вносить вышеуказанные исправления смысла на самом деле нет. При учете строки журнала созданная операция стоимости будет содержать только значение 120 (Unit Cost), и никакого упоминания о 83,333 (Unit Amount) в ней нет.

Не совсем так. Сумма 83,333 (Unit Amount) попадет в карточку товара - обновит значение поля Последняя Прямая Себестоимость.

Последний раз редактировалось apanko, 31.01.2008 в 21:35.
Ответить с цитированием
  #4  
Старый 13.03.2008, 16:30
apanko apanko вне форума
Администратор
 
Регистрация: 15.08.2006
Сообщения: 1,629
См. также О назначении некоторых «стоимостных» полей в карточке товара.
Ответить с цитированием
Ответ


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 06:22.

Контакты: e-mail, телефон: +7(926)1805967 - Архив - Вверх

Microsoft Most Valuable Professional
vBulletin v3.5.4, Copyright ©2000-2018, Jelsoft Enterprises Ltd.
Русский перевод: zCarot, Vovan & Co
Права на все материалы, опубликованные на блогофоруме принадлежат Андрею Панько, если в самом материале не указано иное.
Рейтинг@Mail.ru Rambler's Top100