如何实现Microsoft Business Central向JavaScript回传数据
BC与扫描设备JavaScript端双向通信实现方案
你当前已经在用的Microsoft.Dynamics.NAV.InvokeExtensibilityMethod是BC客户端扩展控件的标准通信接口,本身就支持双向调用,完全不需要通过读写txt文件的中转方案,直接按以下步骤配置即可实现BC向JS回传数据:
1. JS侧预注册全局回调方法
在扫描设备端运行的JS脚本中,将用于接收BC数据、更新屏幕显示的方法挂载到全局作用域,确保BC客户端可以直接寻址到该方法:
// 方法名可自定义,后续BC侧调用时保持名称一致即可 function UpdateScreenDisplay(businessData) { // 此处编写扫描屏的渲染逻辑 const displayContent = JSON.parse(businessData); // 示例:将BC返回的商品名、库存数、库位信息渲染到屏幕 scannerDisplay.show({ title: displayContent.itemName, subTitle: `库存:${displayContent.stockQty}`, extra: `库位:${displayContent.locationCode}` }) }
注意:不要将该方法定义在闭包或局部作用域内,BC客户端默认从全局window对象下检索待调用的JS方法
2. BC侧(AL语言)直接调用JS方法
在BC端对应的扩展控件逻辑中,处理完JS上报的条码、查询完库存等业务数据后,直接通过控件的InvokeMethod方法向JS侧推送数据即可:
// 该段为BC侧AL代码,写在你已有的BarcodeRead事件触发逻辑中 trigger BarcodeRead(BCode: Text) var Item: Record Item; ReturnJson: JsonObject; ReturnText: Text; begin // 原有根据条码查询库存/业务信息的逻辑 Item.SetRange(GTIN, BCode); if Item.FindFirst() then begin ReturnJson.Add('itemName', Item.Description); ReturnJson.Add('stockQty', Item.Inventory); ReturnJson.Add('locationCode', Item."Location Code"); ReturnJson.WriteTo(ReturnText); // 核心调用:直接触发JS侧注册的回调方法,传入序列化后的业务数据 CurrPage.ScannerAddin.InvokeMethod('UpdateScreenDisplay', ReturnText); end; end;
方案对比优势
- 无磁盘IO开销,通信延迟为毫秒级,运行效率远高于文件中转方案
- 不存在文件锁、读写权限、路径适配等问题,稳定性更高
- 为BC官方原生支持的扩展通信机制,兼容BC14及之后所有正式发布版本,Windows客户端、Web客户端部署场景均适用
若你使用的扫描设备是基于BC Web客户端的webview承载,注意不要开启CSP策略阻止脚本全局方法访问,否则会出现调用失败的问题。
内容的提问来源于stack exchange,提问作者sosbarnabas
相关产品推荐
相关产品推荐

