大家好,我是十三。
上一篇文章我们聊了入库,四种场景下的库存增加。有进就有出,今天我们来聊出库。
入库讲究的是"验"——验数量、验质量、验单据。出库讲究的则是"时机"——什么时候扣库存,什么时候确认成本,什么时候放行货物。扣早了,可能导致超卖,客户下单后仓库却发不出货;扣晚了,可能导致重复发货,同一批货被两个订单同时锁定。时机不对,库存数据就会失真,财务账也会跟着乱。
这篇文章,我们就来拆解出库的完整逻辑。从业务场景到系统实现,从拣货策略到财务分录,一次性理清楚。
出库解决什么问题
业务定义:出库是指库存商品或原材料,因销售、生产、调拨或报废等原因,经审批后从仓库物理移出,并在系统中完成库存扣减和财务核算的全过程。
如果把企业的库存比作一个蓄水池,入库是注水,出库就是放水。但放水不是简单的"开闸",它涉及三个层面的问题:
- 物权转移的确认:货物离开仓库,所有权或控制权随之转移,需要明确的单据作为法律依据。
- 库存数据的准确性:系统库存必须与实际库存保持同步,否则销售看到的可售数量就是虚假的。
- 成本与费用的结转:库存资产减少的同时,对应的成本或费用需要及时确认,确保财务账实相符。
出库一旦出错,后果比入库更棘手。入库错误可以退货或索赔,出库错误则意味着货已经离开仓库,追回的成本极高。
出库的通用流程
无论哪种出库场景,底层流程都遵循同一套骨架。差异主要体现在"谁发起的申请"和"最终的成本去向"。
graph TD
A[出库申请] --> B[审批]
B --> C[拣货]
C --> D[复核]
D --> E{是否通过}
E -- 是 --> F[出库确认]
E -- 否 --> G[异常处理]
F --> H[库存扣减]
H --> I[财务记账]
流程拆解:
- 出库申请:由业务部门在系统中创建出库单,明确出库原因、物料、数量和目标。这是整个流程的起点,也是责任归属的依据。
- 审批:根据企业内控要求,出库单可能需要仓管主管或财务审批。金额越大、越敏感的物料,审批层级越多。
- 拣货:仓管根据出库单到指定库位取货。拣货策略直接影响效率和准确率,后文会详细展开。
- 复核:对拣出的货物进行二次核对,确保品名、规格、数量与出库单一致。这是防止发错货的最后一道防线。
- 出库确认:复核通过后,在系统中确认出库。此时货物正式离开仓库,库存数量开始变化。
- 库存扣减:系统根据出库确认,扣减对应 SKU 的库存数量。扣减时机是"预扣"还是"实扣",直接影响库存可用性。
- 财务记账:库存资产减少,同时根据出库场景生成对应的会计凭证。销售出库结转成本,生产领料计入生产成本。
四种出库场景拆解
场景一:销售出库
业务定义:仓库根据已确认的销售订单,将商品拣货、包装、发运给客户的过程。它是 O2C 流程中物权转移的关键节点,标志着商品控制权从企业转移到客户。
触发条件:销售订单已通过信用检查并确认,客户付款条件已满足(或账期已审批)。
核心数据:
| 字段 | 说明 | 示例 |
|---|---|---|
| 关联销售订单号 | 出库对应哪个 SO | SO-20260420-001 |
| 客户信息 | 货物发给谁 | XX 科技有限公司 |
| 商品明细 | 具体发了什么 | 阿里云 ECS g6.large × 10 台 |
| 出库数量 | 实际发出多少 | 10 台 |
| 物流信息 | 如何运输 | 顺丰快递,单号 SF1234567890 |
关于销售出库的完整流程和成本结转逻辑,我在第 10 篇文章《业财通识10:当货物发出,系统里发生了什么?》中有详细展开。本文重点在于把销售出库放在"出库全景"中,理解它与其他出库场景的差异。
场景二:生产领料
业务定义:生产车间根据生产工单和 BOM(物料清单),从仓库领取原材料或半成品的过程。它标志着库存商品从"待售资产"转变为"生产成本"。
触发条件:生产工单已下达,MRP(物料需求计划)已运算,确认所需物料的可用性。
通俗理解:BOM 就像一道菜的配方。要做 100 份红烧肉,BOM 会告诉你需要多少猪肉、多少酱油、多少冰糖。生产领料就是厨师拿着配方去仓库取料。
核心数据:
| 字段 | 说明 | 示例 |
|---|---|---|
| 关联生产工单号 | 为哪张工单领料 | MO-20260421-003 |
| BOM 版本 | 使用哪个配方 | BOM-V2.3 |
| 领料人 | 谁去仓库取料 | 车间-张三 |
| 物料明细 | 具体领了什么 | 猪肉 50 kg,酱油 10 L |
| 领用数量 | 实际领了多少 | 按 BOM 比例计算 |
生产领料的特别之处在于,它往往不是一次性完成的。一个生产周期可能持续数天,物料会分批领用。系统需要支持"多次领料、一次完工"的模式,并实时更新工单的材料消耗进度。
另一个常见问题是超领。实际生产中,BOM 是理论值,现场可能会有损耗或工艺调整。超领需要走审批流程,否则生产成本会失控。部分系统允许设置"超领比例",比如允许超出 BOM 5% 的损耗,超出部分自动触发审批。
场景三:报废出库
业务定义:对质检不合格、过期、损坏或不再使用的库存商品,经审批后从仓库移出并核销的过程。它标志着库存资产从"可用"变为"损失"。
触发条件:质检判定不合格,库存盘点发现过期或损坏,或设备维护产生废料。
核心数据:
| 字段 | 说明 | 示例 |
|---|---|---|
| 关联单据 | 由什么触发报废 | 质检单 QI-20260422-005 |
| 报废原因 | 为什么报废 | 质检不合格 / 过期 / 损坏 |
| 审批人 | 谁批准了报废 | 质量主管-李四 |
| 物料明细 | 报废了什么 | 某批次原材料 20 kg |
| 报废数量 | 报废多少 | 20 kg |
报废出库是内控的重点。因为报废意味着资产直接变成损失,容易被利用来做虚假出库、转移库存。所以报废流程通常需要质量部门和财务部门双重审批,并保留完整的追溯记录。
报废后的实物处理也需要关注。有些废料可以回收变卖(如金属边角料),变卖收入要冲减报废损失;有些则需要委托专业机构处理(如危废),处理费用要计入报废成本。系统需要区分"报废损失"和"废料收入",不能简单的一刀切。
场景四:调拨出库
业务定义:货物从一个仓库(源仓库)调往另一个仓库(目标仓库)时,源仓库执行的出库操作。货物并未离开企业,只是位置发生了转移。
触发条件:调拨单已审批,目标仓库已确认接收能力,物流路径已安排。
核心数据:
| 字段 | 说明 | 示例 |
|---|---|---|
| 关联调拨单号 | 哪张调拨单 | TF-20260423-007 |
| 源仓库 | 从哪调出 | 上海仓 |
| 目标仓库 | 调往哪 | 北京仓 |
| 物料明细 | 调拨什么 | 某 SKU 100 件 |
| 调拨数量 | 调拨多少 | 100 件 |
调拨出库的特别之处在于,它不会立即触发成本结转。货物只是从 A 仓移到 B 仓,企业的总库存资产不变。但当调拨涉及跨区域运输时,货物会进入"在途"状态。关于在途状态的管理逻辑,我在第 6 篇文章《业财通识06:什么是采购在途?它对库存预测的价值》中有详细讲解。调拨在途与采购在途的管理思路是相通的。
调拨还有一个容易被忽视的细节:在途丢失。货物在运输途中可能发生损坏或丢失。此时目标仓库实际收到的数量会少于出库数量,系统需要支持"差异处理"——要么补发,要么按实际接收数量调整调拨单,丢失部分按报废或盘亏处理。
拣货与发运
出库流程中,最影响效率的环节往往不是系统操作,而是物理世界的拣货和发运。
拣货策略
仓库越大、SKU 越多,拣货路径的规划就越重要。常见的拣货策略有三种:
| 策略 | 核心逻辑 | 适用场景 | 代价 |
|---|---|---|---|
| 先进先出 | 先入库的先出库 | 有保质期要求的商品 | 需要严格按批次管理,系统复杂度上升 |
| 就近优先 | 距离拣货起点最近的库位优先 | 大件、重货,减少搬运距离 | 可能破坏 FIFO,导致旧货积压 |
| 批次拣货 | 同一批订单合并拣货 | 订单量大、SKU 重叠度高 | 需要二次分拣,增加分拣环节 |
波次拣货
在电商和大批量发货场景中,系统通常不会为每一张订单单独派人去拣货,而是将多个订单按照一定规则合并成"波次",统一拣货。
波次划分的常见维度:
- 按快递公司划分:同一快递公司的订单合并,方便统一交接。
- 按区域划分:同一配送区域的订单合并,优化装车顺序。
- 按时效划分:加急订单单独成波次,优先处理。
波次拣货的本质是用"批量处理"换"单件效率"。它的代价是牺牲了部分灵活性——一旦波次生成,其中的订单就很难再单独调整。
此外,拣货错误是仓库最常见的操作失误之一。发错 SKU、发错数量、甚至发错客户,都会带来退换货成本和客户满意度下降。复核环节的存在就是为了拦截这些错误。在一些高价值场景中,系统会引入"扫码复核"机制——每件货物出库前都要扫描条码,与出库单自动比对,不匹配的货物无法通过复核。
库存扣减逻辑:预扣还是实扣
库存扣减的时机选择,是出库系统设计的核心权衡。
预扣(Soft Reserve)
逻辑:销售订单确认时,系统先"锁定"一部分库存,物理货物还在仓库里,但这部分库存已经不能被其他订单使用了。
优点:防止超卖,确保客户下单时看到的库存是真实可交付的。
代价:如果订单取消或修改,需要释放预扣库存,增加了系统的复杂性。预扣时间过长,会导致库存周转率虚低。
实扣(Hard Deduct)
逻辑:只有在出库单确认、货物实际离开仓库时,才扣减库存。
优点:库存数据与物理库存完全一致,没有"锁定"状态的维护成本。
代价:从订单确认到实际出库之间存在时间窗口,如果多个订单同时竞争同一批库存,可能出现超卖。
通俗类比:预扣就像餐厅订位——你还没去,但座位已经留给你了。实扣就像现场排队——只有人到店、落座的那一刻,座位才真正被你占用。订位可以防止到店没座,但如果订了不来,餐厅就损失了翻台机会。
混合策略
大多数 ERP 系统采用混合策略:下单时预扣,出库时转为实扣。这样既防止超卖,又保证账实一致。
function processStockDeduction(outboundOrder) {
const sku = outboundOrder.sku;
const qty = outboundOrder.quantity;
const strategy = outboundOrder.deductStrategy;
if (strategy === 'pre') {
// 预扣:下单时锁定库存
const available = getPhysicalStock(sku) - getLockedStock(sku);
if (available < qty) {
throw new Error('库存不足,无法预扣');
}
lockStock(sku, qty);
} else if (strategy === 'actual') {
// 实扣:出库时扣减,若存在预扣则先释放再扣减
const locked = getLockedStock(sku);
if (locked >= qty) {
unlockStock(sku, qty);
}
reducePhysicalStock(sku, qty);
}
// 记录库存流水
saveInventoryLog({
sku: sku,
qty: qty,
type: strategy,
orderNo: outboundOrder.orderNo,
time: new Date()
});
}
实际业务中,预扣通常设有有效期。如果订单在规定时间内没有完成出库,系统自动释放预扣库存,供其他订单使用。
预扣有效期的设定是一个业务决策。有效期太短,客户还没付款库存就被释放了,可能导致超卖;有效期太长,库存被无效订单长期占用,降低了周转效率。电商大促期间,常见的策略是缩短预扣有效期至 15 分钟,未付款订单自动取消并释放库存。
出库的财务影响
出库不仅仅是库存数量的减少,它在财务层面会引发一连串的连锁反应。不同出库场景,财务处理截然不同。
销售出库:资产变成本
销售出库时,库存商品资产减少,同时确认销售成本(COGS)。需要特别注意的是,如果一笔销售订单分多次发货,成本结转也是分次进行的。每次出库只结转本次出库数量的成本,直到订单全部发完。
会计分录:
| 借/贷 | 科目 | 金额 | 说明 |
|---|---|---|---|
| 借 | 主营业务成本 | 20,000 元 | 确认销售成本 |
| 贷 | 库存商品 | 20,000 元 | 库存资产减少 |
这里使用的是商品的成本价,而不是销售价。成本价的确定依赖于成本计价方法(移动加权平均法、先进先出法等),第 10 篇文章中有详细说明。
生产领料:资产变在产品
生产领料时,原材料从库存转移到生产线,资产形态从"库存商品"变为"生产成本"。
会计分录:
| 借/贷 | 科目 | 金额 | 说明 | | :--- | :--- | :--- | | 借 | 生产成本 | 5,000 元 | 归集生产用料成本 | | 贷 | 原材料 | 5,000 元 | 原材料库存减少 |
这批成本会暂时挂在"生产成本"科目上,等产品完工入库时,再转入"库存商品"(如果是半成品或产成品)。
报废出库:资产变损失
报废出库时,库存资产直接变成损失,影响当期利润。
会计分录:
| 借/贷 | 科目 | 金额 | 说明 | | :--- | :--- | :--- | | 借 | 管理费用 / 营业外支出 | 2,000 元 | 确认报废损失 | | 贷 | 库存商品 / 原材料 | 2,000 元 | 库存资产减少 |
如果企业对存货计提了跌价准备,报废时还需要同步冲销对应的跌价准备。
调拨出库:资产换位置
调拨出库时,企业的总库存资产不变,只是仓库明细账发生变化。
会计分录:
| 借/贷 | 科目 | 金额 | 说明 | | :--- | :--- | :--- | | 借 | 库存商品——北京仓 | 10,000 元 | 目标仓库增加 | | 贷 | 库存商品——上海仓 | 10,000 元 | 源仓库减少 |
如果涉及运输费用,运费通常计入"管理费用"或单独归集到物流成本中。
出库决策表
把上述四种场景的核心差异汇总成一张决策表,方便在实际工作中快速判断:
| 出库场景 | 触发单据 | 扣减时机 | 财务处理 |
|---|---|---|---|
| 销售出库 | 销售订单 SO | 预扣 + 实扣 | 库存商品 → 主营业务成本 |
| 生产领料 | 生产工单 MO | 实扣为主 | 原材料 → 生产成本 |
| 报废出库 | 质检单 / 盘点单 | 实扣 | 库存商品 → 管理费用 |
| 调拨出库 | 调拨单 TF | 实扣 | 仓库 A → 仓库 B |
总结
出库是库存管理的"下半场"。如果说入库解决的是"货对不对"的问题,出库解决的就是"货什么时候给、给谁、怎么记账"的问题。
四个关键判断值得记住:
- 销售出库的核心是物权转移和成本结转,时机直接影响收入确认。
- 生产领料的核心是 BOM 驱动的需求转化,多次领料需要跟踪工单进度。
- 报废出库的核心是审批和追溯,防止资产流失。
- 调拨出库的核心是位置转移和在途管理,总资产不变但可用性在变化。
库存扣减的预扣与实扣之争,本质是"用户体验"与"数据准确性"之间的权衡。预扣防超卖,实扣保真实,混合策略是大多数系统的选择。
下一篇文章,我们将进入库存管理的最后一个核心环节:盘点。当账上的数字和仓库里的实物对不上时,系统该如何处理差异?敬请期待。
往期回顾
- 业财通识15:入库——四种场景下的库存增加
- 业财通识14:应收账款——从开票到回款的风险管控
- 业财通识13:价格策略——多维定价与动态调整
- 业财通识12:一个客户,为什么会有三条记录?——CRM 作为主数据底座的三层模型
- 业财通识11:从开票到收款,企业如何收回每一分钱?
- 业财通识10:当货物发出,系统里发生了什么?
- 业财通识09:订单确认前,系统如何防止坏账风险?
- 业财通识08:企业赚钱的第一步,从"潜在客户"到"销售合同"
- 业财通识07:业财难点之"暂估入账"与冲销
- 业财通识06:什么是采购在途?它对库存预测的价值
- 业财通识05:商品世界的基石——SPU 与 SKU
- 业财通识04:万事俱备,如何优雅地"打款"给供应商?
- 业财通识03:收到供应商账单,能直接付款吗?
- 业财通识02:当货物上门,系统里发生了什么?
- 业财通识01:企业花钱的第一步,从"购物清单"到"法律合同"
关于十三Tech
资深服务端研发工程师、架构师、AI 编程实践者。
专注分享真实的技术实践经验,持续记录企业系统、架构设计与 AI 编程实践。