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

Odoo供应商发票视图过滤特殊发票失效问题求助

问题分析与解决办法

可能的失效原因

1. 未正确覆盖原生供应商发票动作

Odoo原生的供应商发票动作ID就是account_move_supplier_invoice_action,如果仅直接创建同名记录,可能因模块加载顺序晚于account模块、未使用继承修改方式,导致原动作的domain规则未被覆盖,系统仍沿用原生过滤逻辑。

2. 布尔字段NULL值匹配问题

若factura_especial字段创建时未设置default=False,旧的普通供应商发票记录中该字段值为NULL。PostgreSQL中NULL不等于False,此时("factura_especial", "=", False)的过滤条件无法匹配NULL值,但如果原动作未被覆盖,反而会导致特殊发票(值为True)未被过滤。

3. 字段权限缺失

当前用户若没有factura_especial字段的读取权限,Odoo会自动忽略涉及该字段的domain条件,导致过滤规则失效,特殊发票仍会出现在普通供应商发票列表中。

对应的解决办法

针对原因1:正确覆盖原生动作

通过继承方式修改原动作的domain,确保覆盖原生规则:

<record id="account_move_supplier_invoice_action" model="ir.actions.act_window">
    <field name="inherit_id" ref="account.account_move_supplier_invoice_action"/>
    <field name="domain" position="replace">
        [("move_type", "=", "in_invoice"), ("factura_especial", "!=", True)]
    </field>
</record>

同时在模块的__manifest__.py中设置'depends': ['account'],保证模块加载顺序在account模块之后。

针对原因2:处理NULL值匹配问题

将过滤条件改为匹配"非True"的值,覆盖NULL和False两种情况:

<field name="domain">[("move_type", "=", "in_invoice"), ("factura_especial", "!=", True)]</field>

同时给字段设置默认值,避免新记录出现NULL:

factura_especial = fields.Boolean(string="Factura Especial", default=False)

若已有旧记录,可通过SQL批量更新NULL值:

UPDATE account_move SET factura_especial = FALSE WHERE factura_especial IS NULL AND move_type = 'in_invoice';

针对原因3:确保字段权限

在字段定义中关联对应用户组,保证用户拥有读取权限:

factura_especial = fields.Boolean(string="Factura Especial", default=False, groups="account.group_account_user")

额外排查:清除个人过滤器

若用户保存过自定义搜索过滤器,会覆盖动作的domain规则。进入普通供应商发票列表,点击搜索框旁的过滤器按钮,选择重置为默认即可清除自定义过滤条件。

内容的提问来源于stack exchange,提问作者damar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 16:43:30