Принцип управления запасами FIFO


Главная » Ресурсы » Здесь
Жоаннес Верморель, июль 2016 г.

Согласно принципу FIFO (первый пришел — первый ушел), товары, которые были приобретены первыми, должны быть проданы первыми. Модель FIFO можно использовать как теоретическое основание для организации реальных товарных потоков в бухгалтерии и финансах. Метод FIFO можно применять на практике в цепях поставок для контроля срока годности и устаревания продукции, негативно влияющие на запасы. Благодаря FIFO-анализу запасов можно рассчитать "возраст" запасов, найти товары с низкой оборачиваемостью и неликвидные запасы. На данной странице описана процедура проведения FIFO-анализа на практике, а также теоретические и практические ограничения данного подхода.

Физический аспект метода FIFO

С точки зрения цепей поставок, то есть при работе с реальными товарными потоками, обычно имеет смысл в первую очередь отгружать товары, которые были закуплены первыми. Благодаря этому компания сможет свести к минимуму потери из-за истечения срока годности, при условии что в запасе у нее хранится не чрезмерное количество товара. Кроме того, данный метод позволяет ограничить другие мелкие последствия длительного хранения товаров (например, потускнение упаковки).

Например, в сфере торговли одеждой через Интернет возвраты могут достигать 50% от всех сделок. В данной ситуации обычно рекомендуется в первую очередь продавать товары, которые были возвращены ранее. Это дополнение к методу FIFO, которое позволяет надлежащим образом учитывать возврат товаров. Данный метод позволяет работать с вторичными каналами продаж при окончании реализации текущей коллекции товаров.

Многие складские системы вообще не различают, какая именно единица товара отгружается клиенту. Как следствие, в продажу уходит любая единица товара, а не самая старая. Анализ данной процедуры в данной статье не рассматривается.

FIFO-анализ

В отличие от физического аспекта данного метода FIFO-анализ представляет собой теоретический подход к товарным запасам. Он основан на предположении, что товары, которые были приобретены первыми, отгружаются первыми независимо от реального товарного потока. Подход с точки зрения метода FIFO значительно упрощает финансовый анализ товарных запасов.

На практике для проведения FIFO-анализа необходимо следующее:

  • текущий уровень запасов
  • история заказов на закупку с датами доставки

На основании этих данных с помощью FIFO-анализа можно рассчитать следующие значения:

  • оценка запасов, учитывающая различные закупочные цены
  • ожидаемая прибыль, которая зависит от закупочных цен
  • средний возраст запасов (а также соответствующие крайние значения)

В следующем разделе мы рассмотрим, как вышеперечисленное можно рассчитать на практике.

Envision и FIFO-анализ

В системе Lokad используется язык программирования Envision, который нужен для количественной оптимизации цепей поставок. Функция fifo() в Envision специально предназначена для FIFO-анализа.

При наличии известного текущего уровня запасов и данных о размещенных заказах на закупку товаров метод fifo() позволяет так или иначе подробно описать состав запасов с указанием возраста каждой единицы товара. Таким образом, каждая единица товара привязана к одной строке заказа на закупку. Это может показаться незначительным, однако данный метод позволяет рассчитывать количество нераспроданных'’ единиц товара для каждой строки заказа на закупку с учетом текущего уровня запасов.

Как следствие, данные о количестве нераспроданного товара можно использовать для определения важных показателей финансовой эффективности. Давайте разберемся, как функция fifo() рассчитывает количество нераспроданного товара по каждой строке заказа на закупку:
read "/sample/Lokad_Items.tsv"
read "/sample/Lokad_PurchaseOrders.tsv" as PO with
  "Quantity" as Qty

PO.Unsold = fifo(StockOnHand, PO.Date, PO.Qty)
show table "Unsold" with
  Id
  PO.Date
  PO.Unsold
Сценарий, показанный выше, начинается с чтения двух файлов: списка наименований и списка заказов на закупку, полученного из образца набора данных. Затем в строке 5 выполняется вызов функции fifo(). У данной функции есть три аргумента:

  • текущий уровень запасов
  • дата заказа на закупку (обычно дата доставки)
  • количество товара, привязанное к заказу на закупку

В строке 6 оператор show table позволяет вывести на экран результаты расчетов.

Оценка товарных запасов

Оценку товарных запасов можно легко выполнить с помощью следующего сценария:
read "/sample/Lokad_Items.tsv"
read "/sample/Lokad_PurchaseOrders.tsv" as PO with
  "Quantity" as Qty

PO.Unsold = fifo(StockOnHand, PO.Date, PO.Qty)
StockValue = sum(PO.Unsold * PO.NetAmount / PO.Qty)

show table "Total stock value" with
  sum(StockValue)
В сценарии выше количество нераспроданных товаров PO.Unsold умножается на исходную цену закупки единицы товара, которая рассчитывается следующим образом PO.NetAmount / PO.Qty.

Средняя цена закупки

Рассчитать среднюю цену закупки можно с помощью метода FIFO. Сценарий, показанный ниже, получен из предыдущего сценария, и он предназначен для этой цели:
read "/sample/Lokad_Items.tsv"
read "/sample/Lokad_PurchaseOrders.tsv" as PO with
  "Quantity" as Qty

PO.Unsold = fifo(StockOnHand, PO.Date, PO.Qty)
StockValue = sum(PO.Unsold * PO.NetAmount / PO.Qty)
PP = StockValue /. sum(PO.Unsold)

where PP > 0 // фильтр наименований без заказов на закупку
  show table "Purchase prices" with
    Id
    Name
    PP
Вектор PP содержит закупочные цены на все наименования. Мы используем оператор деления /., который возвращает значение равное нулю, если делитель равен нулю. Благодаря этому в строке 8 мы можем отделить все наименования, для которых невозможно рассчитать закупочные цены из-за отсутствия соответствующих заказов на закупку.

Возраст запасов

Возраст запасов также относительно легко рассчитать, однако для этого требуется еще кое-что: дата, соответствующая
настоящему моменту''. Возраст данных о запасах может составлять всего лишь несколько дней, а текущая календарная дата может не подходить для проведения анализа. В примере ниже мы вводим переменную с именем «today», которую можно подгонять под реальные условия.
read "/sample/Lokad_Items.tsv"
read "/sample/Lokad_PurchaseOrders.tsv" as PO with
  "Quantity" as Qty

// последняя дата в данных
today := max(PO.Date) + 1

PO.Unsold = fifo(StockOnHand, PO.Date, PO.Qty)
PO.Age = (today - PO.Date) // возраст в днях
Age = sum(PO.Unsold * PO.Age) /. sum(PO.Unsold)

show table "Stock age" with
  Id
  Name
  Age
  order by Age desc
Сценарий выше выводит на экран список всех наименований товаров в запасе, упорядоченный по возрасту запасов, причем самые старые наименования помещаются вверх списка. В строках 8-10 производятся расчеты среднего возраста для всех заказов на закупку на основании данных о нераспроданных товарах.

Ограничения FIFO-анализа

Показатели FIFO-анализа основаны на определенных предположениях о потоке товарных запасов. Тем не менее, когда данные или фактический товарный поток не соответствует этим предположениям, качество результатов, как правило, заметно страдает. В данном разделе мы рассмотрим самые распространенные проблемы, связанные с FIFO-анализом.

Ограниченные данные о закупках

Для проведения качественного FIFO-анализа не требуются чрезвычайно подробные данные о закупках с самого начала существования компании, однако зачастую получается, что самые старые товары находятся в запасе дольше, чем можно проследить по истории закупок. В некоторых отраслях, таких как аэрокосмическая промышленность, часто используются запчасти, которым по 10 лет, однако извлечение 10-летней истории закупок из инвентарной системы — сложная задача.

Симуляция случаев дефицита товара

Если в вашем распоряжении есть история закупок и история продаж, можно предположить, что историю случаев дефицита товара можно рассчитать, проанализировав вышеупомянутые данные в хронологическом порядке. Теоретически при проведении такой симуляции можно рассчитать уровень запасов на любой момент времени и отметить периоды, когда он был на нуле в виде случаев дефицита.

Однако опыт Lokad показывает, что данный подход, к сожалению, практически никогда не работает. В данном случае даже малейшие несоответствия (например, не была учтена одна единица товара) нарушают ход анализа, потому что в периоды дефицита товара уровень запасов практически никогда не бывает на нуле — как правило, это небольшие положительные или отрицательные значения, что не позволяет идентифицировать искомые случаи.

Товары с серийными номерами

Когда все единицы товара имеют уникальные серийные номера и когда все перемещения запасов отслеживаются на уровне серийного номера, FIFO-анализ можно считать грубым приближением. Если запасы есть смысл отслеживать по серийному номеру, то их уровень почти всегда можно анализировать с помощью дополнительных параметров, которые предоставляет серийный номер.