Odoo会计对账原理、操作说明及常见问题
会计对账操作说明
本文档梳理 Odoo 17 银行对账(account.bank.statement.line)的操作步骤、注意事项及常见问题处理办法,帮助会计在遇到报错或异常状态时快速定位原因。
主要概念
- 银行对账行(Statement line):导入或手工录入的银行流水行。
 - 银行行(Liquidity line):凭证中使用日记账默认银行/现金科目的分录行,
account_type=asset_cash。 - 暂记科目行(Suspense line):凭证中用于暂存、待确认的对方科目行,通常 不 勾选“可对账”。
 - 部分核销(Partial reconcile):
account.move.line上的matched_debit_ids/matched_credit_ids,表示已与其他凭证行发生匹配。 - 验证(Validate):在对账小部件中点击“验证/确认”按钮后,系统会重写对应凭证行,将暂记科目替换为实际科目并完成核销。
 
标准对账流程
- 
定位待处理的银行对账行
- 列表视图中筛选“未匹配(Not matched)”。
 - 在开发者模式下,可查看 
is_reconciled字段确认真实状态。 
 - 
检查是否存在历史核销
- 若银行凭证行 
matched_debit_ids/matched_credit_ids有值,说明之前已经建立过部分核销。 - 可以在对账界面点右上角“调试操作 ▸ 取消对账”,或在凭证表单页签勾选该行后选择“操作 ▸ 取消匹配”;如界面无此按钮,可在 shell 中执行 
remove_move_reconcile()。务必在重新验证前清理残留核销。 
 - 若银行凭证行 
 - 
在对账小部件中选择要匹配的单据
- 只选择应收/应付、费用、收入等非银行科目的分录。
 - 如需调整金额或科目,可在界面中修改新增行的 
account_id,务必避免再次选择银行科目。 
 - 
验证
- 点击“验证”后,系统会:
- 先创建/更新 partial reconcile(银行行与选中单据挂钩)。
 - 清空原凭证行 
[Command.clear()]并按照界面行重建。 - 确保仅保留 一 条银行科目行,其余行改为真正的对方科目。
 - 执行 
_reconcile_plan完成核销,is_reconciled变为 True。 
 
 - 点击“验证”后,系统会:
 - 
验证结果
- 列表刷新后,该对账行将从“未匹配”过滤器中消失。
 - 若仍在“未匹配”,说明暂记行未被替换或残值未归零,需要检查错误处理部分。
 
 
暂记科目替换逻辑
- 
用户在小部件中确认行内容
- 第一行始终是银行科目(
flag='liquidity'),系统会保留。 - 其余行由用户选择的发票/费用等分录或手工新增行组成(
flag='new_aml'、flag='manual'等)。 - 这些行的 
account_id决定了替换暂记科目后要使用的真实科目。 
 - 第一行始终是银行科目(
 - 
验证时重写凭证
bank.rec.widget._action_validate()(account_accountant/models/bank_rec_widget.py)会将上述行转换为Command.create(...),写回原凭证:move_ctx.write({ 'partner_id': partner_to_set.id, 'line_ids': [Command.clear()] + line_ids_create_command_list, })Command.clear()先删除原来的两条默认行(银行 + 暂记)。- 随后的 
Command.create会逐条创建新行:第一条仍为银行科目,其余行的account_id承袭界面设置,相当于直接把“暂记科目”替换掉。 
 - 
替换成功的前提
- 满足只有一条行使用银行科目;其它行必须是非 
asset_cash科目(如应收、应付、费用)。 - 如果用户在界面上把第二行又选成了银行科目,写回后仍会得到两条银行行,导致 
_seek_for_lines()判定无效,后续取消或再对账都会失败。 
 - 满足只有一条行使用银行科目;其它行必须是非 
 - 
如何确认替换结果
- 验证后打开凭证,检查非银行行的 
account_id是否正确。 - 确认 
journal_entry.line_ids中只有一条科目属于asset_cash且等于日记账默认银行科目。 
 - 验证后打开凭证,检查非银行行的 
 - 
替换失败的常见场景
- 验证阶段报错(例如 
_check_reconciliation()),导致暂记行未被删除,却已创建 partial reconcile,需先取消核销再重试。 - 自定义对账模型返回了银行科目,或脚本在写入时覆盖了本应替换的科目。
 
 - 验证阶段报错(例如 
 
掌握这一机制后,只要确保在验证前界面上的“新分录”行科目正确,系统就会自动将暂记科目替换为真实科目。若需重新指定,可在对账窗口直接编辑该行的科目字段,再执行验证。
常见错误与处理
1. “You cannot do this modification on a reconciled journal entry.”
- 触发原因
- 在验证阶段需要修改银行行的字段(
account_id、balance等),但该行已存在matched_debit_ids/matched_credit_ids。 
 - 在验证阶段需要修改银行行的字段(
 - 解决步骤
- 在凭证界面或 shell 中执行:
env['account.move.line'].browse([银行行ID]).remove_move_reconcile() - 返回对账界面重新匹配并验证。
 
 - 在凭证界面或 shell 中执行:
 - 预防建议
- 验证前如已手工匹配过,需要先取消原核销。
 - 自定义脚本不要只创建 partial 而未走完整验证流程。
 
 
2. “日记账分录 XXX 在其相关对账单行达到无效状态。…必须始终有涉及银行/现金科目的日记账项目。”
- 触发原因
- 凭证中包含 多条 
asset_cash类型的分录(例如暂记科目也配置成现金类、或被手工改成银行科目)。 _seek_for_lines()找到超过一条银行行时会抛出该错误。
 - 凭证中包含 多条 
 - 解决步骤
- 手工编辑凭证,将非银行的对方行修正为应收/应付/费用等非 
asset_cash科目。 - 保存后再尝试取消对账或重新验证。
 
 - 手工编辑凭证,将非银行的对方行修正为应收/应付/费用等非 
 - 预防建议
- 对账模型、人工新增行务必选择非银行科目。
 - 暂记科目建议使用 
asset_current等非现金类型,并保持reconcile=False。 
 
3. 对账后仍显示“未匹配”
- 通常是暂记行未成功替换,残值仍不为零。
amount_residual仍由暂记行决定时,is_reconciled会一直是 False。 - 请确认是否存在残留 partial、是否报错中断、或是否误将对方科目设置成银行科目。必要时使用“取消对账”恢复默认两行后重新匹配。
 
操作注意事项清单
- ✅ 仅保留 一条 银行科目行(银行日记账默认科目)。
 - ✅ 暂记科目默认不勾选“可对账”,也不应属于 
asset_cash。 - ✅ 验证前若发现银行行已有历史 partial,先行“取消对账”。
 - ✅ 对账模型返回的科目必须是实际对方科目,切勿返回银行科目。
 - ✅ 报错后务必撤销残留的 partial,避免多次验证失败。
 - ❌ 不要直接在数据库或脚本中只写入 
account.partial.reconcile而未走完整流程。 
流程图(Mermaid)
flowchart TD
    A[开始:列表筛选未匹配] --> B{银行行存在\nmatched_*?}
    B -- 否 --> C[正常选择要匹配的发票/费用行]
    B -- 是 --> D[取消对账\n(remove_move_reconcile)]
    D --> C
    C --> E{界面行科目选择正确?\n(非银行科目)}
    E -- 否 --> F[调整科目到应收/应付/费用等]
    F --> E
    E -- 是 --> G[点击验证]
    G --> H{报错?}
    H -- 是 --> I[根据错误信息处理\n(常见见上文)]
    I --> B
    H -- 否 --> J[验证成功\n凭证仅剩一条银行行]
    J --> K{列表仍显示未匹配?}
    K -- 是 --> L[检查暂记行残值/科目\n并修正]
    L --> B
    K -- 否 --> M[结束:对账完成]
附:常用 Shell 命令片段
# 查看某银行对账行的凭证及核销情况
st_line = env['account.bank.statement.line'].browse(64061)
for line in st_line.move_id.line_ids:
    print(line.id, line.account_id.code, line.matched_debit_ids.ids, line.matched_credit_ids.ids)
# 撤销银行行已有的 partial reconcile
env['account.move.line'].browse([411956]).remove_move_reconcile()
若按照上述步骤仍无法完成对账,请记录报错信息、相关凭证行 ID,并联系系统管理员或实施顾问进一步排查。祝对账顺利。
本文来自博客园,作者:老韩头的开发日常,转载请注明原文链接:https://www.cnblogs.com/xushuotec/p/19178543
                    
                
                
            
        
浙公网安备 33010602011771号