Odoo 16升级后XMLRPC PHP无法按编号查询发票问题
Odoo 16 升级后无法通过
ref 查询发票的排查方案 以下是几个可能的原因及对应的排查/解决步骤:
1. 发票编号存储字段变更
Odoo 16 对 account.move 字段的用途做了调整,部分场景下发票编号不再存储在 ref 字段中:
- 若使用了本地化模块(如拉美、欧洲地区的税务模块),发票编号可能转移到了
l10n_latam_document_number字段; - 标准场景下,正式发票的编号可能存储在
name字段(即发票的"编号"字段,而非参考号)。
排查方法:
直接查询数据库确认字段值:
SELECT id, ref, name, l10n_latam_document_number FROM account_move WHERE ref = '20230307118' OR name = '20230307118' OR l10n_latam_document_number = '20230307118';
如果查询到记录,调整你的搜索domain对应的字段即可。
2. 记录权限/访问规则限制
Odoo 16 调整了 account.move 的默认记录规则,当前用户可能没有权限查看目标发票:
- 比如默认规则可能限制用户只能查看自己创建的发票,或特定状态、类型的发票;
- 管理员账号不受此限制,可以先用管理员账号测试查询,看是否能返回结果。
解决方法:
- 检查
account.move的记录规则(路径:设置 → 技术 → 安全 → 记录规则); - 给当前用户分配对应的权限组,或调整记录规则以允许访问目标发票。
3. 数据迁移不完整
升级过程中 ref 字段的数据可能未正确迁移,或存在索引异常:
- 确认数据库中
account_move表的ref字段确实存在目标值; - 若数据存在但查询不到,尝试重建字段索引:
CREATE INDEX IF NOT EXISTS account_move_ref_idx ON account_move (ref);
4. 默认搜索上下文过滤
Odoo 16 的 search_read 方法可能携带了默认上下文,过滤了部分发票:
- 比如默认只显示已过账(
state = 'posted')的发票,而目标发票可能处于草稿状态; - 尝试在domain中明确指定状态,或清空上下文参数:
调整后的查询代码:
$result = $models->execute_kw($this->base, $uid, $this->pass, 'account.move', 'search_read', array(array(array('ref', '=', "20230307118"), array('state', 'in', ['draft', 'posted']))), array('context' => array()) );
内容的提问来源于stack exchange,提问作者user21457688
相关产品推荐
相关产品推荐

