SAP S/4HANA FICO 入门 55:FI 凭证替代、调用点与用户出口

SAP S/4HANA FICO 入门 55:FI 凭证替代、调用点与用户出口
本集从上一课的 FI 校验切换到 FI 替代。校验负责判断数据是否合规,并在失败时发出消息;替代则在满足前提条件时,自动把目标字段改成常量、另一个字段的值,或用户出口计算出的结果。课程使用经典事务码 GGB1 定义规则、用 OBBH 分配并激活,还演示了凭证抬头、行项目和用户出口三类场景。
视频信息
- 原视频:SAP FICO FOR BEGINNERS | FULL COURSE | DAY 32
- 视频时长:1 小时 05 分 55 秒
- 视频地址:https://www.youtube.com/watch?v=ygQdUsMgvqU
- 本文范围:校验语义复核、销售开票问答、
GGB1、OBBH、常量替代、字段到字段替代、行项目替代、用户出口 - 截图规则:只引用原视频中的 SAP 系统画面;Excel、PowerPoint 等非 SAP 画面不直接使用,相关内容已翻译成中文表格,并依据 SAP 官方资料校正
一、先修正上一课的校验逻辑
课程开头重新解释了上一集的日期校验。布尔校验的执行顺序是:前提条件成立后,系统计算“检查条件”;检查结果为真时通过,为假时才触发消息。因此,如果业务规则是“过账日期不得早于凭证日期”,检查表达式应是:
BKPF-BUDAT >= BKPF-BLDAT
| 检查结果 | 含义 | 系统处理 |
|---|---|---|
| 真 | 过账日期等于或晚于凭证日期 | 校验通过,不报错 |
| 假 | 过账日期早于凭证日期 | 按规则中的消息类型提示或阻止 |
不要把“需要报错的条件”直接写成检查条件。校验表达式描述的是“什么情况算正确”,不是“什么情况算错误”。

二、校验与替代不是一回事
课程用非 SAP 课件解释了二者差异,下面将其翻译成中文结构:
| 对比项 | 校验 Validation | 替代 Substitution |
|---|---|---|
| 目的 | 判断现有输入是否满足规则 | 自动生成、复制或覆盖目标字段 |
| 结构 | 前提条件 + 检查条件 + 消息 | 前提条件 + 替代方法 |
| 条件满足后的动作 | 执行检查 | 执行字段替换 |
| 失败或结果 | 检查为假时发消息 | 不需要“检查为假”的消息结构 |
| 典型场景 | 必填、字段组合、日期关系 | 默认值、字段同步、复杂派生 |
替代会改变凭证数据,因此设计时应比校验更谨慎。能由标准字段状态、默认值或业务应用直接完成的要求,不要重复做成替代;必须覆盖用户输入时,还要明确业务责任和审计影响。
三、课堂中的销售开票问答:正确的流程边界
正式进入替代前,课程回答了“销售订单与非销售订单应收”的问题。自动字幕和口述中有几处容易误解,正确关系如下:
| 场景 | 正确入口或处理 | 说明 |
|---|---|---|
| 不基于销售订单的客户发票 | FB70 | 直接在 FI 创建客户发票 |
| 创建销售订单 | VA01 | 不是 VF01;VF01 用于开票 |
| 基于前序销售凭证创建开票凭证 | VF01 | 开票完成后,满足条件时向会计传输 |
| 开票凭证因错误未传入会计 | 先修正根因,再在 VF02 释放到会计 | VF02 不是自动修复会计错误的工具 |
| 取消开票凭证 | VF11 | 若原开票已过账到会计,取消时通常需要相应冲销会计影响;若尚未传入会计,则不会产生这组会计分录 |
| SD 收入科目确定 | VKOA | 课程口述被字幕识别成了其他拼写,正确事务码是 VKOA |
这段属于概念问答,不是本集替代配置的一部分。本文保留它,是为了避免把 FI 手工应收、SD 开票和会计传输混成一个步骤。
四、经典 FI 替代的对象模型
经典配置可以拆成四层:
| 层次 | 需要决定的问题 | 本集示例 |
|---|---|---|
| 应用与调用点 | 在什么处理时机、对哪类数据执行 | Financial Accounting,调用点 1 或 2 |
| 替代规则 | 规则容器和业务含义 | SKPI_H、SKPI_L |
| 步骤 | 前提条件成立后替代哪个字段 | 公司代码为 SKPI 时替代参考号或文本 |
| 组织分配与激活 | 哪个公司代码实际启用该规则 | 在 OBBH 分配并设置激活级别 |
FI 常见调用点如下:
| 调用点 | 名称 | 主要数据范围 | 本集是否实际配置 |
|---|---|---|---|
0001 | 凭证抬头 | BKPF 抬头字段 | 是 |
0002 | 行项目 | BSEG 行项目,可读取部分抬头字段 | 是 |
0003 | 完整凭证 | 需要整张凭证或跨行关系的数据 | 只提到,未完成矩阵替代配置 |
调用点不仅决定字段列表,也决定系统在凭证处理的哪个阶段执行规则。不要把抬头字段、单行字段和整张凭证逻辑混在同一个调用点中。
五、在 GGB1 创建抬头替代
进入 GGB1 后,选择 Financial Accounting → Document header,然后创建抬头替代。课程使用:
- 替代名称:
SKPI_H - 描述:Substitution Header Level
- 应用范围:Financial Accounting
- 调用点:
1,Document header

SKPI_H、SKPI_L 和公司代码 SKPI 都是课程环境中的自定义示例,不是 SAP 标准对象,也不是生产命名建议。实际项目应采用可追踪业务用途、所属模块和组织范围的命名规范。
5.1 前提条件
课程的前提条件是:
BKPF-BUKRS = 'SKPI'
这表示只有当前凭证公司代码为 SKPI 时,步骤中的替代动作才执行。替代步骤没有校验规则里的“检查条件 + 消息”;它只判断前提条件,然后执行替代方法。
5.2 在 OBBH 分配并激活
定义完成后进入 OBBH,按公司代码、调用点和替代名称进行分配。课程给 SKPI 分配调用点 1,并填写激活级别 1。

SAP 官方说明的激活级别不只是“开/关”:
| 激活级别 | 含义 |
|---|---|
0 | 不激活 |
1 | 激活 |
2 | 激活,但批输入处理除外 |
选择级别时必须考虑接口、批处理和后台导入路径,不能只验证前台手工事务。
六、方法一:常量替代
常量替代适合把目标字段固定成预先定义的值。课程把凭证抬头参考号 BKPF-XBLNR 替换成 SUBS 24/05,后续又改成 Sagar。这两个值只是教学占位符,不能直接当成生产规则。

在 FB60 测试时,满足前提条件并触发屏幕检查后,参考号显示为 SUBS 24/05。

这张画面只证明字段在界面中的替代行为,不把它扩展解释成“凭证已经成功过账”。生产验证还要检查最终会计凭证、接口路径、批处理、权限和后续报表。
常量替代的风险很直接:若规则把所有凭证参考号覆盖成固定字符串,将破坏外部单据追踪、重复发票检查和审计检索。真实需求通常需要更窄的前提条件,或改用字段映射、用户出口生成有业务意义的值。
七、方法二:字段到字段替代
课程随后把“凭证抬头文本” BKPF-BKTXT 设置为来自“参考号” BKPF-XBLNR。规则表达为:
目标字段:BKPF-BKTXT
来源字段:BKPF-XBLNR
前提条件:BKPF-BUKRS = 'SKPI'

这种方式不需要写程序,适合直接复制已有字段。但是课程又增加了一个步骤,先把参考号替换为常量 Sagar,再把参考号复制到抬头文本。最终两个字段都会显示该值。
这说明步骤顺序会影响结果:
- 步骤 1:把
BKPF-XBLNR复制到BKPF-BKTXT。 - 步骤 2:把
BKPF-XBLNR覆盖成常量。 - 若希望文本拿到覆盖后的新值,复制步骤必须在新值已经存在之后执行,或重新设计步骤顺序。
实际配置前应把每一步的输入字段、输出字段和执行顺序画清楚,尤其要避免后续步骤覆盖前面步骤的结果。
八、公司代码范围由 OBBH 分配控制
课程测试了多个公司代码,并指出一个关键边界:即使某一步的前提条件没有限制公司代码,规则也不会因此自动对所有公司代码生效。经典 FI 替代仍需在 OBBH 按组织单位和调用点分配、激活。
课程演示中出现 SKPI、2309 和 1000,它们都是环境示例。跨公司代码部署时要逐项确认:
| 检查项 | 原因 |
|---|---|
| 公司代码是否已分配相同替代 | 规则定义存在不等于组织单位已启用 |
| 调用点是否一致 | 抬头规则与行项目规则不能互换 |
| 本地字段和业务流程是否一致 | 不同公司代码可能使用不同凭证类型、科目与接口 |
| 激活级别是否覆盖批处理 | 前台成功不代表批输入或接口路径一致 |
九、调用点 2:行项目文本替代
课程在 GGB1 的 Line Item 节点创建行项目替代 SKPI_L,并在 OBBH 为公司代码 SKPI 分配调用点 2、激活级别 1。目标是把抬头参考号复制到行项目文本:
目标字段:BSEG-SGTXT(行项目文本)
来源字段:BKPF-XBLNR(抬头参考号)

在 FB70 的行项目明细中,画面字段标签为 HeaderText,对应本例的行项目文本,显示了从参考号派生的 SAGAR。

这里仍应把 SAGAR 视为人工演示值。真实项目要验证多行凭证、税行、自动生成行、总账行与客户/供应商行,确保替代只作用于目标行。若条件依赖整张凭证或跨行汇总,应评估调用点 0003,但本集没有完成该配置。
十、方法三:用户出口
当常量和字段复制无法表达复杂逻辑时,可以选择 Exit,把目标字段交给自定义例程计算。课程举的概念例子是把凭证类型、凭证号、公司代码和会计年度连接成一个字符串。

SAP 经典替代出口通常是 Uxyz 格式的 FORM 例程,例如 U100。出口所在 form pool 通过相应配置维护;SAP 官方资料指出可通过 GCX2/表 T80D 指定。课程只查看了系统中已有的 U100 代码,没有完成一个新的自定义出口,因此不能把本集理解为“用户出口已经开发并上线”。

课堂把实现人员口述为管理员或 Basis,这里需要修正:
| 角色 | 正确职责 |
|---|---|
| FI/CO 功能顾问 | 明确业务规则、调用点、前提条件、源字段、目标字段、示例与正反测试 |
| ABAP 开发人员 | 按设计实现和单元测试 FORM 例程,处理类型、长度、异常和性能 |
| Basis/系统管理员 | 负责传输、系统运行和权限等平台工作,不替代 ABAP 业务逻辑开发 |
| 业务与测试人员 | 验证手工、接口、批处理、冲销和边界数据 |
用户出口应是复杂需求的最后手段。能用标准字段映射稳定完成的规则,不应为了“灵活”而增加代码和维护成本。
十一、上线前的设计与测试清单
| 检查项 | 最低要求 |
|---|---|
| 业务目标 | 说明为什么必须修改字段,以及修改后的业务含义 |
| 调用点 | 明确使用抬头、行项目还是完整凭证 |
| 前提条件 | 尽量限定公司代码、凭证类型、科目或业务来源,避免全局覆盖 |
| 替代方法 | 常量、字段映射、出口三者中选择最简单且可审计的方法 |
| 步骤顺序 | 写明每一步读取什么、写入什么,检查覆盖和连锁依赖 |
| 组织分配 | 在 OBBH 核对每个公司代码、调用点和激活级别 |
| 正向测试 | 条件成立时,目标字段按预期生成 |
| 反向测试 | 条件不成立时,原字段保持不变 |
| 多行测试 | 覆盖税行、自动行、客户/供应商行、总账行和多科目凭证 |
| 通道测试 | 手工录入、接口、批输入、后台任务都要验证 |
| 最终凭证 | 检查已过账凭证、冲销、审计追踪和下游报表,而不只看录入界面 |
在较新的 SAP S/4HANA 版本或不同部署版本中,还可能提供 Manage Substitution/Validation Rules 应用。是否可用取决于版本与业务范围;本集演示的是经典 GGB1 + OBBH 路径,两者不要混写成同一套界面步骤。
十二、本集完成边界
| 已完成或已说明 | 本集没有完成 |
|---|---|
| 校验检查条件“真则通过、假则报错”的语义 | 为参考号设计可投产的业务规则 |
| 销售订单、开票、释放到会计和取消开票的概念校正 | 完整验证多个公司代码的生产部署 |
| 抬头常量替代 | 以最终已过账凭证证明全部替代结果 |
| 抬头字段到字段替代及步骤顺序 | 创建并交付新的自定义用户出口 |
| 行项目文本替代 | 调用点 0003 的完整凭证/矩阵替代 |
| 用户出口的用途、职责分工和测试思路 | 用户出口的代码实现与性能测试 |
SAP 官方资料
- Validation/Substitution Callup Points
- Validation and Substitution:FI 调用点、布尔类与用户出口
- Validation/Substitution:定义、分配与激活
- SAP S/4HANA 2025:用户定义出口与完整凭证调用点
- How to define substitution:OBBH 与常量替代
- FI 替代激活级别
- Manage Substitution/Validation Rules
- VF02:释放开票凭证到会计
- VF11:取消开票凭证
- 取消开票凭证的会计影响
- SD 开票的收入科目确定
通过本集可以建立一个清晰判断:需要阻止错误输入时用校验;需要在明确条件下自动派生字段时用替代;只有标准替代方法不足时,才考虑由功能顾问设计、ABAP 开发实现的用户出口。
