Складской учёт в ERPNext для торговли стройматериалами: номенклатура, партии, FEFO и штрихкоды
Склад в ERPNext начинается с трёх справочников: номенклатура Item, дерево складов Warehouse и единицы измерения. Партии со сроком годности включаются в карточке товара, а отгрузка по FEFO задаётся порядком подбора по сроку. Штрихкоды сканируются в строках документов. Ниже настройки по шагам и ограничения версий.
С чего начинается склад в ERPNext: Item, Warehouse и Maintain Stock
Складской учёт ERPNext опирается на два справочника, и ошибки в них потом исправлять дороже всего. Первый — Item, номенклатура. Второй — Warehouse, склады, организованные деревом. Перед первым приходом нужны ещё компания, план счетов и единицы измерения. Если вы планируете вести склад в рамках внедрения ERPNext под ключ, эту подготовку мы делаем в первую неделю, потому что документы прихода без неё просто не проведутся.
В карточке товара главный флажок называется Maintain Stock. Он включает количественный учёт: остатки, резервы, движения. Для услуг и работ его снимают: тогда списание фиксируется только в финансовых проводках, а склад про них ничего не знает. Для торговли стройматериалами это обычно путаница номер один: доставка, разгрузка, подъём на этаж заведены как номенклатура, и кто-то пытается приходовать «доставку» на склад. Услуги я завожу отдельной группой и сразу снимаю флажок.
Склады строятся деревом. Для торговой компании я делаю верхний уровень «Склады», под ним основной склад, склад брака и транзитный склад, а при необходимости торговые точки. При непрерывном учёте запасов (Perpetual Inventory) каждый склад принадлежит компании и привязан к счёту учёта запасов, и этот момент нужно согласовать с бухгалтером до первого прихода. Метод оценки по умолчанию (FIFO, Moving Average или LIFO) задаётся в Stock Settings, а для отдельной позиции его можно переопределить в карточке товара. Решение принимают до первого прихода: менять метод на живых данных рискованно.
Порядок настройки, который я использую, выглядит так. Сначала компания и план счетов. Потом дерево складов. Затем группы номенклатуры и сама номенклатура с единицами измерения, налоговыми шаблонами и штрихкодами. Последними заводятся партии и серийные номера, потому что они возникают из документов прихода, а не создаются вручную заранее. И только после этого загружаются остатки на дату старта. История движений прошлых лет не переносится: достаточно закрывающего остатка, иначе вы получите чистку на недели без пользы для работы.
- Maintain Stock снят для услуг и работ
- Склад привязан к компании и счёту запасов
- Метод оценки выбран до первого прихода
- Остатки загружены на дату старта, без истории
Единицы измерения: закупка коробками, учёт поштучно
В стройматериалах одна и та же позиция живёт в трёх единицах. Поставщик продаёт паллетами, вы принимаете мешками, клиент покупает килограммами или квадратными метрами. ERPNext решает это таблицей единиц в карточке товара (UOM Conversion Detail): вы указываете коэффициент пересчёта, например, один паллет равен 48 мешкам. В заказе поставщику можно выбрать паллеты, а складской регистр останется в мешках. Это экономит ручной пересчёт и главное, убирает ошибки при вводе.
Две подводные вещи. Первая: если коэффициент нецелый или поставщик «округляет» упаковку, остаток получается дробным. Для таких случаев в Stock Settings есть флажки Allow to Edit Stock UOM Qty отдельно для документов продаж и закупок: они разрешают править количество в складской единице вручную. Я её включаю точечно, а не по умолчанию, чтобы не приучать кладовщиков править количество «на глаз». Вторая: есть известная ловушка контроля бюджета на заявке, когда позиция заказывается в альтернативной единице с коэффициентом не 1:1. Поэтому позиции с пересчётом я отдельно прогоняю в тестовом сценарии.
Какие позиции требуют пересчёта в торговле стройматериалами, по моему опыту. Сухие смеси: поддон, мешок, килограмм. Кабель и профиль: бухта или хлыст, метр. Листовые материалы: пачка, лист, квадратный метр. Крепёж: коробка, упаковка, штука. Для каждой позиции лучше один раз договориться, в чём ведётся остаток, и не менять это после запуска. Хранить остаток в самой мелкой единице проще и надёжнее: крупные единицы получаются из неё делением. | Позиция | Закупка | Учёт на складе | Продажа | |---|---|---|---| | Сухая смесь | паллет | мешок | мешок | | Кабель | бухта | метр | метр | | Гипсокартон | пачка | лист | лист | | Крепёж | коробка | штука | штука или упаковка |
Что стоит записать в регламент: кто имеет право менять коэффициент пересчёта, и что делать, если поставщик сменил упаковку. Ответ второй: завести новую позицию или новую единицу, а старые движения не переписывать. Иначе остатки прошлых периодов потеряют смысл, а система не умеет откатывать ошибочный коэффициент задним числом без пересчёта.
Партии и сроки годности: как включить Batch и отгружать по FEFO
Партионный учёт нужен там, где у товара есть срок годности или происхождение партии влияет на качество: сухие строительные смеси, клеи, герметики, краски. В карточке номенклатуры включается флажок Has Batch No. Если нужны сроки, добавляется Has Expiry Date и срок хранения в днях (Shelf Life In Days). Есть и удобный флажок Automatically Create New Batch, и он создаёт партию автоматически при оприходовании. В Stock Settings на вкладке Serial & Batch Item задаётся, как система подбирает и резервирует партии и показывать ли прямые поля партии в строках документов (Use Serial / Batch Fields).
После включения каждая складская операция по такой позиции требует указать партию. Система фильтрует список по товару, складу, сроку годности и доступному количеству, так что нельзя случайно выбрать партию, которой нет на складе или срок которой истёк. Партию можно перемещать между складами и дробить. А теперь самое интересное: порядок, в котором система подбирает партии при отгрузке.
FEFO, «первым уходит то, что раньше истечёт», в ERPNext настраивается в Stock Settings полем Pick Serial / Batch Based On. У него три значения: FIFO, LIFO и Expiry. Именно Expiry реализует FEFO: при создании складских документов на расход система сама подбирает партии с ближайшим сроком годности. В обзорах эту функцию называют стратегией FEFO, но в интерфейсе ищите именно это поле. Настройка работает при автоматическом формировании пакетов серий и партий, и порядок подбора лучше проверить на тестовой отгрузке, а не доверять названию.
Покажу, как это читается на практике, на условных числах. | Партия | До истечения срока | Остаток, мешков | Что произойдёт при заказе на 10 мешков | |---|---|---|---| | A | 15 дней | 6 | уйдёт целиком | | B | 40 дней | 20 | уйдёт 4 мешка | | C | 90 дней | 50 | не затрагивается | Партию A, у которой осталось меньше месяца, мы видим красным ещё до отгрузки, и можно решить: продать со скидкой или отдать большому клиенту. Для корректировки остатков по партиям используется Stock Reconciliation: документ с загрузкой шаблона, и я подробнее разбираю его в статье про инвентаризацию. Любые заявления вроде «стопроцентное соблюдение FEFO» без замера не принимайте, сверяйте результат отчётом по партиям.
Серийные номера и Serial and Batch Bundle: что изменилось в новых версиях
Серийные номера нужны для штучного контроля: электроинструмент, измерительные приборы, оборудование. Включаются флажком Has Serial No в карточке. Серийный номер в v15 уникален во всей базе: имя документа Serial No совпадает с самим номером. Поэтому у двух разных позиций не может быть одинакового номера, и при импорте заводских номеров разных производителей совпадения нужно ловить заранее, например добавляя префикс. Для торговли стройматериалами серийный учёт чаще нужен для дорогого инструмента, который сдаётся в прокат или идёт по гарантии, а для расходников он избыточен.
Начиная с версии 15, партии и серийные номера в складских документах оформляются через Serial and Batch Bundle: отдельный документ, который хранит перечень номеров и партий, связанных со строкой. Документация по Stock Reconciliation отдельно отмечает поддержку этих пакетов в версии 15 и выше. В настройках есть и поле Use Serial / Batch Fields, оно возвращает прямой ввод номеров и партий в строку документа без пакетов. Что выбрать, зависит от команды: пакеты строже и надёжнее, прямые поля проще для кладовщика. Я пробую оба варианта на тестовом сайте и показываю кладовщику, потому что ему с этим работать.
Отрицательные остатки. Allow Negative Stock можно включить, но он ломает корректную работу FIFO и скользящей средней: система не может честно посчитать себестоимость товара, которого физически нет. Для партионных позиций отрицательные остатки по умолчанию запрещены даже при включённом Allow Negative Stock; в свежих сборках v15 появился отдельный флажок Allow Negative Stock for Batch, но я его не включаю. Для торговли это означает дисциплину: сначала оприходовать товар, потом отгружать. Если кладовщик не успел оформить приход, а покупатель уже ждёт, правильный выход — быстро оформить приход, а не включать отрицательные остатки.
Есть и версионная ловушка. Если у вас серийные номера созданы до версии 15, пересчёт оценки может давать неверную ставку: в документации Stock Reposting Settings описана опция, которая заставляет брать ставку из реальных приходных операций, а не из записи серийного номера. Выглядит мелочью, но при миграции со старой версии она влияет на себестоимость. Если вы обновляетесь с версии 14, заложите тест на нескольких серийных позициях до переключения.
Штрихкоды: сканирование в строках документа и массовая проверка
К карточке товара штрихкоды привязываются таблицей Barcodes: у одной позиции может быть несколько кодов, например, заводской и внутренний. В таблице строк документа (приход, расход, перемещение, инвентаризация) работает сканирование: сканер вводит код, система находит позицию и добавляет строку. Документация по Stock Reconciliation прямо называет сканирование штрихкодов одним из способов набора позиций, где каждое считывание увеличивает количество. Поле штрихкода в складских документах включается флажком Show Barcode Field in Stock Transactions в Stock Settings.
Правила контроля. Система не даст привязать штрихкод, который уже закреплён за другой позицией: это защита от самой частой ошибки при импорте. Массовая проверка и правка штрихкодов делается через Data Import в режиме Update: выгружаете справочник, правите в таблице, загружаете обратно. Для торговой компании это основной способ завести тысячи кодов, а не вводить их вручную.
Что оборудование делает, а что ERPNext. Кладовщик с обычным USB-сканером работает так же, как с клавиатурой: код попадает в активное поле. Терминалы сбора данных, этикетки и печать штрихкодов на ценниках требуют дополнительных настроек или интеграций. Если вам нужен ТСД с полноценным обменом и 1С, сравните подходы с материалом про ТСД на складе и интеграцию с 1С: там схема другая, но вопросы оборудования те же.
Практический совет по этикеткам. Если у поставщика штрихкоды на упаковке есть, используйте их и внесите в справочник при первом приходе. Если нет, придётся клеить свои, и тогда продумайте, где именно напечатаны коды, чтобы их можно было сканировать из любой позиции на стеллаже. Этикетка, которую не получается прочитать, превращает автоматизацию в ручной ввод.
Разбор: «Штукатур и Сын» разводит остатки сухих смесей по партиям
Условный пример: компания «Штукатур и Сын», девятнадцать рабочих мест, торгует отделочными материалами и сухими смесями. Названия и числа придуманы для иллюстрации. Основной склад, небольшой склад для брака и транзитный склад для поставок между точками. Проблема до внедрения: у сухих смесей и клеёв есть срок годности, но остаток по партиям в таблицах не вёлся, и просроченные мешки обнаруживались при инвентаризации.
Что сделано. В карточках позиций включены партии и сроки годности, автоматическое создание партии при приходе, порядок подбора Expiry в Stock Settings. Остатки на дату старта загружены с партиями через Stock Reconciliation. Кладовщик при приходе вносит срок годности, а при отгрузке видит предложенную партию. Для штрихкодов использованы заводские коды, которые внесены в справочник при первой поставке. Услуги доставки и разгрузки заведены отдельной группой со снятым Maintain Stock.
Что получилось в работе. Менеджер при оформлении расхода видит партию и срок и может предложить покупателю то, что скоро истечёт. Отчёт по остаткам партий показывает позиции с короткими сроками. Разделённые партии не создают путаницы, потому что движение между складами оформляется перемещением. Чего пример не показывает, так это процента «снижения потерь»: цифры вроде «потери упали на столько-то» без замера до и после я не привожу.
Что осталось на ручной работе. Ввод срока годности при приходе: система не угадает его по упаковке. Решение о скидке на партию с коротким сроком: ERPNext покажет проблему, но не примет за вас коммерческое решение. Сверка остатков с физическим пересчётом: её проводят документом Stock Reconciliation раз в квартал или чаще, подробнее в нашем материале про склад в других системах и в статье про инвентаризацию ERPNext.
Какие ограничения склада стоит знать до запуска
Первое ограничение — версии. Серийные номера и партии в версии 15 и новее работают через Serial and Batch Bundle, а в более старых иначе. Документацию нужно читать для своей ветки, и ряд обзоров в интернете описывает старый механизм. Если вы переносите данные со старой установки, проверьте серийные позиции отдельно. Если ставите новую установку, берите актуальную версию и настройки из её документации.
Второе: ERPNext — не WMS. Адресного хранения на уровне ячеек, волновой комплектации и маршрутов отбора по складу в коробке нет, это либо доработка, либо отдельная система. Для компании с одним-двумя складами и несколькими тысячами позиций этого хватает с запасом. Для распределительного центра с десятками тысяч позиций я бы рассматривал специализированное решение. Сравнивать системы по масштабу склада можно в обзоре систем учёта на Linux.
Третье: бухгалтерия. Складские проводки ERPNext формирует по своей логике, а российский регламентированный учёт остаётся в 1С. Складские документы ERPNext не заменяют накладные в формате, который требует ваш контрагент или налоговая, и печатные формы вроде ТОРГ-12 нужно настраивать отдельно. Если ваш бухгалтер не готов принимать операционные данные из ERPNext, склад придётся вести в 1С. Для микропредприятий есть и более лёгкий путь, он разобран в материале про учёт для микробизнеса.
Четвёртое: производительность. Пересчёт оценки запасов при проведении документов задним числом создаёт нагрузку, а в рабочие часы может приводить к блокировкам. Ограничение времени пересчёта внепиковыми часами настраивается в Stock Reposting Settings, а проведение документов далеко задним числом лучше ограничить регламентом. Для компании на девятнадцать мест этого достаточно, но ограничения стоит заложить в регламент: «приходы вносим в день поставки».
Частые вопросы
Как включить партионный учёт в ERPNext?
В карточке номенклатуры включается Has Batch No, для сроков годности добавляется Has Expiry Date и срок хранения в днях. Флажок Automatically Create New Batch создаёт партию при приходе. После этого поступление и отгрузка идут с номером партии, а настройку лучше проверить на тестовом документе.
Как настроить отгрузку по FEFO?
В Stock Settings есть поле Pick Serial / Batch Based On со значениями FIFO, LIFO и Expiry. Значение Expiry подбирает партию с ближайшим сроком годности при автоматическом формировании пакета на расход. Сроки годности должны быть заполнены при приходе, иначе подбирать нечего.
Что делать, если закупаем коробками, а списываем штуками?
В карточке товара задаётся таблица единиц с коэффициентом пересчёта, например одна коробка равна двенадцати штукам. В заказе поставщику указывают коробки, а складской регистр ведётся в штуках. Если коэффициент неточный, ручная правка количества в складской единице включается флажками Allow to Edit Stock UOM Qty в Stock Settings.
Можно ли работать со штрихкодами без доработки?
Да: у товара есть таблица Barcodes, а строки документов поддерживают сканирование. Массовая проверка и правка кодов идёт через Data Import в режиме Update. Система не даст привязать код, который уже закреплён за другой позицией. Терминалы и печать этикеток настраиваются отдельно.
Разрешены ли отрицательные остатки в ERPNext?
Allow Negative Stock включить можно, но он мешает корректной работе FIFO и скользящей средней. Для партионных позиций минус по умолчанию запрещён даже при включённом Allow Negative Stock (отдельный флажок Allow Negative Stock for Batch есть в свежих сборках v15). Правильный путь: сначала оформить приход, потом отгружать.
Как отражать услуги и работы в номенклатуре без остатка?
У услуги в карточке снимается флажок Maintain Stock. Количественный учёт не ведётся, а затраты и выручка отражаются в финансовых проводках. Услуги удобно держать в отдельной группе номенклатуры, чтобы их не путали с товаром при приходе.
Источники
- frappe/erpnext (ветка version-15) — Item — Поля Maintain Stock, Has Batch No, Automatically Create New Batch, Has Expiry Date, Shelf Life In Days, Has Serial No, Barcodes, UOMs; проверено 01.10.2026: https://github.com/frappe/erpnext/blob/version-15/erpnext/stock/doctype/item/item.json
- frappe/erpnext (ветка version-15) — Stock Settings — Pick Serial / Batch Based On (FIFO, LIFO, Expiry), Use Serial / Batch Fields, Allow Negative Stock, Allow Negative Stock for Batch, Show Barcode Field in Stock Transactions, Allow to Edit Stock UOM Qty; проверено 01.10.2026: https://github.com/frappe/erpnext/blob/version-15/erpnext/stock/doctype/stock_settings/stock_settings.json
- ERPNext Docs — Batch — Has Batch No, автоматическое создание партий, фильтр партий по сроку и остатку; проверено 01.10.2026: https://docs.frappe.io/erpnext/batch
- ERPNext Docs — Stock Reconciliation — Сканирование штрихкодов, поддержка Serial and Batch Bundle с версии 15; проверено 01.10.2026: https://docs.frappe.io/erpnext/stock-reconciliation
- ERPNext Docs — Stock Reposting Settings — Ограничение времени пересчёта, особенность серийных номеров, созданных до версии 15; проверено 01.10.2026: https://docs.frappe.io/erpnext/stock-reposting-settings
- frappe/erpnext (ветка version-15) — Serial No и Item Barcode — Проверено 01.10.2026: autoname field:serial_no и unique у serial_no (номер уникален во всей базе), unique у barcode в Item Barcode. https://github.com/frappe/erpnext/blob/version-15/erpnext/stock/doctype/serial_no/serial_no.json
