You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:18:02