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

Business Central中'OnCustomDocumentMergerEx'事件未触发问题咨询

问题描述

我近期重构代码时,替换了已弃用的OnBeforeMergeDocument事件订阅,并通过以下代码绑定新事件:

[EventSubscriber(ObjectType::Codeunit, Codeunit::ReportManagement, 'OnCustomDocumentMergerEx', '', true, true)]
local procedure OnCustomDocumentMergerEx(ObjectID: Integer; ReportAction: Option SaveAsPdf,SaveAsWord,SaveAsExcel,Preview,Print,SaveAsHtml; ObjectPayload: JsonObject; XmlData: InStream; LayoutData: InStream; var DocumentStream: OutStream; var IsHandled: Boolean)
var
    Test: Text;
begin
    Test := 'test';
    IsHandled := true;
end;

我预期该事件会像OnBeforeMergeDocument一样,在预览、打印或发送报表(如Business Central>已过账销售发票>打印/发送>打印)时触发,但实际未触发,还出现错误提示The custom report layout for '' is empty.,请问原因是什么?

原因分析与解决办法
  • 事件触发范围差异:OnCustomDocumentMergerEx仅在报表使用自定义布局(如自定义RDLC、Word布局)进行文档合并时才会触发,而旧的OnBeforeMergeDocument会在所有报表的合并流程前触发,无论使用内置还是自定义布局。你测试的已过账销售发票如果用的是默认内置布局,自然不会触发这个新事件。
  • 错误根源:你在事件中直接设置IsHandled := true,但未向DocumentStream写入任何有效文档内容。当系统尝试调用自定义合并逻辑却得不到有效输出时,就会抛出The custom report layout for '' is empty.的错误。
  • 针对性解决:
    1. 若需覆盖所有报表的合并流程,请使用OnBeforeMergeDocumentEx——这是OnBeforeMergeDocument的官方替代事件,触发逻辑与旧事件一致,兼容所有布局类型。
    2. 若确实要使用OnCustomDocumentMergerEx,需先给目标报表配置并启用自定义布局(在报表的「布局」页签中添加自定义布局并设为默认),同时在事件处理代码中必须向DocumentStream写入生成的有效文档流(比如通过报表渲染逻辑生成PDF/Word数据),不能仅设置IsHandled := true却无输出。
    3. 检查事件订阅的参数拼写:确认Codeunit::ReportManagement和事件名OnCustomDocumentMergerEx无拼写错误,true, true对应的SkipOnMissingLicense和SkipOnMissingPermission参数设置是正确的,但需确保当前用户有报表布局相关权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:30:33