FIFO или скользящая средняя: как метод оценки запасов в ERPNext меняет себестоимость на объекте
В ERPNext оценка запасов — это FIFO либо скользящая средняя (Moving Average). FIFO списывает по цене старых партий, скользящая средняя — по средней цене остатка. Подрядчику с частыми закупками я чаще ставлю Moving Average. Ниже: пример на цифрах, пересчёт Repost Item Valuation, опасные настройки и разговор с бухгалтером.
Чем FIFO отличается от скользящей средней в ERPNext и где этот выбор делается?
FIFO списывает материал по цене самых ранних партий, а скользящая средняя (Moving Average) списывает по средней цене всего остатка, которая пересчитывается при каждом поступлении. Количество материала в обоих случаях одинаковое, различается стоимость списания и стоимость остатка. Общая сумма «куплено» равна сумме «списано плюс осталось», просто делится она по-разному.
Выбор делается в двух местах. Значение по умолчанию задаётся в Stock Settings (поле Default Valuation Method; доступны FIFO, LIFO и Moving Average, по умолчанию стоит FIFO), а у конкретной номенклатуры метод фиксируется в карточке Item. Документация о смене метода говорит точно: для позиций, по которым уже есть движения, допускается переход с FIFO на Moving Average, а с Moving Average обратно на FIFO нет (это же ограничение зашито в коде карточки Item в v15). Поэтому решение принимают до загрузки остатков, а не после первого месяца работы.
Покажу на цифрах, они условные. Приход 100 единиц по 50 ₽, затем приход 100 единиц по 60 ₽, потом списание на объект 120 единиц. FIFO возьмёт 100 по 50 и 20 по 60: 5 000 + 1 200 = 6 200 ₽, остаток 80 единиц по 60 ₽ стоит 4 800 ₽. Moving Average посчитает среднюю (100 × 50 + 100 × 60) / 200 = 55 ₽: списание 120 × 55 = 6 600 ₽, остаток 80 × 55 = 4 400 ₽. В сумме и там, и там 11 000 ₽. Разный результат, оба метода допустимы. | Показатель | FIFO | Moving Average | |---|---|---| | Цена списания 120 ед. | 6 200 ₽ | 6 600 ₽ | | Стоимость остатка 80 ед. | 4 800 ₽ | 4 400 ₽ | | Всего | 11 000 ₽ | 11 000 ₽ |
Эти числа сверены по логике примера из документации ERPNext: там 10 единиц по 100 и 20 по 120 с продажей 15 единиц дают 1 600 при FIFO и 1 700 при скользящей средней. О LIFO в документации по сравнению методов речи нет, и для российской бухгалтерской оценки он, насколько мне известно, не применяется: уточните у бухгалтера и не выбирайте его «на всякий случай».
Как цена закупки превращается в себестоимость материала на объекте: путь через Stock Ledger
Цена закупки становится себестоимостью в момент складских проводок: поступление пишет в Stock Ledger Entry количество и стоимость, а списание на объект берёт стоимость по выбранному методу. Stock Ledger Entry это журнал движений по каждой позиции и складу; из него строятся остатки и отчёты Stock Ledger и Stock Balance.
Для подрядчика важная деталь: списание материала на объект (Material Issue) относит стоимость на расходы, а Project служит аналитикой. В карточке Project ERPNext v15 копит два разных показателя: Total Purchase Cost (по закупочным счетам с указанным проектом) и Total Consumed Material Cost (по складским списаниям на проект по оценке склада). Это два разных пути расчёта, поэтому суммы в отчётах по проекту и в остатках на складе могут не совпадать, пока вы не договорились, какой из них главный для руководителя.
Что влияет на цену на входе: курс, доставка, скидки поставщика. Доставка, которая оплачена отдельным счётом перевозчика, в стоимость материала попадает не сама по себе, а через механизм Landed Cost: без него щебень на объекте кажется дешевле, чем он есть. Я не буду разбирать его здесь, тема отдельная, а в плане статей по ERPNext для неё есть своя.
Практический вывод: метод оценки влияет на то, сколько «стоит» материал на конкретном объекте. При FIFO объект, который взял материал первым, получает старую цену, а следующий новую. При скользящей средней цена для всех объектов одинакова на данный момент. Для прибыльности по объекту это принципиально, потому что один и тот же щебень даёт разную маржу в зависимости от того, кто его списал первым.
Какой метод выбрать подрядчику: когда цены на металл и сухие смеси прыгают
Для большинства материалов подрядчика я выбираю Moving Average. Закупки частые, цены прыгают, партии смешиваются на складе и физически не различаются: щебень из одной кучи, арматура с разных поставок лежит вместе. Скользящая средняя сглаживает скачки, проще объясняется бухгалтеру и меньше зависит от порядка проводок.
FIFO я оставляю там, где партии физически различимы и цена партии важна: оборудование с серийными номерами, дорогая спецтехника, материалы, закупленные под конкретный договор. Там привязка стоимости к конкретной поставке полезна. Но FIFO болезненнее реагирует на проводки задним числом: порядок прихода и расхода определяет итог, и любая корректировка пересчитывает цепочку.
Если цены на металл и сухие смеси растут быстро, на FIFO вы будете списывать на объект старую дешёвую цену, а на склад покупать по новой. Отчёт по объекту будет выглядеть прибыльнее, чем реально, а денег на закупку следующей партии не хватит. Скользящая средняя ближе к текущему уровню цен. Это не вопрос «правильного» метода, а вопрос того, какую картину вы хотите видеть руководителю.
Одно ограничение: не смешивайте методы внутри одной группы материалов без нужды. Сравнение объектов тогда становится неполным, а объяснять разницу придётся вручную. Договоритесь с бухгалтером о правиле по группам до загрузки остатков.
Что пересчитывает Repost Item Valuation и почему проводка задним числом опасна
Repost Item Valuation это фоновый документ, который пересчитывает записи Stock Ledger с определённой даты: заново считает текущий остаток и стоимость склада и обновляет оценку по методу позиции. ERPNext создаёт такие документы сам, когда сохраняется проводка задним числом, а вручную их создают по компании, номенклатуре, складу и дате начала. Документация предупреждает, что пересчёт затрагивает историю, и советует ограничивать его по позиции, складу и дате и запускать вне рабочих часов.
Проводка задним числом опасна тем, что она меняет всю цепочку последующих движений. Вы провели приход от 15-го числа 3-го числа следующего месяца: система должна пересчитать каждое списание после 15-го, а значит, поменять себестоимость объектов и проводки в главной книге. В Stock Reposting Settings документация прямо рекомендует не проводить задним числом глубже одного месяца: пересчёт ограничен временем (упоминается лимит в 1500 секунд), а окно, в которое разрешён пересчёт, можно сузить настройкой Limit timeslot for Stock Reposting. Сочетание глубоких дат и узкого окна даёт сбои и зависшие пересчёты.
Выход простой, и он организационный. Ввести правило: документы вносятся в день операции, старше трёх-пяти дней согласовывается с ответственным, старше месяца только вместе с бухгалтером. И закрыть старые даты настройкой Stock Frozen Up To в Stock Settings: документация по смене метода прямо называет её способом защитить предыдущие периоды от неожиданного пересчёта. Роль, которой разрешено править замороженное, задаётся там же. Проверяйте результат отчётами: Stock Ledger Variance Report показывает расхождения между текущим остатком в журнале и итоговым балансом склада. Исправления запускают кнопкой Create Reposting Entries. Поведение пересчёта между v15 и v16 может отличаться, поэтому после обновления повторите проверку на своём стенде.
Когда система «тормозит» после большого пересчёта, это тоже обычно reposting: он занимает очередь фоновых задач. Тормоза из-за такой очереди я разбираю отдельно в материале про диагностику производительности, а здесь важен принцип: старые даты не трогаем без нужды.
Отрицательные остатки и заморозка периода: две настройки, которые портят оценку
Две настройки в Stock Settings влияют на оценку сильнее всего: Allow Negative Stock и Stock Frozen Up To. Первая разрешает списывать больше, чем есть на складе. Вторая блокирует проводки на старые даты. Сочетание «минус разрешён, период не заморожен» — самый частый источник странной себестоимости.
Отрицательные остатки удобны, когда кладовщик не успевает оформить приход до выдачи со склада, особенно в конце месяца. Но они ломают расчёт: пока остатка нет, системе неоткуда взять цену для списания, и она берёт оценочную. Когда приход потом оформляют, система вынуждена пересчитать все списания в минус. Для партий в v15 есть отдельный флажок Allow Negative Stock for Batch, и в его описании прямо сказано, что он может давать неверные ставки оценки. Я рекомендую не включать эту настройку и приучить склад оформлять приход вовремя.
Заморозка периода работает как замок на дверях закрытого месяца. Дата в Stock Frozen Up To не даёт провести движение раньше неё, а роль из Role Allowed to Edit Frozen Stock может это обойти. Назначьте эту роль одному человеку, а не всему складу, и после каждого закрытого периода двигайте дату вперёд. | Настройка | Что делает | Риск при неверном значении | |---|---|---| | Allow Negative Stock | разрешает минус на складе | себестоимость списаний пересчитывается позже | | Stock Frozen Up To | запрещает проводки на старые даты | без неё задним числом правят закрытые периоды | | Роль для правки замороженного | разрешает исключения | при широком круге владельцев роли замок бесполезен |
Если после включения минуса или проводок задним числом вы увидели расхождения между отчётами по объекту и по складу, начинайте с Stock Ledger Variance Report и только потом правьте руками. Ручные правки журнала я не рекомендую никогда: поправленный вручную остаток хорошо выглядит неделю, а потом ломает очередной пересчёт.
Как «Асфальт-Регион Центр» выбирал метод оценки на 21 рабочее место
Условный пример, цифры вымышленные. Подрядчик по дорожным работам «Асфальт-Регион Центр» имеет 21 рабочее место: пять производителей работ, снабжение, два склада (базовый и объектный), ПТО, бухгалтерия. Основные материалы: щебень и песок, битумная эмульсия, арматура и сетка, расходники. До ERPNext себестоимость материала на объекте считали «по последней накладной», и объекты, стартовавшие в разное время, были несопоставимы.
Мы разбили номенклатуру на четыре группы и по каждой выбрали метод. Щебень и песок покупаются часто, цены прыгают, материал смешивается, значит, Moving Average. Битумная эмульсия закупается партиями под контракт, и цена партии важна для расчёта конкретного объекта: FIFO. Арматура и сетка: цены меняются быстро, партии неразличимы, Moving Average. Расходники: мелкие суммы, Moving Average без обсуждения. | Группа | Закупки | Разброс цен | Метод | Кто проверяет | |---|---|---|---|---| | Щебень, песок | частые | средний | Moving Average | снабженец | | Битумная эмульсия | под контракт | большой | FIFO | ПТО | | Арматура, сетка | частые | большой | Moving Average | снабженец | | Расходники | мелкие | малый | Moving Average | кладовщик |
Договорённости, которые помогли. Вернуться с Moving Average на FIFO после первых движений нельзя, поэтому группы утвердили до загрузки остатков. Документы вносят в день операции, а задним числом глубже трёх дней согласует главный инженер. Stock Frozen Up To сдвигают на последний день каждого закрытого месяца. Allow Negative Stock остаётся выключенным, а кладовщик отвечает за приход в день поставки.
Условный итог: расхождения между отчётом по объекту и остатком на складе в первый месяц были, но их искали по Stock Ledger Variance Report, а не руками. Что осталось нерешённым: доставка перевозчиком пока не попадает в стоимость материала, это отдельный этап проекта, и в расчёт прибыльности по объектам закладывается поправка вручную. Такие вещи нужно показывать заказчику сразу, а не после запуска.
Что сказать бухгалтеру: операционная оценка в ERPNext и регламентированный учёт в 1С
Бухгалтеру нужно сказать прямо: оценка запасов в ERPNext операционная, для управления объектами и закупками, а регламентированная остаётся в 1С. Метод, выбранный в ERPNext, не обязан совпадать с учётной политикой в 1С, но расхождение надо знать и объяснять, иначе в конце квартала управленческая и бухгалтерская себестоимости разойдутся без видимой причины.
Что я предлагаю согласовать письменно. Во-первых, какой метод у каких групп в ERPNext и почему. Во-вторых, какой метод закреплён в учётной политике в 1С и как он отличается. В-третьих, как часто сверяются остатки в количестве и в сумме и кто отвечает за расхождения. В-четвёртых, что считается закрытым периодом и кто имеет право его открыть.
Обмен между системами при этом идёт по документам: приходы и реализации передаются из ERPNext в 1С после согласования, а данные о себестоимости остаются в системе, где они считаются. Прямая запись в базу 1С запрещена, обмен ведётся через HTTP-сервисы или REST/OData. О выборе системы учёта и о том, как делить зоны, я писал в материале про выбор системы учёта на Linux.
Для подрядчиков, которые хотят посмотреть склад и закупки в работе, мы показываем ERPNext под ключ на демостенде по запросу, и пример с FIFO и скользящей средней можно воспроизвести за десять минут. Общий разбор возможностей системы для производственных задач есть в обзоре ERPNext для производства, а про учёт на складе с терминалом сбора данных пригодится материал про ТСД на складе и интеграцию с 1С.
Частые вопросы
Какой метод оценки запасов лучше выбрать в ERPNext для стройки?
Для материалов с частыми закупками по разным ценам, которые смешиваются на складе, я обычно беру Moving Average: себестоимость пересчитывается при каждом поступлении, учёт проще. FIFO оставляю для партий, где цена конкретной поставки важна. Метод решают до загрузки остатков, а не после первых движений.
Можно ли поменять метод оценки после того, как появились проводки?
По документации ERPNext, для позиций с движениями можно перейти с FIFO на Moving Average, а обратно нельзя. Смена применяется к последующим списаниям, а проводка задним числом пересчитает всё, что идёт после неё. Менять метод стоит на копии базы и вместе с бухгалтером.
Что такое Repost Item Valuation в ERPNext?
Фоновый документ, который пересчитывает записи журнала склада с определённой даты и обновляет оценку по методу позиции. Создаётся автоматически при проводке задним числом, вручную задаётся по компании, позиции, складу и дате начала. Тяжёлые пересчёты лучше запускать вне рабочих часов и ограничивать по складу.
Почему в ERPNext не рекомендуют проводить документы задним числом больше чем на месяц?
Документация Stock Reposting Settings советует ограничивать проводки задним числом одним месяцем: пересчёт идёт по всей цепочке последующих движений и может упереться в лимит времени (1500 секунд) или узкое окно пересчёта. Для запрета старых дат используют Stock Frozen Up To в Stock Settings.
Что делать, если остаток ушёл в минус?
Allow Negative Stock ломает корректную оценку: списание идёт по оценочной цене, а потом пересчитывается. Для партий в v15 есть отдельный флажок Allow Negative Stock for Batch, его тоже лучше держать выключенным. Лучше не включать настройку, вовремя оформлять приход, а расхождения искать отчётом Stock Ledger Variance Report.
Источники
- Документация ERPNext: расчёт Valuation Rate при FIFO и Moving Average — Проверено: формулы и пример (10 по 100 и 20 по 120, списание 15: 1 600 против 1 700), LIFO в сравнении не упоминается. https://docs.frappe.io/erpnext/user/manual/en/calculation-of-valuation-rate-in-fifo-and-moving-average
- Документация ERPNext: Change Valuation Method — Проверено: для позиций с движениями допустима смена FIFO на Moving Average, обратная не допускается; проводка задним числом переоценивает последующие операции; защита через Stock Frozen Up To. https://docs.frappe.io/erpnext/change-valuation-method
- Документация ERPNext: Repost Item Valuation — Проверено: создаётся автоматически при проводках задним числом, ручные фильтры Company/Item/Warehouse/Posting Date, предупреждения о закрытых годах и нагрузке. https://docs.frappe.io/erpnext/user/manual/en/repost-item-valuation
- Документация ERPNext: Stock Reposting Settings — Проверено: Limit timeslot for Stock Reposting, рекомендация не проводить задним числом глубже месяца, лимит 1500 секунд. https://docs.frappe.io/erpnext/user/manual/en/stock-reposting-settings
- Документация ERPNext: Stock Settings — Проверено: Default Valuation Method (FIFO, LIFO, Moving Average), Allow Negative Stock; в коде v15 также Allow Negative Stock for Batch, Stock Frozen Upto, роль для правки замороженного. https://docs.frappe.io/erpnext/user/manual/en/stock-settings



