56. SAP S/4HANA FICO:FI 验证、替代与用户出口实战

56. SAP S/4HANA FICO:FI 验证、替代与用户出口实战
验证和替代都用于控制 FI 凭证质量,但职责完全不同:验证在条件满足时检查数据,不合格就提示或阻止过账;替代在条件满足时自动写入或替换字段。本课成功完成了一个“供应商行项目文本必填”的验证,也设计了“使用 GST 税码时业务地点必填”的用户出口方案;后半段尝试把凭证日期替代到过账日期,但最终凭证证明替代没有生效,因此本文只把它写成失败案例和排查方法,不写成已完成配置。
视频信息
- 原视频:SAP FICO FOR BEGINNERS | FULL COURSE | DAY 33
- 视频时长:48 分 20 秒
- 视频地址:https://www.youtube.com/watch?v=v7Rb8jX_WhQ
- 本文范围:FI 验证、FI 替代、调用点、布尔类、用户出口、字段开放、激活与失败排查
- 截图规则:只引用视频中的 SAP GUI 原始画面;Excel 中的逻辑草稿已翻译成中文表格,不直接使用原图
说明:公司代码
SKPI、验证名SKPI_L、替代名SKPI_H、消息号和用户出口名称均为训练系统数据。生产系统必须使用本公司的命名、消息类、授权和传输规范。
一、验证与替代到底有什么区别
| 对比项 | 验证 Validation | 替代 Substitution |
|---|---|---|
| 核心目的 | 判断当前输入是否允许 | 自动写入或替换目标字段 |
| 规则结果 | 通过、警告或错误 | 常量、其他字段、规则或用户出口的返回值 |
| 用户做错时 | 根据消息类型提示或阻止过账 | 系统在支持的范围内纠正或补全值 |
| 基本结构 | 前提条件 + 检查 + 消息 | 前提条件 + 目标字段 + 替代值 |
| 复杂逻辑 | 可调用用户出口 | 可调用用户出口 |
一个常见误区是把“必填”全部交给屏幕字段状态。字段状态适合固定规则;如果只有特定公司代码、账户类型、税码或业务场景才必填,就更适合使用验证。替代则不能被当作任意改写凭证的万能工具,只有当前调用点和布尔类开放的字段才能使用。
二、三个 FI 调用点
SAP 官方说明,调用点决定验证或替代在凭证处理的哪个时刻运行,也决定当时可以访问哪些字段。FI 的经典调用点为:
| 调用点 | 层级 | 适合处理的内容 |
|---|---|---|
| 1 | 凭证抬头 Document Header | 公司代码、凭证日期、抬头文本等抬头条件 |
| 2 | 行项目 Document Line | 账户类型、总账科目、分配、项目文本等逐行条件 |
| 3 | 完整凭证 Complete Document | 需要同时观察多条行项目或整张凭证的检查 |
本课的文本必填规则必须放在调用点 2,因为 BSEG-SGTXT 是行项目字段。假如一张凭证有 20 条行项目,调用点 2 会逐条运行;前提条件必须限定真正需要检查的行,否则所有行都可能被强制填写文本。

经典 SAP GUI 中可以通过 GGB0 维护验证,并通过 OB28 为 FI 会计凭证分配和激活;本课直接从 OB28 入口进入了相应维护界面。
三、已完成案例:供应商行项目文本必填
本课创建的验证步骤 002 可以翻译为下面的业务语句:
如果公司代码是
SKPI,并且当前行是供应商行项目,那么项目文本不得为空;否则发出错误消息。
1. 前提条件
视频中的技术表达式为:
BKPF-BUKRS = 'SKPI' AND BSEG-KOART = 'K'

关键字段含义:
| 技术字段 | 含义 | 本课值 |
|---|---|---|
BKPF-BUKRS | 公司代码 | SKPI |
BSEG-KOART | 账户类型 | K,供应商 |
BSEG-SGTXT | 行项目文本 | 不允许为空 |
经典 FI 账户类型通常使用 K 表示供应商、D 表示客户、S 表示总账。规则只限定 K,所以不会把同一凭证的所有总账行都强制成供应商文本规则。
2. 检查条件
检查表达式是:
BSEG-SGTXT <> ' '
也就是项目文本不等于空值。

如果把操作符反过来写成 BSEG-SGTXT = ' ',含义就变成“该字段必须保持为空”。视频短暂使用这个反向条件来说明验证也能禁止用户填写某字段,但它只是教学实验,不是最终业务要求。
3. 消息必须与规则一致
验证消息只在前提满足而检查失败时输出。生产配置至少要保证:
- 消息类型符合控制强度;关键完整性规则通常使用错误消息;
- 消息文本明确说明哪个字段、哪类行项目需要处理;
- 消息类和消息号属于当前项目,而不是复用其他公司代码的临时文本;
- 文本与实际检查字段一致,不能把“项目文本”写成“税值”。
课堂因为消息维护被锁,临时复用了其他练习消息。讲师也明确指出该消息不准确。文章不把这个临时消息当作标准配置。
4. 在 FB60 中测试
进入 FB60 后,供应商发票包含供应商行和总账费用行。本课先让供应商行项目文本为空,系统按规则报错;补充文本后,验证通过。

这里的重点不是界面标签,而是技术字段 BSEG-SGTXT。不同版本或屏幕变式可能显示为“Text”“Item Text”或类似名称,判断规则时应以技术字段为准。
四、用户出口设计:使用 GST 税码时业务地点必填
第二个案例来自印度本地化场景。FB60 基本数据中可以看到业务地点/部门代码字段。

视频提出的业务要求是:当特定公司代码使用属于 GST 税务过程的税码时,业务地点 BUPLA 必须填写。Excel 草稿翻译成中文后如下:
| 条件或结果 | 表/字段 | 示例值或要求 |
|---|---|---|
| 公司代码 | BKPF-BUKRS | SKPI |
| 税务过程 | T007A-KALSM | 训练系统示例 ZTAXIN |
| 税码 | T007A-MWSKZ | 属于该税务过程的任一适用税码 |
| 业务地点 | BSEG-BUPLA | 必须非空 |
| 失败消息 | 项目自建消息类 | 明确提示业务地点必填 |
视频口述和自动字幕多次把表名说成 T0078 或 T307A,SAP 画面实际显示的是 T007A,税务过程技术字段为 KALSM,税码字段为 MWSKZ。

这个需求要根据税务过程读取一组税码,再判断业务地点,逻辑比简单常量检查复杂。课堂因此把它设计为用户出口:功能顾问给出完整条件、字段、预期结果和消息,ABAP 顾问实现并返回布尔结果。

需要明确:视频只选择了训练系统中已有的 UFP03 作为说明,并设想以后新增另一个出口;没有展示实际 ABAP 代码,也没有完成这个业务地点规则的端到端测试。因此不能把 UFP03 或设想中的名称复制到其他系统。
SAP 官方将此类用户出口定义为客户 FORM 例程。项目通常从 SAP 示例 form pool RGGBR000(验证/规则)或 RGGBS000(替代)复制到客户命名空间,并在 T80D 中维护客户 form pool;不应直接修改 SAP 标准示例程序。
五、替代案例:计划让过账日期等于凭证日期
后半段进入 FI 替代。经典事务通常用 GGB1 维护替代、用 OBBH 为公司代码和调用点分配并激活。本课在抬头调用点 1 使用替代 SKPI_H。

目标设计为:
| 角色 | 技术字段 | 含义 |
|---|---|---|
| 前提 | BKPF-BUKRS = 'SKPI' | 只处理训练公司代码 |
| 目标字段 | BKPF-BUDAT | 过账日期 |
| 来源字段 | BKPF-BLDAT | 凭证日期;在 FB60 界面显示为 Invoice date |
维护画面中,过账日期被设置为由凭证日期字段替代。

测试时,讲师输入凭证日期 15.05.2025、过账日期 25.05.2025,预期系统在过账前把后者改成前者。

替代还需要在 OBBH 中按公司代码、调用点和激活级别启用。本课显示了公司代码 SKPI、调用点 1、替代 SKPI_H、激活级别 1。

六、为什么这个替代不能写成成功案例
课堂第一次测试因未激活而没有运行。激活后再次过账,结果依然没有按预期改写日期。讲师又尝试调用点 3“完整凭证”。

但系统提示当前事件不允许替代该字段。最终在 FB03 查看已过账凭证时,凭证日期仍是 15.05.2025,过账日期仍是 25.05.2025,直接证明替代没有生效。

所以本课只能确认:规则被创建并激活、测试凭证已过账、目标结果未实现。视频没有找出唯一根因,也没有完成修复后的回归测试。
七、关键官方校正:不要修改 GB01
为了让 BKPF-BUDAT 出现在可替代字段中,视频进入了 GB01 维护视图并尝试去掉排除标识。这个操作不能按视频照做。
SAP 官方说明:
GB01是 SAP 交付的、跨客户端控制表,不能由客户修改;- 客户可配置字段应通过客户端相关的
GB01C,维护视图为V_GB01C; - 如果字段在
GB01中已经被排除,GB01C不能反向覆盖,因为GB01优先; - 并非显示在结构中的每个字段都允许在任意布尔类或调用点被替代。
因此,正确做法不是删除 GB01 的排除标识,而是:
- 先确认应用区域、调用点和对应布尔类;
- 在官方支持范围内检查
GB01C/V_GB01C; - 确认目标字段在该布尔类中可读还是可写;
- 如果 SAP 明确排除该字段,停止标准替代方案并评估受支持的替代设计;
- 任何自定义出口都要经过技术评审、传输和回归测试。
这也解释了为什么“画面中把字段放出来”不能被当成成功证据。字段即使出现在维护器中,也可能在后续处理被限制或覆盖。
八、用户出口该怎么交付
功能顾问不能只对开发人员说“帮我把业务地点设成必填”。最少应提供:
| 交付项 | 本课案例应写清的内容 |
|---|---|
| 业务目的 | GST 相关供应商行项目必须归属业务地点 |
| 触发范围 | 公司代码、凭证来源、账户类型、税务过程和税码集合 |
| 数据来源 | BKPF-BUKRS、T007A-KALSM、T007A-MWSKZ、BSEG-BUPLA |
| 预期结果 | 业务地点为空时返回失败并发出错误消息 |
| 非适用范围 | 非目标公司代码、非 GST 税码、无需业务地点的交易 |
| 测试矩阵 | 条件命中/不命中、字段空/非空、手工/自动凭证、正向/冲销 |
| 传输依赖 | 客户代码、用户出口注册、验证/替代配置和消息对象的顺序 |
复杂逻辑适合用户出口,不代表所有简单逻辑都必须开发。先用标准前提、检查、集合和规则表达;确实无法覆盖时才进入客户代码。
九、排查验证或替代不生效
| 顺序 | 检查项 | 完成标准 |
|---|---|---|
| 1 | 规则是否保存、生成并激活 | 公司代码、调用点、规则名和激活级别正确 |
| 2 | 调用点是否匹配字段层级 | 抬头字段不误放到行项目,逐行检查不误放到抬头 |
| 3 | 前提条件是否真的命中 | 用实际凭证数据逐项核对,不凭感觉判断 |
| 4 | 字段是否属于当前布尔类 | 在 GB31、GB01/GB01C 的官方范围内确认 |
| 5 | 字段是否允许被替代 | 可读取不等于可写入;排除字段不能强行开放 |
| 6 | 是否被后续程序覆盖 | 对比输入、模拟、过账和 FB03 最终结果 |
| 7 | 使用标准跟踪功能 | 优先用验证/替代 Trace 查看调用和表达式结果 |
| 8 | 必要时由开发调试 | 仅在受控非生产环境、具备授权并由 ABAP 顾问执行 |
视频输入 /h 启动 ABAP 调试,准备追踪替代为何没有运行。

但本课没有完成调试结论。/h 只是打开调试器,不会自动解释问题;生产系统也不应由普通业务用户随意调试。SAP 还提供验证/替代总跟踪功能,通常应先用它确认规则是否被调用以及每个表达式的结果。
十、课程结果与边界
| 内容 | 本课状态 |
|---|---|
| 供应商行项目文本必填验证 | 已创建并在 FB60 中验证生效 |
| 反向检查“文本必须为空” | 仅用于解释逻辑,不是最终配置 |
| GST 税码触发业务地点必填 | 已设计功能与技术逻辑,未完成用户出口开发和端到端测试 |
| 凭证日期替代过账日期 | 已创建并激活,但测试失败 |
| 完整凭证调用点替代 | 尝试后发现目标字段不可在该事件中替代 |
/h 调试 | 已启动,未得出根因或修复结果 |
| GST、APP、新总账、现金日记账 | 只安排为后续课程,未在本课实施 |
十一、字幕与课堂表达校正
| 视频或自动字幕表达 | 本文采用的准确表达 |
|---|---|
| tax / tax text | 本段实际字段是行项目文本 BSEG-SGTXT |
| T0078 / T307A | T007A |
| FB6 | FB60,供应商发票录入 |
| BBH / OBBA | OBBH,FI 会计凭证替代分配与激活 |
| competition level | Complete Document,完整凭证调用点 3 |
| 直接改 GB01 解除排除 | 不可复制;官方客户配置入口是 GB01C/V_GB01C,且不能覆盖 GB01 的排除 |
| 日期替代已经完成 | 未完成;FB03 显示过账日期仍为 25.05.2025 |
SAP 官方核验资料
- Validations, Substitutions, and Rules
- Validation/Substitution Callup Points
- Boolean Classes
- Adding Fields to and Deleting Fields from a Boolean Class
- Validation and Substitution — SAP Support Content
- User Exits in Validations/Substitutions/Rules
- Creating a Substitution
- How to Define a Substitution in FI
结论
本课最有价值的不是“点完几个事务码”,而是建立可验证的边界:简单条件可以用标准验证或替代;复杂的多表判断可以设计用户出口;调用点和布尔类决定字段能不能用;任何替代都必须用最终凭证证明结果。供应商文本验证已经通过测试,而日期替代没有生效,正确做法是保留失败证据、按官方字段开放规则排查,绝不能通过修改 GB01 强行绕过限制。
