ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

金蝶二次开发全指南:K/3与云星空插件实战解析

金蝶二次开发全指南:K/3与云星空插件实战解析 简介针对金蝶K/3平台的二次开发人员本压缩包整合了VB开发、控件应用与BOS扩展所需的全套参考资料可帮助ERP实施顾问、VB开发者解决前期资料分散、接口文档难找、控件调用不熟悉等典型问题。资源共118个文件压缩包整体约173.62MB文件类型以67个xls表格、30个pdf手册、9个chm帮助文档为主另含少量htm、docx、doc、zip等辅助文件。chm帮助文档覆盖BOS核心对象、函数参考与控件说明书支持全文搜索便于离线查阅xls多用于字段对照、参数清单、账表模板和示例数据帮助理解数据表结构pdf则涵盖VB语法入门、K3开发案例与实施指南。此外还包含控件ocx文件及VB学习资料可支撑从环境配置、控件注册到编码调试、接口联调的完整开发链路。目前已有1321人学习下载目录结构清晰适合金蝶K/3项目定制、插件开发及报表扩展等场景使用后既能积累常用接口调用范式也能减少控件注册和参数配置层面的重复摸索。1. 先搞清楚金蝶二次开发到底在开发什么在聊“全套资料”之前得先把目标对象掰扯清楚。很多刚入行的朋友一搜“金蝶二次开发”下载了一堆VB资料、控件包结果对着屏幕完全不知道从哪下手问题就出在没先搞明白自己到底要跟哪一代金蝶产品打交道。金蝶的产品线跨度非常大从老的KIS系列、K/3 WISE到后来的EAS、云星空再到现在的苍穹每一代的技术体系几乎是推倒重来的。拿二次开发最常碰到的两块来说K/3 WISE那套老体系核心是VB6时代的ActiveX COM组件开发模式是写ActiveX DLL插件注册到金蝶的窗体或单据事件里而云星空Cloud这套底层是.NET插件用C#写跑在BOS设计器里部署到IIS应用池上。要是你拿VB6那套思路去做云星空或者拿云星空的C#插件思路去改K/3基本是白费功夫。所以第一件事先对号入座。顺便说一句二次开发这个领域有个共性——你搞懂了金蝶这一套插件机制再去看热词里那些NX二次开发、SolidWorks二次开发、CATIA二次开发思路都是一样的无非是搞清楚宿主程序提供了哪些接口、事件、对象模型然后用宿主支持的编程语言去挂接和扩展。金蝶只是这个套路里特别典型的一个样本。1.1 K/3老体系的插件开发与VB的缘分K/3 WISE这套产品在国内企业里存量非常大哪怕到了今天还有很多工厂、贸易公司在用。它之所以跟VB绑得这么深是因为金蝶早期的BOS商业操作系统插件框架就是基于COM技术设计的而VB6是当年最顺手的COM开发工具加上K/3本身自带的二次开发工具又是VBA脚本所以老一代金蝶顾问几乎人手都会VB。这套体系下的开发大致有这么几类单据插件在采购订单、销售订单、生产领料单等单据的保存、审核、变更事件里挂代码做校验、算价格、写自定义字段。窗体插件给金蝶的基础资料维护界面加按钮、加查询逻辑。菜单插件在系统菜单里加自己的功能入口。报表插件利用金蝶的报表引擎做复杂统计。这些插件的载体清一色是ActiveX DLL用VB6编译出来后执行 regsvr32 注册到系统里再在金蝶的BOS集成开发平台里登记插件ID。典型的运行时报错比如“运行时错误429 ActiveX部件不能创建对象”十有八九就是某个插件DLL没注册或注册坏了。1.2 云星空时代从VB到C#再到WebAPIK/3再老也要面对现实金蝶这几年的主力产品早就切换到云星空了。云星空的技术栈比K/3现代化得多开发插件用的是C#和.NET Framework开发工具是Visual Studio配合金蝶官方的BOS设计器插件。你引用的程序集一般是 Kingdee.BOS.Core、Kingdee.BOS.ServiceHelper 这一系列插件类继承 AbstractBillPlugIn、AbstractFormPlugIn 这些基类重写 AfterButtonClick、OnSubmit 这类方法。云星空的集成方式也更多样化除了插件二次开发还有WebAPI可以直接对接像热词里提到的“MES系统对接金蝶云星空”走的就是WebAPI通路——打登录接口拿SessionID再调业务接口提交物料、工序、领料数据。甚至不用SDK直接拿着HTTP请求就能玩灵活度比老K/3高太多了。1.3 一套“全套资料”应该覆盖哪些内容回到最初的问题什么叫“全套”我看了网上很多人整理的金蝶二次开发资料包大部分就是几十个VB控件、一堆脚本、几个PDF这种资料说句实话当收藏夹可以真拿去干活是不够的。按我多年做项目的经验一套能够支撑从入门到上手的金蝶二次开发资料至少得包含这几块对应产品版本的安装程序和补丁以及开发端的环境配置说明。金蝶官方提供的接口文档或类型库说明文件很多时候直接在安装目录里。开发工具的教程K/3老体系就是VB6基础语法、ActiveX DLL编写、控件使用云星空就是C#基础、插件开发模型。一套完整的示例代码比任何文档都管用最好是从新建项目到注册部署全流程能跑的。常见报错处理手册比如429、80040154、控件装载失败这些遇到一个记一个。与第三方系统对接的接口约定比如凭证导入、基础资料同步、WebAPI调用的报文示例。缺了哪一块实际开发时都会卡壳。下面我就按这套标准把每一块的关键细节和实操要点拆开来聊聊。2. 环境搭建与基础工具链2.1 装好VB6不是双击Next那么简单如果你要啃老K/3的VB插件第一个拦路虎就是把VB6.0在现在的主流操作系统上装好、用好、不出幺蛾子。网上大家都说Win10专业版装K/3客户端v11的坑非常多其实VB6在Win10上类似老是提示兼容性问题。先说结论在Win10/Win11上装VB6有三件事必须做到位安装包最好用VB6中文企业版安装时选择“自定义”把企业版功能装全。装完后补上SP6运行库补丁否则很多控件行为和编译行为都不对。安装完成后找到 VB6.exe右键属性兼容性里勾上“以兼容模式运行这个程序”下拉框选Windows 7下面再把“以管理员身份运行此程序”勾上。不这么做编译ActiveX DLL时经常报“权限不足”或控件注册失败。如果IDE里打开工程文件时报“对象库未注册”之类的错别急着重装先用regsvr32把工程引用的几个关键库逐个注册一遍很多时候就恢复了。另外说个很多老手不会在文档里写的习惯VB6工程文件.vbp和窗体文件.frm是纯文本格式建议直接用记事本打开看看里面的引用路径。经常有前同事发的工程文件引用的DLL路径指向他本机的某个目录在你机器上就是找不到这时候手动把 .vbp 里的 Reference 路径改到正确位置比在IDE里一个个加引用快得多。2.2 控件的注册、管理与位宽问题VB6时代用的控件也好金蝶K/3自带的控件也好本质都是COM组件也就是后缀为 .ocx 或 .dll 的文件必须注册到系统里才能被开发环境和K/3运行时使用。这里最经典的坑就是64位系统下的位宽问题。控制面板里看到的regsvr32默认在 C:\Windows\System32 下是64位的。而金蝶K/3和VB6都是32位程序它们能识别的控件必须是32位版本注册32位控件时要用 C:\Windows\SysWOW64\regsvr32.exe 这个命令并且最好在管理员权限的命令行窗口里执行。比如注册一个经典的网格控件C:\Windows\SysWOW64\regsvr32.exe C:\MyControls\msflexgrid.ocx如果提示“DllRegisterServer调用失败”或者“没有注册类”下一步要先把控件文件拷到 C:\Windows\SysWOW64 目录下再用上面的命令注册。注册一个看一个别一口气注册一堆不然错了都分不清是哪个的问题。还有一种情况更隐蔽开发机器是32位XP时代的老机器编译好的DLL在这个环境里工作正常拿到64位Win10上就报429。原因就是开发机里很多系统级控件比如MSCOMCTL.OCX是自带的而新系统里没有得把控件文件连同安装包一起打包部署的时候逐个注册。2.3 IE安全设置与ActiveX运行前提老K/3客户端有很多功能是嵌在浏览器里跑的比如远程单据套打、文档控件加载。热词里有句很典型的报错“不能装载文档控件。请确保使用IE浏览器并检查浏览器的安全设置”。这句话在2015年左右几乎天天能看到。本质上的原因金蝶的文档控件NTKO大文件上传控件、金蝶套打控件都是ActiveX控件IE浏览器出于安全考虑默认禁用必须手动放行。操作路径是IE的“工具 - Internet选项 - 安全 - 可信站点”把K/3服务器的IP或域名加进去然后在“自定义级别”里把“ActiveX控件和插件”相关的几个选项全部改为“启用”或“提示”。还有一个容易漏的点是“安全 - Internet”区域里也要同样设置因为有些客户端访问服务器时不走可信站点的判断。现在新版本K/3客户端很多都改成了独立程序不依赖IE但存量老环境的运维里这套设置仍然几乎天天要用到。遇到“控件装载失败”、“上传控件无法加载”先别急着重装系统按这个逻辑走一遍80%能解决。3. 核心实操一个最小可跑的插件骨架3.1 K/3老体系ActiveX DLL插件的最简形态有环境、有控件了先跑通一个最小插件才是正事。K/3单据插件的开发流程我用一个最简单的示例来说明。在VB6里新建一个ActiveX DLL工程然后添加一个类模块金蝶的插件接口是通过引用金蝶安装目录下的类型库比如 K/3 安装目录下的 K3BOS 相关TLB文件来获取的不同的K/3版本类型库名称略有差异以你电脑上安装的为准。类模块里最核心的一件事是实现金蝶插件接口里的事件注册和事件处理。代码逻辑示意大概是这样 类模块MyOrderPlugin 注意具体接口名称以金蝶安装目录下类型库为准 Public Sub RegisterEvent(ByVal pBill As Object) 向金蝶单据对象注册我们需要处理的事件 pBill.AddEvent Save, MySaveEvent pBill.AddEvent Close, MyCloseEvent End Sub Public Sub MySaveEvent(ByVal pEvent As Object) Dim sMsg As String sMsg 单据保存前执行自定义逻辑 MsgBox sMsg 在这里可以读取单据字段、做校验、写自定义表 End Sub编译生成 .dll 文件后打开管理员命令行用32位regsvr32注册这个DLL然后在金蝶K/3的BOS集成开发平台里新建插件把DLL里的类名填进去绑定到对应的单据模板上。这样一张单据在保存时就会触发你的代码。这个流程看着简单但第一次做的人最容易栽在这几个地方一是忘注册DLL或注册的不是32位版本二是类名写错或者大小写不对三是金蝶类型库没有正确引用导致编译出来缺依赖。逐项排查基本就能跑通。3.2 云星空单据插件的开发与部署云星空的插件就温和多了纯C#不涉及控件注册但也有一层自己的门道。用Visual Studio新建一个类库项目通过NuGet或直接引用方式把云星空开发部署工具里的 Kingdee.BOS.Core.dll 那一系列程序集引进来然后继承单据插件基类。以热词里提到的“费用报销单二开插件”为例最简单的按钮点击插件长这样using Kingdee.BOS.Core.Bill.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Util; using System.ComponentModel; namespace MyExpensePlugIn { [Description(费用报销单自定义按钮)] public class MyExpenseButtonPlugIn : AbstractBillPlugIn { public override void AfterButtonClick(AfterButtonClickEventArgs e) { base.AfterButtonClick(e); if (e.Key.Equals(F_MyCustomButton, System.StringComparison.OrdinalIgnoreCase)) { this.View.ShowMessage(自定义按钮触发成功); } } } }编译成DLL后在BOS设计器里打开费用报销单的扩展把DLL放进去登记插件类名保存发布。云星空的插件部署到这里还没完如果你的系统是通过IIS发布的还需要把DLL拷贝到网站的Bin目录下重启应用池否则加载的还是旧版本。这一套流程里最容易忽略的就是“发布和重启”很多时候代码改了BOS设计器也保存了但线上就是不生效多半是Bin目录没同步或者应用池没有回收。3.3 WebAPI对接不走SDK也能调通云星空这套体系里我个人觉得最值得花时间学的是WebAPI对接。理由很实际MES、WMS、电商平台这些外部系统要跟金蝶交换数据你不可能在每个系统里都去引用金蝶的SDK走HTTP接口是最通用的方案。金蝶云星空WebAPI的基本流程分两步登录拿上下文再调用业务接口。登录接口通过HTTP POST一个JSON报文完成大概长这样curl -X POST http://yourserver/K3Cloud/Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUser.common.kdsvc \ -H Content-Type: application/json \ -d {\acctID\:\201\,\userName\:\administrator\,\password\:\123456\}返回的JSON里包含一个 Data 字段里面是登录后的上下文信息里面的 SessionID 就是后续调用的通行证。拿到它之后再带着它去调单据保存、审核、查询接口。很多初学者不知道的是后续的每个业务接口请求需要把SessionID作为JSON报文的一个固定字段传进去而不是放在HTTP Header里这是金蝶WebAPI跟RESTful风格最大的区别不注意这个老是提示登录失效。如果你想做“不使用SDK调用金蝶云星空WebAPI”完全可行只要照着接口文档拼JSON就行。实际项目里我还遇到过客户要求从老K/3非云星空对接那就要用K/3 WISE自带的WebAPI或中间表方案复杂度和踩坑点完全是另一个层级建议单独立项去搞。4. 高频报错与排查手册这么多年做金蝶二开遇到的报错没一百也有八十。这里我把网上问得最凶、项目里出现频率最高的几个整理成一个速查表方便按图索骥报错信息可能原因解决路径运行时错误429ActiveX部件不能创建对象插件DLL未注册或依赖的控件缺失用32位regsvr32注册DLL/OCX检查依赖链未知错误号80040154没有注册类32位/64位组件错配或组件文件损坏确认使用SysWOW64下的regsvr32重新注册不能装载文档控件/上传控件IE安全设置拦截ActiveX或控件未随客户端安装把服务器加入可信站点启用ActiveX相关选项regsvr32执行失败/拒绝访问权限不足或文件路径错误管理员身份运行CMD拷贝文件到SysWOW64再注册云星空插件手机端不生效移动端插件类型与PC端不同或未重新发布检查移动端插件基类重新编译并同步Bin目录VB6 IDE编译时提示找不到控件控件库未注册或引用路径失效regsvr32注册控件手动修改.vbp引用路径4.1 429和80040154这类COM错误怎么查这两个错误是K/3老体系里最常见的难兄难弟。官方解释“429 ActiveX部件不能创建对象”的意思是某个代码里用 CreateObject 或 New 创建COM对象时系统在注册表里找不到对应的组件。报出这个错第一步用 regedit 打开注册表去 HKEY_CLASSES_ROOT 下搜报错的组件名字看能不能搜到。搜不到就说明这个组件压根没注册搜到了还是报429多半是64位/32位注册表视角错位的问题。热门答案“金蝶K3运行时错误429”里大多数场景是给K/3做开发的机器上系统里缺了微软的公共控件库——MSCOMCTL.OCX、MSDATGRD.OCX、COMCTL32.OCX。这些老控件在Win10里不是系统自带的得手动拷贝到SysWOW64目录并注册。80040154的排查思路几乎一样唯一的区别是它更强调“类名或CLSID不存在”比429更具体。如果你在64位系统上用64位regsvr32去注册32位控件返回的就是这个错。解决方法说破不值钱——换SysWOW64下的regsvr32。4.2 控件装载失败与浏览器安全设置这条专门说下浏览器里的ActiveX问题。热词原文里的“检查浏览器的安全设置”几乎就是金蝶老版本Web端功能的标配报错。有人问我明明把站点加进了可信站点为什么还是装不上这里有个细节很容易被忽略——金蝶客户端访问服务器有时候是通过计算机名访问的有时候是通过IP地址访问的有时候是通过域名访问的。IE的“可信站点”是区分具体地址的你把 http://192.168.1.10 加了但用户实际访问的是 http://erp.xxx.com那自然还是要被拦。所以设置时候要把所有可能的访问地址都加上或者干脆把“Internet区域”的ActiveX也都启用了省得来回折腾。另外NTKO大文件上传控件这类老控件在IE11里面兼容性也算不上好需要把服务器站点加到“兼容性视图设置”列表里否则控件加载了也不显示。这些零零碎碎的小设置加起来就是金蝶老运维人员的日常。4.3 二开插件在手机端不生效热词里有一条很有代表性“金蝶云星空旗舰版费用报销单二开插件电脑端正常手机端没有起到作用”。这个问题很典型因为它暴露了云星空的一个设计差异PC端和移动端的插件机制不是完全等价的。云星空移动端比如钉钉、企微、App用的单据页面虽然是同一套元数据但运行时渲染引擎和应用环境完全不同。你写了一个继承自 AbstractBillPlugIn 的插件在PC端能跑到了移动端因为移动端运行环境不加载这个基类的逻辑自然就不生效。解决思路是移动端插件通常要继承 AbstractMobileBillPlugIn 之类的移动端专用基类或者在你的插件里判断运行环境分支处理。更省事的方法是让PC端插件把要显示的逻辑结果写入单据的自定义字段移动端用“移动端表单自定义控件”的方式把字段展示出来绕开插件差异。这类问题在设计期就要想清楚别等上线后用户拿手机爆出bug才开始排查。移动端的需求从一开始就要单独验证。5. 资料整理心得与避坑经验5.1 从零散资料到“全套资料”的整理方法最后聊聊开头那个命题金蝶二次开发的全套资料到底怎么搭。我自己的习惯是用一套固定的目录结构把乱七八糟的资料收拢起来分门别类放好01_开发环境 01_K3_Win7安装笔记.md 02_VB6_SP6安装说明.md 03_云星空插件开发环境配置.md 02_接口文档 K3_BOS接口_关键对象.md 云星空_WebAPI_登录与单据保存.md 03_控件库 MSCOMCTL.OCX MSFLXGRD.OCX 控件注册命令汇总.txt 04_示例代码 K3_VB_单据插件示例 云星空_C#_按钮插件示例 WebAPI_JSON示例 05_问题日志 429_80040154_排查记录.md IE控件装载失败_解决记录.md重点在05_问题日志这可能是最值钱的部分。网上下载的资料里永远不会有这一项但现实项目里那些“折腾了两天才解决”的问题才是经验的核心产出。每次踩坑后花十分钟记录比你收藏100个控件都有用。5.2 几个容易忽略的细节第一个容易被忽略的是版本匹配。K/3的补丁版本非常杂同一个接口在不同补丁下行为都可能不一样。开发前先确认客户的K/3是哪个版本、打了哪些补丁然后用一只专用的虚拟机搭建与生产环境一致的开发测试环境。否则你在自己电脑上验证得好好的一放到客户的服务器上就挂这种“环境依赖型”问题最磨人。第二个是数据库直连的诱惑与风险。很多二开需求比如凭证导入、领料单批量生成最快的方法是直接写SQL往K/3的数据库表里插数据。如果只读查询问题不大一旦涉及写操作就要极度谨慎。K/3的数据库表结构之间有大量外键关系和状态字段直接插入极易造成数据不一致轻则单据打不开重则影响结账。成熟的团队做法是优先走金蝶的标准接口、WebAPI或者导入工具实在要写库也必须在测试库完整验证并做好备份。5.3 最后再分享一个小技巧关于VB里那个老生常谈的DataGrid行数溢出问题网上讨论很多其实大多数场景是MSFlexGrid控件在64位系统上显示行数上限的马甲本质还是控件位宽和系统位宽不匹配。真正要做大数据量的表格展示建议绕开老控件把数据查询逻辑放到后端用分页思路去处理前端只展示当前页。这个思路不止适用于金蝶二开所有老技术栈遇到控件上限先别硬顶换一种交互方式反而更稳妥。我在实际项目里还有一个习惯遇到任何关于金蝶接口、控件、报错的新发现先记到笔记里等攒到十几个零散条目再花半天时间整理成一篇完整的排查笔记按产品版本分好类。日积月累之后这比任何网上流传的“全套资料”都更贴合你自己的项目场景。做金蝶二次开发拼的就是这些细节经验的厚度。本文还有配套的精品资源点击获取
返回列表