☰
SAP库存调拨全解析:MB1B 311/313/315与转储订单MRP避坑
2026/10/31 8:12:54 网站建设 项目流程

简介:围绕SAP MM模块库存调拨与发货流程整理的docx文档,面向已具备一定SAP基础、需要理清转储场景与后台配置的MM顾问、关键用户及仓储业务人员。内容聚焦库存地间与工厂间调拨,覆盖MB1B下311一步转储、313/315二步转储与在途库存、301/303/305工厂间转储、309物料到物料、344/343物料状态转变,并延伸到MMBE、MB52、MB5T的库存查看方式及转储订单对MRP运算的影响。压缩包仅含1个docx文件,大小约2.25MB,便于集中查阅与打印学习。已有1522人学习,适合作为流程对照与配置排错时的参考。后台设置部分梳理了采购订单凭证类型分配、工厂装运数据、SD与MM两种实现路径及UB场景下是否生成出货单等要点,可帮助读者快速定位一步/二步转储差异,理解在途库存与收货凭证处理,并在实际项目中核对关键参数,减少因配置不当造成的库存与需求传递偏差。

1. 一次调拨,两个库存段:MB1B 311 为什么不是“改个地址”

库存调拨在 SAP 里从来不是一个动作,而是一族动作。很多人第一次用 MB1B 敲 311 从 A 库存地搬到 B 库存地,直觉上以为这是“改个地址”——总量不变,账面应该毫无波澜。跑完 MMBE 才发现系统同时动了两个库存段,还甩出一张带两个行项目的物料凭证。更反直觉的是 313:同样是从 A 调到 B,跑完之后 A 少了 10 个,B 一个没多,那 10 个既不在 A 也不在 B,而是躺在一个叫“在途库存”的地方,必须再补一笔 315 才落地。

移动类型只是这族动作的编号。真正决定行为的是背后那条账务链路——有没有中间状态、要不要挂转储订单、MRP 认不认这笔货。这三件事想通了,MB1B 就只剩一层皮。

2. 在途库存:313 发货之后,那 10 个到底记在哪一栏

2.1 311 的“一步”到底省掉了什么

311 的本质是:一张物料凭证、两个行项目、同一个数据库 LUW 内完成。第一行把 A 库存地的非限制使用库存减掉,第二行把 B 库存地的非限制使用库存加上,两行共享同一个凭证号MBLNR,只是ZEILE(行号)不同。因为在一个事务提交里,中间不存在“只有 A 减了、B 还没加”的可见状态——要么全成,要么全回滚。

这就是“一步”的全部含义。它不代表物理上更快,也不代表业务上更合理,它只保证账面原子性。真正的库存主数据落在MARD表里,每一行是“物料 + 工厂 + 库存地点”的组合,关键的几个数量字段直接对应 MMBE 里那几列:

MARD 字段含义MMBE 中的列
LABST非限制使用库存非限制使用
INSME质检库存质检
SPEME冻结库存冻结
UMLME调拨中/在途相关数量在途相关列

看一张 311 的凭证,用下面这段 ABAP 就能把“凭证流”和“库存余额”两条线对上:

" 1) 按库存地点读实时余额:这是 MMBE 的数据源 SELECT matnr, werks, lgort, labst, insme, speme FROM mard INTO TABLE @DATA(lt_mard) WHERE matnr = @lv_matnr AND werks = @lv_werks AND lgort IN @lr_lgort. " 2) 按物料凭证读历史流水:这是 MB51 的数据源 " UMWRK/UMLGO 是接收方工厂/库存地点,发出方是 WERKS/LGORT SELECT mblnr, mjahr, zeile, bwart, menge, meins, werks, lgort, umwrk, umlgo FROM mseg INTO TABLE @DATA(lt_mseg) WHERE matnr = @lv_matnr AND budat IN @lr_date AND bwart IN ('311','313','315','301','303','305','351').

代码里MARD是余额表、MSEG是流水表,两者是“快照”与“流水账”的关系。311 会产生两条MSEG记录:一条WERKS/LGORT是发出方,一条UMWRK/UMLGO是接收方;但MARD里只更新两行余额,不新增行。理解这个差异很关键——余额表只记“现在有多少”,流水表才记“怎么变成现在这么多的”。

提示:MSEG里的UMWRK、UMLGO只有在移动类型本身带接收方语义时才有值。用 311 却只填了发出方库存地点、接收方空着,过账时会直接被系统拦下,这不是配置问题,是移动类型的语义约束。

2.2 313/315:把“时间差”显式建模成一个库位

物理世界里,货从 A 库存地搬到 B 库存地需要时间——要有人拣货、要装车、要在路上。311 假装这段时间不存在;313/315 承认它存在,并且给它一个账面位置。

313 发货时发生的事是:A 库存地的非限制使用库存减少,工厂层面的总量暂时不变(货还在这个工厂里),差额进入“在途”这个中间态。315 收货时,在途清零,B 库存地的非限制使用库存增加。原文里那个例子说得很清楚——总数 90 个,10 个在途,收到 315 之后 100 个才全部落在 B 库存地。

这个中间态不是虚拟的,它有明确的可查询口径。原文给的查询分工是:

  • 同一工厂内、A 库存地转到 B 库存地的在途,看 MMBE 或 MB52;
  • 跨工厂(A 工厂转到 B 工厂)的在途,用 MB5T。

为什么跨工厂的要单独一个事务码?因为厂内在途是“同一个工厂的库存结构内部挪动”,余额还在这个工厂的 MARD 体系里;而跨工厂在途,货已经离开 A 工厂的可用库存,但还没进入 B 工厂的可用库存,它不属于任何一个工厂的常规余额,只能靠“未清的调拨凭证行”反推。MB5T 干的就是这件事——它不是读余额表,而是读那些“已发货、未收货”的凭证行,把它们拼成一张在途清单。所以 MB5T 的数据和 MMBE 天然对不上,不是 bug,是口径不同。

2.3 三个查询视图的分工,别用错

MMBE、MB52、MB5T 经常被混着用,但它们的粒度完全不同:

事务码粒度主要用途数据来源
MMBE单物料 × 工厂 × 库存地点看某个物料在某个点的全部库存状态MARD 等余额表
MB52多物料 × 库存地点盘点、对账、导库存清单MARD 等余额表
MB5T跨工厂在途查“发了没收”的调拨未清凭证行

日常对账最稳的做法是:先用 MB52 把库存地点的实存拉出来,再用 MB5T 把在途拉出来,两个数加起来才是“这批货的真实归属”。只盯 MMBE 的某一列,很容易得出“货丢了”的错误结论——它只是走到了下一站,还没签收。

3. 工厂间调拨:301 能平账,为什么 MRP 还是把它当黑洞

3.1 301 做对了什么,又漏掉了什么

301 是工厂间一步转储。一张凭证里,A 工厂的库存减少,B 工厂的库存增加,MARD两行同步更新,账面上完美。从纯库存会计的角度,它无可挑剔。

但从计划的角度,它有个致命缺口:301 不产生任何“需求”或“供给”的对象。A 工厂的 MRP 在跑的时候,看不到“这批货即将被调走”,于是不会提前补货;B 工厂的 MRP 也看不到“有一批货正在路上”,于是可能重复下单。结果是计划员在 MRP 清单里看到库存毫无征兆地掉下去一截,或者凭空多出来一批,然后开始人工救火。

原文那句话是踩过坑才会写的:工厂间转储涉及 MRP 运算(库存需求传递),应采用转储订单方式操作。这句话的分量比它看起来重得多——它说的不是“推荐”,而是“别用裸 301 做有计划的调拨”。

3.2 转储订单把“物理动作”变成“计划对象”

转储订单(STO)的本质是一张采购订单。这个设计非常巧妙:采购订单在 MRP 里天然就是“收货要素”,一旦它存在,B 工厂的计划视图里立刻就有了这批在途供给;同时 A 工厂因为这张订单占住了库存,也会提前感知到出货压力。

在这个模型下,发货用 351 而不是 301。为什么要换移动类型?因为 351 是“对采购订单发货”,它做的不只是减库存,还要回写采购订单的未清收货量。这样一条链才能闭合:

转储订单(需求确立) → 351 发货(库存减少 + 订单已发量增加) → 在途(MB5T 可见) → 101/收货(B 工厂库存增加 + 订单收货完成)

只要中间任何一环用了裸的 301/303,这条链就断了:库存可能对得上,但订单的未清量对不上,MRP 拿到的是污染过的数据。

原文给的两步走法是 303/305,逻辑和 313/315 一模一样:303 是发货,货进入跨工厂在途,MB5T 能看到;305 是收货,货落进目标工厂。区别只在于 313/315 是厂内,303/305 是跨厂。

3.3 MM 功能和 SD 功能:两条路,两套配置

同一件“工厂间调拨”,SAP 给了两条实现路径:

MM 路径:转储订单就是一张采购订单,走标准的采购收货流程,配的是采购订单凭证类型。原文提到的 NB 和 UB 都在这一层——凭证类型决定了这张单走不走装运、走不走外向交货。

SD 路径:把工厂间调拨当成一次“销售”,供货工厂是发货方,接收工厂是客户。这条路会生成出货单,需要配“定义工厂的装运数据”,把工厂和客户号挂上。

两条路的差别不只是配置量,而是业务覆盖面:

  • 只关心库存和计划,MM 路径就够了,链路短、未清项少;
  • 涉及实际运输、拣配、运费结算、出货单据,才需要 SD 路径。

原文里那个“正确配置如下”的判断点非常关键:如果装运数据里勾了“一步转储”,系统就按一步方式处理,不生成出货单;不勾,才走两步骤并生成出货单。很多人配完之后发现“明明说好不生成出货单,怎么还是生成了”,问题十有八九出在这个勾上——不是勾错了值,是勾错了工厂/客户的组合。

4. 后台配置的分流链:一张采购订单怎么被决定走 MM 还是 SD

4.1 凭证类型分配:先决定“这是哪种单”

配置入口在采购的库存转储订单设置里,核心动作是“分配凭证类型”。这一步决定的是:当业务在创建转储订单时,系统默认给它哪个凭证类型。原文提到的 NB 是标准采购订单类型,UB 是转储订单场景下常用的一种,两者的行为差异会一路传导到后面——走不走装运、生不生成出货单、号码范围落在哪里。

这里的坑在于很多人只改了这一层就去测,测完发现行为没变。原因是对面还有一层:装运数据。凭证类型只决定“这张单是什么”,装运数据决定“这张单要不要走运输”。两层都配对了,行为才会变。

4.2 工厂的装运数据:那个勾选框的连锁反应

这块配置要填的东西不多,但每一项都牵一发动全身:

配置项作用填错的后果
工厂客户把接收工厂映射成一个客户号映射不上就不生成出货单
是否一步转储决定一步还是两步勾错则多出/少掉一张出货单
供货工厂指明谁发货发错货,351 直接拒
转储单类型决定后续单据流号码范围错乱

原文那句“此处填写则会生成出货单,采用的是 SD 方式”,说的就是这个勾选框的反面——只要这一栏填了工厂客户,系统就认为你要走 SD,出货单就一定会来。所以判断“我到底在走哪条路”,最快的办法不是看凭证类型,而是看这一栏有没有值。

4.3 351 发货为什么落在 4500

原文有一句容易读漏的细节:系统未给转储单分配范围,所以为 4500。这句话描述的是一个典型的“配置链断了一环,系统回退到默认”的现象。

物料凭证的号码范围不是随便给的,它由“移动类型 → 物料凭证类型 → 号码范围”这条链决定。351 这类用于转储订单发货的移动类型,如果对应的凭证类型没有显式分配号码范围,系统就会落回一个默认区间。4500 出现在这里,就是回退的痕迹——它不报错,凭证照样能过,但号码段混在一起,后面做凭证追溯和对账会非常难受。

所以排查这类“号码怪怪的”问题,顺序应该是:先确认移动类型有没有被正确归类到某个凭证类型,再确认该凭证类型有没有分配号码范围,最后才怀疑号码范围本身被谁改过。

5. 避坑与排查:调拨账不平的六种现场

5.1 313 发完之后没人收,在途挂了三个月

现象:MMBE 里 A 库存地少了,B 库存地没多,总账上却查不出差异,报表越跑越对不上。

原因:313 是“发出”,必须有人手工补 315 或者用 MIGO 对物料凭证做收货。业务上如果发货和收货是两个班组、两个时间点,中间这段就没人负责。系统不会催你,它只是安静地把货挂在在途里。

解决:把 MB5T 加进周度对账清单,专门盯超过约定在途时长的记录;对两步调拨设置“发出后 N 天未收货”的提醒。别指望用户自己想起来,这类未清项只会越积越多。

5.2 工厂间调拨用了裸 301,MRP 结果开始飘

现象:库存数量完全正确,但 A 工厂频繁缺料、B 工厂频繁压库,计划员查不出原因。

原因:301 不产生采购订单对象,MRP 拿不到“需求”和“在途供给”,两边的计划都是瞎的。这种错最阴——账面全对,只有计划结果不对,靠查库存永远查不出来。

解决:凡是有计划意义的工厂间调拨,一律改走转储订单,发货用 351、收货用 101。已经用 301 做过的历史数据不用回改,但要在流程上封死这条路。

5.3 配了“一步转储”,出货单还是照生成

现象:装运数据里明明勾了一步,测试单跑出来还是带一张出货单。

原因:勾选框挂的是“工厂 + 客户”这个组合。业务实际用的接收工厂对应的客户号,和配置里填的那个不是同一个,等于配置根本没生效。系统不报错,它只是按“没配”处理。

解决:不要凭记忆核对,直接拿实际单据里的工厂和客户号去配置表里反查,一条一条对。这种问题的排查成本几乎全在“找对组合”上。

5.4 351 发货报“凭证类型/号码范围”相关的错

现象:发货时过不去,报错信息指向号码范围或凭证类型。

原因:移动类型到凭证类型的归类断了,或者凭证类型没分配号码范围。前者常见于新增移动类型后忘了归类,后者常见于拷贝环境时号码范围没带过来。

解决:按“移动类型 → 凭证类型 → 号码范围”这条链从前往后查,别跳步。查的时候顺便确认一下是不是所有相关工厂都覆盖到了,只配一个工厂是常见的半截子工程。

5.5 用了 309 物料到物料,移动平均价被拉平

现象:两个物料互转之后,单价变了,成本会计找上门。

原因:309 是物料号之间的转换。不同仓库、不同工厂的同一物料,移动平均价可能本来就不一样,一转就把两边的价值差异实打实地记进了账里。原文对此的判断很干脆——一般不建议采用此方式。

解决:能用数量调拨解决的,不要用物料转换。确实需要换物料号的场景,先评估价差影响,必要时走单独的价格调整流程,别让一张 309 把差异悄悄吞掉。

5.6 344 转完之后 MMBE 里“货不见了”

现象:做了非限制到冻结的 344,用户在 MMBE 的非限制列里找不到货,以为丢了。

原因:344 是把非限制库存转成冻结库存,货还在,只是换了列。冻结库存不参与可用量计算,所以 ATP 和 MRP 都看不到它,但 MMBE 的冻结列里明明白白躺着。343 是反向操作,把冻结转回非限制。

解决:培训时把 MMBE 的列含义讲透,比讲十个事务码都管用。库存“消失”的投诉里,有一大半其实是换了列。

6. 设计取舍:为什么 SAP 宁可多出一批未清项也不做原子调拨

把这几条线拉直看,会发现 SAP 在库存调拨上做了一个很明确的选择:它没有把调拨做成一个“一键完成”的原子操作,而是把物理世界里真实存在的时间差、责任边界、计划前置期,一层一层地暴露成系统里的对象。

一步转储和两步转储的取舍最典型。311 更省事,账面上瞬间完成,代价是系统假装“货瞬移了”。这在同一个园区、同一个班组、几分钟内完成的场景下完全合理。但只要距离一拉长、责任人一换,这个假设就崩了。313/315 用一次额外操作和一批在途未清项,换来了“货在哪、谁负责、卡了多久”这三个问题的可回答性。多出来的未清项不是设计缺陷,它就是那个时间差的账面目击者。

转储订单是同一个思路往计划层推。裸 301 能平账,但它把“调拨”这件事藏在了库存变动里,MRP 看不见。转储订单把这次调拨提前变成一个计划对象,代价是多了单据、多了未清量、多了一套配置,换来的是两边工厂的计划都能提前响应。这笔账在单一工厂、短距离场景下不划算,在跨工厂、长周期场景下就是刚需。

理解了这层取舍,很多“SAP 怎么这么麻烦”的抱怨会换个方向:它不是麻烦,它是拒绝替你把不确定性藏起来。你可以选择用 311 承担“假设货瞬移”的风险,也可以用 313/315 承担“多一次操作”的成本,但系统不会替你决定哪个更合适——这个判断只能落在业务上。

验证方法也很朴素:拿一条真实的调拨业务,把发货、在途、收货三个时点的 MMBE、MB52、MB5T 各截一次图,再对一遍 MSEG 的流水。三张快照加一条流水,能对上,说明你的配置和流程是自洽的;对不上,差异出现在哪一步,问题就在哪一步。

我自己的习惯是,任何跨工厂的调拨方案上线前,必须让计划员在测试环境里跑一遍 MRP,看两边的需求是不是都动了。只看库存对不对,等于只验了一半——账平了但计划是瞎的,这种坑我踩过一次,返工成本远高于多花半小时做验证。从那以后,我每次动调拨相关的配置,都会强制走一遍“库存 + MRP + 在途”三件套的回归,缺一项不算完。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询