Dynamics NAV 2018持SUPER权限运行对象报权限错误排查
问题场景复现
- 自定义Codeunit场景:
新建ID为50006、名称为Prova的Codeunit,OnRun触发器代码如下:
按Ctrl+R运行时报错:OnRun() MESSAGE('Hello');You do not have the following permissions on CodeUnit Prova: Execute,当前用户已分配SUPER权限集,怀疑与许可证相关。 - 自定义报表场景:
新建报表,OnPreReport触发器代码如下:
运行时报错:OnPreReport() PurchHeader.GET('CF-181003'); PurchHeader."Buy-from Vendor No." := 'RONALDO'; PurchHeader.MODIFY;You do not have the following permissions on TableData Purch. Inv. Header: Modify。
根因说明
两类报错的核心触发逻辑一致:NAV的权限校验分两层,第一层是许可证层面的全局授权(决定该许可证下所有用户能操作的对象/数据范围),第二层是用户/权限集层面的业务授权(决定单用户能访问的功能范围)。即使用户持有SUPER权限集,也无法突破许可证层面的全局权限限制,这也是绝大多数SUPER用户遇权限报错的核心原因。
排查解决步骤
针对Codeunit Execute权限报错
- 核查许可证自定义对象范围
打开C/SIDE开发环境,依次点击Tools > License Information查看当前服务端加载的许可证:- 查看
Licensed Range字段,确认50006这个对象ID落在许可证授权的自定义对象区间内。NAV默认自定义对象区间为50000-99999,部分受限客户许可证、轻量伙伴许可证会收窄该范围,ID不在授权区间内的自定义对象,所有用户都无执行权限。 - 查看
Permissions for Object Type列表中Codeunit类型的权限项,确认自定义Codeunit有Execute级授权。
- 查看
- 重新编译对象
在对象设计器中选中ID为50006的Codeunit,按Ctrl+F11触发全量编译,确认编译无报错。未正常编译、编译时依赖了无授权对象的Codeunit,也会抛出Execute权限错误。 - 校验SUPER权限集生效范围
依次进入Departments > Administration > IT Administration > General > Users,找到当前登录账号:- 确认分配的SUPER权限集
Company字段为空(即对所有公司生效),若绑定了指定公司,跨公司访问对象会报权限错。 - 选中SUPER权限行,点击
Permissions按钮,确认ID为50006的Codeunit未被手动裁剪Execute权限。
- 确认分配的SUPER权限集
- 验证方法:开发环境下临时上传Partner级开发者许可证,若运行Codeunit能正常弹出
Hello提示,即可100%确认原许可证授权不足。
针对Purch. Inv. Header Modify权限报错
- 核查许可证表级权限
同样在License Information页面,找到TableData类型下ID为122的Purch. Inv. Header表,确认当前许可证对该表有Modify权限。注意:终端用户持有的Full User/Limited User许可证,默认对已过账的财务类核心表无直接Modify权限,这类表设计上仅允许通过标准过账、更正流程更新数据,禁止直接修改。 - 校验权限集表权限配置
打开SUPER权限集的配置详情,确认TableData类型的Purch. Inv. Header被授予Read/Insert/Modify/Delete全权限,无手动裁剪项。 - 排查自定义拦截逻辑
若环境做过定制开发,检查是否有第三方扩展、自定义事件订阅挂载在该表的Modify触发点上,做了额外的权限拦截——财务核心表通常会被加自定义校验,禁止直接后台改数。
生产环境禁止直接修改
Purch. Inv. Header这类已过账财务表,会导致业务流、财务对账数据不一致,优先通过红字冲销、更正发票等标准业务流程调整数据。
内容的提问来源于stack exchange,提问作者kuhi
相关产品推荐
相关产品推荐

