Odoo14打印发票提示account.account_invoices_without_payment外部ID不存在
Odoo14打印发票触发外部ID缺失报错解决方案
错误根因
该报错是Odoo14原生账户模块硬编码依赖的account.account_invoices_without_payment外部ID丢失导致。哪怕你选择自定义空白打印模板也会触发问题,因为账户模块底层重写了发票报告的_render_qweb_pdf方法,固定引用了该ID,和前端选择的模板无关。
注意:所有操作前请提前备份Odoo数据库和源码文件,避免操作失误导致业务中断。
解决方案
方案1:手动恢复缺失的外部ID(无侵入,最推荐)
- 开启Odoo开发者模式,依次进入
设置->技术->序列与标识符->外部标识符 - 点击新建,填写以下参数:
- 模块:account
- 外部ID:account_invoices_without_payment
- 模型:ir.actions.report
- 记录ID:进入
设置->技术->动作->报告,找到系统当前生效的标准发票报告,打开后URL中的id参数即为记录ID
- 保存后重启Odoo服务,清除浏览器缓存后即可正常打印
方案2:修改源码修复硬编码逻辑(适合二次开发场景)
找到源码路径/addons/account/models/ir_actions_report.py的第41行,原有代码为:
invoice_reports = (self.env.ref('account.account_invoices_without_payment'), self.env.ref('account.account_invoices'))
修改为增加缺失校验的逻辑:
# 兼容外部ID丢失场景 report_without_payment = self.env.ref('account.account_invoices_without_payment', raise_if_not_found=False) if not report_without_payment: report_without_payment = self.env.ref('account.account_invoices') invoice_reports = (report_without_payment, self.env.ref('account.account_invoices'))
修改完成后保存文件,重启Odoo服务即可生效
方案3:升级原生账户模块快速恢复
如果是之前卸载自定义发票模块导致原生ID被误删,可以直接升级原生account模块恢复:
命令行执行升级指令:
./odoo-bin -c 你的Odoo配置文件路径 -u account
升级完成后重启Odoo服务即可恢复原生的外部ID配置
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

