点击Validate按钮添加Journal分录行报错求助(action_invoice_open())
解决已过账日记账无法添加分录的问题
看来你是在Odoo环境里碰到的这个问题对吧?这个报错的核心原因其实很直白:你是在日记账已经被标记为「已过账(posted)」之后,才尝试添加额外分录,而Odoo对已过账的日记账有严格的编辑限制——只允许修改少量非核心字段,所以直接触发了系统的保护提示。
下面给你具体的解决思路和代码示例:
问题根源拆解
action_invoice_open()这个方法的执行流程是:验证发票 → 生成对应日记账 → 自动将日记账标记为已过账状态。你原来的逻辑是在点击「Validate」按钮(也就是调用这个方法)之后才去添加分录,这时候日记账已经处于不可编辑的posted状态了,自然会被系统拦截。
核心解决方案:调整操作顺序,在过账前添加分录
我们需要把添加额外分录的逻辑,挪到日记账过账之前执行——也就是在action_invoice_open()完成日记账生成,但还没触发过账的节点插入代码。
代码实现(以Odoo 12为例,其他版本可按需调整)
重写action_invoice_open()方法,先处理分录添加,再执行原方法的过账逻辑:
from odoo import models, api class AccountInvoice(models.Model): _inherit = 'account.invoice' @api.multi def action_invoice_open(self): # 先为每个发票对应的草稿状态日记账添加额外分录 for invoice in self: if invoice.move_id and invoice.move_id.state == 'draft': # 根据你的业务需求调整字段值,比如目标账户、金额、分录说明等 self.env['account.move.line'].create({ 'move_id': invoice.move_id.id, 'account_id': self.env.ref('account.account_expense').id, # 替换为你的目标账户ID 'debit': 0.0, 'credit': 100.0, # 示例金额,按需修改 'name': '系统自动添加的额外分录', 'partner_id': invoice.partner_id.id, 'company_id': invoice.company_id.id, }) # 再执行原方法的发票验证和日记账过账逻辑 res = super(AccountInvoice, self).action_invoice_open() return res
针对Odoo 14+版本的适配
如果是较新的Odoo版本,发票验证的方法已经改为action_post(),可以重写这个方法来实现:
from odoo import models, api class AccountMove(models.Model): _inherit = 'account.move' def action_post(self): # 在过账前检查并添加额外分录 for move in self: # 可选:只针对发票类型的日记账处理,缩小范围 if move.move_type in ['out_invoice', 'in_invoice'] and move.state == 'draft': self.env['account.move.line'].create({ 'move_id': move.id, 'account_id': self.env.ref('account.account_expense').id, 'debit': 50.0, 'credit': 0.0, 'name': '自定义额外分录', 'partner_id': move.partner_id.id, }) return super().action_post()
额外注意事项
- 务必保证添加的分录满足借贷平衡,否则日记账过账时会触发会计校验错误
- 如果涉及多公司部署,一定要指定
company_id字段,避免跨公司数据混乱 - 先在测试环境验证逻辑,确认分录添加正常且过账无问题后,再部署到生产环境
内容的提问来源于stack exchange,提问作者vbt
相关产品推荐
相关产品推荐

