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.的错误。 - 针对性解决:
- 若需覆盖所有报表的合并流程,请使用
OnBeforeMergeDocumentEx——这是OnBeforeMergeDocument的官方替代事件,触发逻辑与旧事件一致,兼容所有布局类型。 - 若确实要使用
OnCustomDocumentMergerEx,需先给目标报表配置并启用自定义布局(在报表的「布局」页签中添加自定义布局并设为默认),同时在事件处理代码中必须向DocumentStream写入生成的有效文档流(比如通过报表渲染逻辑生成PDF/Word数据),不能仅设置IsHandled := true却无输出。 - 检查事件订阅的参数拼写:确认
Codeunit::ReportManagement和事件名OnCustomDocumentMergerEx无拼写错误,true, true对应的SkipOnMissingLicense和SkipOnMissingPermission参数设置是正确的,但需确保当前用户有报表布局相关权限。
- 若需覆盖所有报表的合并流程,请使用
内容的提问来源于stack exchange,提问作者Luke_
相关产品推荐
相关产品推荐

