前言:为什么先学建模
如果说第一篇帮你“搭好了灶台”,那第二篇就是教你“怎么做菜”。在金蝶云星空开发中,业务建模是一切功能的起点——无论是审批流、报表、还是插件逻辑,都依附于业务对象本身。BOS IDE的可视化建模能力非常强大,绝大多数的单据配置不需要写一行代码。但正因为选项多、可配置性强,新手也容易迷失在海量的属性面板中。
这一篇的目标是:让你能独立完成一张完整业务单据的设计——从零创建、配置字段、设置编码规则、分配权限,到最终发布到主控台可用。全程以一张“销售报价单”为实战案例,每个知识点都结合这个案例展开。
第1章:BOS IDE可视化建模入门
1.1 子系统、业务对象、元数据的概念辨析
在开始操作前,先厘清三个核心概念:
| 概念 | 含义 | 层级关系 |
|---|---|---|
| 子系统 | 业务领域的分组,如“供应链”→“采购管理” | 最高层级 |
| 业务对象 | 具体的单据、基础资料、报表等 | 隶属于子系统 |
| 元数据 | 描述业务对象结构的XML数据(字段、布局、规则等) | 业务对象的定义文件 |
通俗理解:子系统是文件夹,业务对象是文件,元数据是文件的内容。在BOS IDE中,你设计的就是业务对象的元数据。
打开BOS IDE的步骤:
- 登录金蝶云星空客户端(不是Web端,是Windows客户端程序)
- 点击“协同开发”菜单 → “BOS IDE”
- 在左侧选择你的子系统(如“供应链”),点击“新建”开始设计
1.2 新建单据的三种方式
BOS IDE提供了三种新建单据的方式:
| 方式 | 适用场景 | 特点 |
|---|---|---|
| 空白对象 | 从零设计全新单据 | 自由度高,所有配置需要手动完成 |
| 复制 | 基于现有单据拷贝修改 | 继承被复制单据的所有字段和布局 |
| 继承 | 基于现有单据派生子类 | 父单据修改时子单据自动同步变更 |
实战推荐:初次学习建议选择“空白对象”,从零开始会让你对每个配置项都有概念。后续实际项目中,如果业务与标准单据高度相似,可选择“复制”以提高效率。
实战操作:新建一张“销售报价单”
- 在BOS IDE左侧树中,右键“供应链”→“销售管理”,选择“新建”→“单据”
- 输入名称:“销售报价单”,编码建议使用你开发商标识+业务名,如
DEM_SaleQuote - 选择“空白对象” → 确定
- 此时BOS IDE右侧会显示一个空白的单据设计界面
1.3 单据界面布局:分割容器、面板、页签控件
在BOS IDE中,单据界面由控件树构成,核心布局控件有三个:
分割容器:用于将界面划分为左右或上下两个区域。在“销售报价单”中,我们通常需要:
- 左/上区域:单据头(主字段)
- 右/下区域:单据体(分录明细)
面板:承载普通字段的容器,相当于一个“分组框”。可将单据头的字段按逻辑分组,如“客户信息”“报价明细”“审批信息”等。
页签控件:允许多个页签切换,适合字段较多需要分页展示的场景。销售报价单如果字段不多,可以不用页签。
布局层次(从上到下):
表单根节点 ├── 分割容器(水平分割) │ ├── 上面板:单据头区域 │ │ ├── 面板1:基本信息 │ │ ├── 面板2:客户信息 │ │ └── 面板3:金额汇总 │ └── 下面板:单据体区域 │ └── 单据体控件:报价明细分录第2章:字段与控件详解
2.1 基础字段类型
从工具栏拖拽字段到设计界面时,会弹出字段类型选择窗口。以下是开发中使用频率最高的几种字段:
| 字段类型 | 适用场景 | 数据库存储类型 |
|---|---|---|
| 基础资料字段 | 引用其他单据或基础资料(如客户、物料、供应商) | 整型(存储ID) |
| 文本字段 | 单行文本(如名称、备注) | nvarchar |
| 大文本字段 | 多行长文本(如详细说明) | ntext |
| 数字字段 | 整数或小数(如数量、单价、金额) | decimal |
| 日期字段 | 日期或日期时间(如报价日期、有效期) | datetime |
| 布尔字段 | 是/否开关(如是否含税) | bit |
实战配置“销售报价单”字段清单:
| 字段标识 | 字段名称 | 类型 | 说明 |
|---|---|---|---|
| FBillNo | 单据编号 | 文本 | 由编码规则自动生成 |
| FDate | 报价日期 | 日期 | 默认取当前日期 |
| FCustomerId | 客户 | 基础资料(客户) | 必填 |
| FContactPerson | 联系人 | 文本 | |
| FValidDays | 有效期(天) | 数字 | |
| FIsTaxIncluded | 是否含税 | 布尔 | |
| FTotalAmount | 报价总金额 | 数字 | 由明细自动汇总 |
| FRemark | 备注 | 大文本 |
2.2 下拉列表的选项风格与编辑风格
基础资料字段有两种表现风格:
选项风格(下拉框):从预设的列表中选择。适用于枚举值固定的字段,如“报价状态”(草稿/已提交/已确认/已失效)。
- 配置方式:在字段属性中设置“枚举类型”,手动添加选项列表
编辑风格(弹出选择):点击放大镜图标弹窗选择。适用于基础资料(如客户、物料),需要关联到对应的基础资料对象。
- 配置方式:在“引用属性”中设置关联的基础资料
实战操作:为“销售报价单”添加“报价状态”下拉字段
- 拖拽“基础资料字段”到界面
- 字段标识:
FQuoteStatus,名称:“报价状态” - 在属性面板的“枚举类型”中新建枚举,添加项:
- 草稿(值为0)
- 已提交(值为1)
- 已确认(值为2)
- 已失效(值为3)
2.3 单据体(分录)设计与主从表关联
单据体是金蝶云星空中实现“一对多”关系的关键控件——一张单据头对应多条分录行。
配置步骤:
- 从工具栏拖拽“单据体”控件到界面(通常放在分割容器的下半部分)
- 在单据体内拖入字段:物料、数量、单价、含税单价、金额、含税金额、备注等
销售报价单分录字段清单:
| 字段标识 | 名称 | 类型 | 说明 |
|---|---|---|---|
| FMaterialId | 物料 | 基础资料(物料) | 必填 |
| FQty | 数量 | 数字 | |
| FPrice | 单价 | 数字 | |
| FTaxPrice | 含税单价 | 数字 | 自动计算 |
| FAmount | 金额 | 数字 | 数量×单价,自动计算 |
| FTaxAmount | 含税金额 | 数字 | 数量×含税单价 |
| FDeliveryDate | 交货日期 | 日期 | |
| FLineRemark | 行备注 | 文本 |
关键配置:单据体的“关联字段”属性要设置为单据头的ID字段(通常是FID),这样才能建立主从关系。
2.4 字段默认属性设置
在BOS IDE中,每个字段的属性面板有许多配置项,以下是几个最重要且常被忽略的设置:
“列表默认显示”:勾选后,该字段会在单据列表界面默认显示。如果不勾选,用户需要在列表设置中手动添加。
- 建议:单据编号、日期、客户、总金额、状态等核心字段勾选
“支持引出引入”:控制该字段是否允许被Excel引出/引入。
- 建议:绝大多数业务字段都应勾选,系统字段(如创建人、修改时间等)可不勾选
“必填”:控制字段是否必须输入。在“校验规则”中配置会更灵活(可设置条件必填),后续章节会讲。
“锁定”:控制字段是否可编辑。有些字段(如单据状态)应锁定不允许用户手动修改。
实战操作:配置“报价日期”默认为当前日期
- 选中
FDate字段,在属性面板的“默认值”中填入表达式:=DateTime.Now()
第3章:单据类型与编码规则
3.1 单据类型配置与业务对象绑定
单据类型是金蝶云星空中一个特殊的概念——它本身是一个基础资料,用于区分同一张单据的不同业务场景。
举个例子:“销售报价单”可能有“标准报价”和“紧急报价”两种业务场景,它们共用同一张单据的字段结构,但编码规则、工作流、审批层级可能不同。这时就可以通过两个单据类型来实现。
配置步骤:
- 在BOS IDE中打开“销售报价单”设计器
- 点击菜单“单据”→“单据类型”
- 点击“新增”,输入编码和名称,选择“绑定业务对象”为当前单据
3.2 编码规则设计
编码规则决定了单据编号的生成格式。一个合理设计的编码规则应具备:唯一性、可读性、可追溯性。
编码规则组成:由多个“段”拼接而成,常用段类型:
| 段类型 | 说明 | 示例 |
|---|---|---|
| 常量 | 固定字符 | SQ(报价单前缀) |
| 日期段 | 年月日 | 20260803 |
| 流水号段 | 自动递增数字 | 0001、0002 |
| 字段值 | 取单据某个字段的值 | 取组织编码、部门编码 |
实战设计“销售报价单”编码规则:SQ-{年月日}-{4位流水号}
- 第1段:常量
SQ- - 第2段:日期段,格式
yyyyMMdd - 第3段:流水号段,位数4位,起始值1
配置步骤:
- 在BOS IDE中打开“销售报价单”设计器
- 菜单“单据”→“编码规则”
- 点击“新增”,按上述三段配置
- 保存后将此编码规则设为默认
💡提示:流水号段务必设置足够的位数(建议4位或6位),避免业务量大时流水号溢出。生产环境中建议预留更多位数。
3.3 网络控制配置(防并发修改)
网络控制是金蝶云星空的多用户协作机制——防止两个人同时编辑同一张单据导致数据覆盖。
配置方式:在单据属性中找到“网络控制”设置
- 控制字段:通常选择
FModifyTime(修改时间)或FModifierId(修改人) - 控制策略:保存时校验,如果其他人已修改则提示并禁止保存
建议:所有业务单据都应启用网络控制,这是数据一致性的基本保障。
第4章:权限体系设计
权限控制是企业管理软件的核心能力。金蝶云星空的权限体系分为三层:功能权限(能否看到菜单)、字段权限(能否看到/编辑某个字段)、数据权限(能看到哪些数据行)。
本章重点讲解功能权限配置。
4.1 权限对象列表新增与权限项配置
权限对象是一组权限项的集合,一个业务对象对应一个权限对象。
创建权限对象的步骤:
- 在BOS IDE中打开“销售报价单”设计器
- 菜单“单据”→“权限对象列表”
- 点击“新增”,输入权限对象编码
DEM_SaleQuote_Perm,名称“销售报价单权限” - 在权限项列表中配置以下权限项:
| 权限项编码 | 权限项名称 | 说明 |
|---|---|---|
| View | 查看 | 查看单据列表和详情 |
| Create | 新增 | 创建新单据 |
| Edit | 修改 | 修改已有单据 |
| Delete | 删除 | 删除单据 |
| Submit | 提交 | 提交审批 |
| Audit | 审核 | 审核通过 |
| UnAudit | 反审核 | 撤销审核 |
4.2 权限控制设置:绑定权限对象
创建完权限对象后,需要将其绑定到业务对象上:
- 打开“销售报价单”设计器属性面板
- 找到“权限对象”属性,选择刚才创建的
DEM_SaleQuote_Perm - 在“操作列表”中,为每个操作(保存、提交、审核等)绑定对应的权限项
操作绑定权限项后,无权限的用户执行该操作时会提示“您没有此操作的权限”。
4.3 功能发布到主控台
权限配置完,单据还需要发布到主控台(即系统菜单),用户才能看到入口。
发布步骤:
- 在BOS IDE中打开“销售报价单”设计器
- 菜单“单据”→“发布到主控台”
- 选择发布位置(如“供应链”→“销售管理”)
- 设置菜单显示名称和图标
- 点击“发布”
发布成功后,在Web端刷新页面,就能在主控台看到“销售报价单”菜单了。
4.4 用户授权与权限验证
授权操作(在Web端进行):
- 用管理员账户登录系统
- 进入“系统管理”→“权限管理”→“用户授权”
- 选择目标用户 → 点击“授权”
- 在权限树中找到“销售报价单”权限对象,勾选相应的权限项
- 保存生效
验证方法:
- 用被授权的用户登录,查看是否能访问“销售报价单”菜单
- 尝试执行新增、修改、审核等操作,验证各权限项是否生效
第5章:值更新与实体服务规则
前面的配置都是“静态设计”,这一章开始涉及“动态行为”——当用户操作时,系统如何自动响应。
5.1 值更新事件的触发机制
值更新(Value Update)是BOS中应用最广泛的动态行为——当某个字段的值发生变化时,自动更新其他字段的值。
值更新的触发方式:
- 字段值变更:用户修改了某个字段的值
- 系统自动触发:通过公式或实体服务规则触发
值更新的执行顺序(重要):
- 用户修改字段值
- 触发该字段的“值更新”事件
- 按照值更新列表中注册的规则依次执行
- 若多个规则修改同一字段,后执行的覆盖先执行的
5.2 实体服务规则的配置与应用场景
实体服务规则(Entity Service Rule)是值更新的核心配置方式。它由三要素组成:
- 触发条件:什么情况下执行(如字段值变化、操作执行前等)
- 执行动作:具体做什么(如计算字段值、设置字段可见性、校验数据等)
- 执行顺序:多个规则之间的先后顺序
实战案例:销售报价单的自动计算
场景1:计算明细行金额
- 规则名称:“计算行金额”
- 触发条件:数量
FQty或单价FPrice变化时 - 执行动作:
FAmount = FQty * FPrice
配置步骤:
- 在BOS IDE中打开“销售报价单”,选中单据体字段
FAmount - 在属性面板中找到“值更新” → 点击“…”按钮
- 新增实体服务规则:
- 条件:
FQty <> 0 AND FPrice <> 0 - 公式:
FAmount = FQty * FPrice
- 条件:
场景2:汇总报价总金额
- 规则名称:“汇总总金额”
- 触发条件:单据体中任意行金额
FAmount变化时 - 执行动作:
FTotalAmount = Sum(FAmount)
配置步骤:
- 选中单据头字段
FTotalAmount - 在“值更新”中新增规则:
- 条件:无条件执行
- 公式:
FTotalAmount = Sum(FAmount)
5.3 校验规则设计与业务拦截
校验规则用于在数据保存前验证业务合法性。校验不通过则阻止保存并提示用户。
常见校验场景:
- 必填项校验:客户、物料不能为空
- 业务逻辑校验:数量必须大于0,有效期必须大于当前日期
- 跨字段校验:含税单价不能小于不含税单价
实战配置“销售报价单”校验规则:
校验1:报价明细不能为空
- 校验时机:保存前
- 校验公式:
Count(FEntity) > 0 - 错误提示:“报价明细至少录入一行”
校验2:有效期必须大于0
- 校验时机:保存前
- 校验公式:
FValidDays > 0 - 错误提示:“有效期天数必须大于0”
配置步骤:
- 打开单据设计器 → 菜单“单据”→“校验规则”
- 点击“新增”,填写上述配置
- 校验级别选择“错误”(阻止保存)
第6章:设计最佳实践
以下经验来自大量项目的沉淀,可以帮你少踩很多坑。
6.1 单表字段总数不超过50个
金蝶官方建议:单张单据的字段总数(含隐藏字段)应控制在50个以内。超过50个会严重影响单据打开、保存的性能。
如何控制:
- 能不存的字段不存(如临时计算的结果可不存数据库)
- 能合并的字段合并(如用组合字段代替多个独立字段)
- 超过50个字段时,应考虑拆分单据或使用页签+延迟加载
6.2 框架布局停靠元素数量限制
在BOS IDE中,每个面板、分割容器、页签等都是布局元素。当布局层次超过5层时,会影响界面渲染性能。
建议:
- 避免嵌套过多分割容器(2层以内)
- 面板数量控制在3-5个
- 页签数量控制在5个以内
6.3 基础资料表单主键建议使用整型
设计基础资料(如自定义的“报价类型”基础资料)时,主键字段建议使用整型而非文本。
原因:
- 整型索引效率高,在大数据量下查询性能显著优于文本
- 整型占用的存储空间小
- 在关联查询中,整型关联速度更快
配置方式:在基础资料设计器中,主键字段类型选择“整数”。
本章实战总结:销售报价单完整设计清单
至此,“销售报价单”的完整配置已完成。回顾一下你都做了哪些工作:
- ✅ 创建了“销售报价单”业务对象(空白对象方式)
- ✅ 设计了单据头字段:编号、日期、客户、联系人、有效期、是否含税、总金额、状态、备注
- ✅ 设计了单据体分录:物料、数量、单价、含税单价、金额、含税金额、交货日期、行备注
- ✅ 配置了编码规则:
SQ-{yyyyMMdd}-{4位流水号} - ✅ 启用了网络控制
- ✅ 创建了权限对象并配置了权限项
- ✅ 发布到主控台(供应链→销售管理)
- ✅ 配置了值更新规则:行金额自动计算、总金额自动汇总
- ✅ 配置了校验规则:分录不为空、有效期大于0
现在你可以登录Web端,找到“销售报价单”菜单,尝试新增一张单据——输入客户、物料、数量、单价,观察金额是否自动计算。如果一切正常,你已经掌握了BOS IDE的核心建模能力!
下一篇预告
下一篇我们将进入插件开发阶段。建模完成的是“骨骼”,插件赋予的是“灵魂”——通过C#代码,你可以实现任何复杂的业务逻辑。第三篇将详解表单插件、列表插件、服务插件等所有插件类型,并给出大量可直接运行的代码示例。
练习题:
- 为“销售报价单”再配置一个“紧急报价”单据类型,编码规则设为
SQU-{yyyyMMdd}-{4位流水号}- 增加一个校验规则:当“是否含税”为是时,含税单价必须大于0
- 尝试在BOS IDE中复制一张标准单据(如“销售订单”),观察其字段布局和规则配置,与你自己设计的“销售报价单”对比差异