先说结论
在 Odoo 里,write-off 不等于坏账。
更准确地说,write-off 代表的是:
为了让一笔业务余额闭合,系统允许你用额外 journal item 去承接“那一点不准备再追了、也不需要继续挂着”的差额。
这个差额可能是:
- 真正的坏账
- 银行手续费
- 小额尾差
- 提前付款折扣
- 银行对账中的自动补差
所以 write-off 是一种记账动作形态,不是单一业务含义。
为什么很多人会把它误解成坏账
因为坏账核销是最容易被看见的 write-off 场景。
但从源码设计看,官方并没有把 write-off 绑死成“坏账专用”。
/home/ubuntu/odoo-temp/addons/account/models/account_payment.py 的 _prepare_move_line_default_vals() 直接接受 write_off_line_vals,而且注释写得很直白:
- 可以额外传入 write-off line
- 它会参与 counterpart amount 的平衡
这说明在 Odoo 看来,write-off 首先是:
付款分录里一个可插入的额外差额行。
至于它的业务解释,要看你把它记到什么科目。
银行对账模型为什么也大量使用 write-off
/home/ubuntu/odoo-temp/addons/account/models/account_reconcile_model.py 更进一步证明了这一点。
account.reconcile.model.line 允许你定义:
- 固定金额
- 按余额百分比
- 按 statement line 百分比
- 甚至从 label 用 regex 抽金额
然后把这些差额自动生成到指定 account 上。
这其实就是在说:
- 银行手续费可以自动补
- 零头差额可以自动补
- 某些常见扣款可以自动补
所以 reconcile model 里的 write-off,本质上是一种标准化差额承接规则。
它和“坏账”完全不是一个量级的概念。
提前付款折扣为什么也会长得像 write-off
源码里关于 early payment discount 的处理,会为 base / tax / term line 准备额外 counterpart lines。
业务上它表达的是:
- 客户少付那一部分,不再继续追收
- 但那不是坏账,而是合同允许的折扣
所以它在会计上仍然会体现为一种“把余额补平”的附加行,只是会记到折扣收益 / 损失或相关税务口径,而不是坏账准备。
这再次说明:
write-off 是“如何闭合差额”的技术形状,不等于“为什么闭合差额”的业务原因。
判断 write-off 属于哪一类,关键看什么
关键不看名字,关键看三件事:
- 差额是怎么来的:尾差、折扣、手续费、坏账?
- 差额记到什么科目:坏账费用、银行手续费、折扣损益、其他调整?
- 是在什么流程生成的:付款向导、银行对账、reconcile model 还是手工核销?
这三件事决定了业务语义。
新手最容易误解的 4 件事
1. 只要叫 write-off 就一定是坏账
错。坏账只是其中一种。
2. 付款少了 1 块钱就应该一直挂着
不一定。很多场景更适合用小额差异 write-off 关掉余额。
3. 银行手续费和 write-off 没关系
其实很有关系,reconcile model 就经常这么做。
4. 提前付款折扣只是商业条件,不会落到差额行
不对。系统常常要通过额外 counterpart lines 把余额和税口径一起处理干净。
一句话记忆法
write-off 在 Odoo 里不是“坏账同义词”,而是“用额外分录承接不再继续挂账的差额”这类动作的总形状。
DISCUSSION
评论区