内码和分录是什么?
大约 7 分钟
内码和分录是什么?
这是金蝶 BOS 平台的术语习惯,原因如下:
为什么叫“分录”?
- 在金蝶的单据模型中,单据头(Header) + 单据体(Entry) 是核心结构。
- 单据体通常是一个“明细表格”,每一行代表一条业务记录(例如销售订单的每个商品行)。
- 在会计/ERP领域,这种明细行被称为 “分录”(Entry),源自会计分录概念:一张凭证可以有多条分录。
- 所以,表格控件对应的实体在元数据中叫 EntryEntity,其 Key 如
FSaleOrderEntry。
为什么 ID 叫“内码”?
- 金蝶平台对每个业务对象(单据、基础资料、分录行)都有一个 唯一标识字段,通常是数据库主键(
FID、FEntryID)。 - 官方术语称这个主键为 “内码”,区别于用户看到的“编号”(Number)或“名称”(Name)。
- 内码是系统内部使用的稳定标识,避免因编号变更导致引用失效。
- 在 ORM 或 WebAPI 中,字段名通常是
xxx_Id(如FMaterialId_Id),表示该字段对应的基础资料的内码。
✅ 总结:
- 分录 = 单据体的明细行集合(EntryEntity)。
- 内码 = 系统内部唯一标识(数据库主键),用于关联和引用。
操作表(分录)
下面把 在金蝶 K3Cloud/BOS 插件中操作表格(分录 Entry) 所需的 相关 API 方法按使用场景完整列举,并附最小示例代码。
术语说明:表格=分录(Entry);列=字段(Field);行以 0 开始的索引访问。
参考来源含官方社区的新手汇总与插件教程,详见文末引用。
A. 定位“哪个表”(拿到分录 Entry 的 Key / 实体)
常用方法
this.View.BusinessInfo.GetEntryEntity(entryKey)—— 获取分录实体(EntryEntity)。this.View.BusinessInfo.GetField(fieldKey)—— 获取字段元信息(列定义)。this.View.Model.GetEntryRowCount(entryKey)—— 获取分录行数。this.View.Model.GetEntityDataObject(entryEntity)—— 获取整表的DynamicObjectCollection(每一行一个DynamicObject)。this.View.UpdateView(entryKey)/this.View.UpdateView(fieldKey, rowIndex)—— 刷新界面。
示例
// 例如销售订单的明细分录键常为 "FSaleOrderEntry"
var entry = this.View.BusinessInfo.GetEntryEntity("FEntity"); // 或 "FSaleOrderEntry"
int rowCount = this.View.Model.GetEntryRowCount("FEntity");
var rows = this.View.Model.GetEntityDataObject(entry); // 所有行对象
B. 定位“哪一行”(获取行索引)
常用方法
this.View.GetControl<EntryGrid>(entryKey)—— 获取分录表格控件。EntryGrid.GetCurrentRowIndex()—— 取当前焦点行索引。- 也可循环
0..rowCount-1逐行处理。
示例
var grid = this.View.GetControl<EntryGrid>("FEntity");
int currentRow = grid.GetCurrentRowIndex(); // 焦点行
C. 获取/设置“某一列”的值(字段级 API,基于行索引)
常用方法
this.View.Model.GetValue(fieldKey, rowIndex)—— 取单元格值(显示值/对象)。this.View.Model.SetValue(fieldKey, value, rowIndex)—— 设单元格值。this.View.UpdateView(fieldKey, rowIndex)—— 刷新该列该行的界面显示(可选)。
示例
var qty = this.View.Model.GetValue("FQty", rowIndex);
var price= this.View.Model.GetValue("FPrice",rowIndex);
this.View.Model.SetValue("FQty", 10, rowIndex);
this.View.Model.SetValue("FPrice", 9.99m, rowIndex);
this.View.UpdateView("FPrice", rowIndex); // 可选刷新
D. “整表/整行对象”读写(ORM 级 API:DynamicObject)
常用方法
this.View.Model.GetEntityDataObject(entryEntity)—— 返回DynamicObjectCollection。- 行对象读写:
rowObj["FieldKey"](如rowObj["Qty"])。 - 读取基础资料“内码”:
rowObj["MaterialId_Id"]。
示例
var entry = this.View.BusinessInfo.GetEntryEntity("FEntity");
var rows = this.View.Model.GetEntityDataObject(entry);
for (int i = 0; i < rows.Count; i++)
{
DynamicObject r = rows[i];
decimal qty = Convert.ToDecimal(r["Qty"]);
r["Qty"] = qty + 1; // 写到对象
}
this.View.UpdateView("FEntity"); // 同步刷新整表
E. 行维护(新增/删除/清空)
常用方法
this.View.Model.CreateNewEntryRow(entryKey)—— 在末尾新增一行。this.View.Model.DeleteEntryRow(entryKey, rowIndex)—— 删除指定行。this.View.Model.DeleteEntryData(entryKey)—— 清空整表。this.View.Model.CopyEntryRow(entryKey, srcIndex, destIndex)—— 复制行(若版本提供)。- 维护后使用
this.View.UpdateView(entryKey)刷新。
示例
this.View.Model.CreateNewEntryRow("FEntity");
this.View.Model.DeleteEntryRow("FEntity", rowIndex);
this.View.Model.DeleteEntryData("FEntity");
this.View.UpdateView("FEntity");
F. 保存/提交/审核(把内存数据“落库”)
SetValue/修改DynamicObject仅改内存与界面;不会自动写数据库。需执行“保存”或 WebAPI。 [github.com]
常用方法(前端表单)
this.View.InvokeFormOperation("Save")—— 触发内置“保存”。this.View.InvokeFormOperation("Submit")/"Audit"/"UnAudit"—— 触发提交/审核/反审核。
示例
// 设值后触发保存
this.View.Model.SetValue("FNote", "由插件写入");
this.View.InvokeFormOperation("Save");
(WebAPI 的 DynamicFormService.Save/Submit/Audit/UnAudit 为服务端接口,另见官方文档) [zjgkd.cn]
G. 列表页(List 插件)获取选中行/主键并拉取明细
常用方法
this.ListView.SelectedRowsInfo—— 选中行集合,含PrimaryKeyValue(通常 FID)。- 结合
ExecuteBillQuery/View(WebAPI)或QueryHelper再取详细字段。
示例
public class MyListPlugin : AbstractListPlugIn
{
public override void BarItemClick(BarItemClickEventArgs e)
{
var selected = this.ListView.SelectedRowsInfo;
foreach (var row in selected)
{
var pk = row.PrimaryKeyValue; // FID
// 按主键再查详细数据(ExecuteBillQuery/QueryHelper)
}
}
}
H. 其他常用界面/模型辅助
常用方法
this.View.ShowMessage(...)/ShowWarnningMessage(...)—— 提示交互。this.View.GetControl("FieldKey").SetFocus()—— 设置控件焦点。this.Model.GetPKValue()/this.View.Model.DataObject["Id"]—— 取当前单据头主键。- 生命周期事件(动态表单):
PreOpenForm、OnSetBusinessInfo、OnSetLayoutInfo、AfterBindData等,用于动态增列、控制加载顺序。 [gitcode.com]
小结(与你的理解对齐)
- 取某一列的值:先确定 行索引(
EntryGrid.GetCurrentRowIndex()或遍历),再用Model.GetValue(fieldKey, rowIndex)。 - 拿整表:先确定 Entry 的 Key(如
FEntity/FSaleOrderEntry),再用Model.GetEntityDataObject(entry)或逐行GetValue读取。 - 变更后持久化:调用
InvokeFormOperation("Save")或服务端 WebAPI 的Save/Submit/Audit。 [github.com], [zjgkd.cn]
参考资料
- 金蝶云社区《新手入门插件实操汇总》:列出了 表单/列表/动态表单 插件的常用方法与事件(取值、赋值、分录操作、刷新、调用表单操作等)。 [github.com]
- 博客园《K3 Cloud 插件开发新手指导 + 代码调试》:给出了 EntryEntity、DynamicObject、DbUtils 的典型用法与示例。 [gitee.com]
- 知乎专栏《动态表单插件事件详解》:详细说明 生命周期事件(
OnSetBusinessInfo/OnSetLayoutInfo/AfterBindData等)与Context/Model/View的角色。 [gitcode.com]
如果你告诉我 具体表单的 EntryKey 与几个列的 FieldKey,我可以给你一段 可复制就能跑 的模板(含:取当前行、取指定行、取整表、赋值并保存)。
金蝶的所有表
金蝶 K3/BOS 系统中,数据库表结构庞大且按功能模块划分清晰,以下列出常见核心数据表及其简要作用,覆盖元数据、基础资料、单据事务、配置和日志等多个维度:
🧩 元数据管理相关表
| 表名 | 作用 |
|---|---|
T_META_OBJECTTYPE | 业务对象元数据主表 |
T_META_FORMENUM / T_META_FORMENUMITEM | 枚举类型及枚举项 |
T_META_CONVERTRULE | 单据转换规则元信息 |
T_BF_WriteBackRule | 反写规则的定义表 |
T_META_CONSOLEDETAIL | 表单/菜单元数据 |
📦 基础资料(Master Data 表)
| 表名 | 作用 |
|---|---|
T_BD_MATERIAL / T_BD_MATERIAL_L | 物料主数据及多语言字段 |
T_BD_STOCK | 仓库信息 |
T_BD_DEPARTMENT | 部门 |
T_BD_STAFF | 员工 |
T_BD_OPERATOR | 业务员 |
T_BD_SUPPLIER | 供应商 |
T_BD_CUSTOMER | 客户 |
T_BD_UNIT / T_BD_UNIT_L | 计量单位及其多语言字段 |
🧾 单据事务类表
| 表名 | 作用 |
|---|---|
T_PUR_POORDER | 采购订单(表头) |
T_PUR_PRICELIST | 采购价目表 |
T_PUR_RECEIVE | 采购收料 |
T_SAL_ORDER | 销售订单 |
T_SAL_OUTSTOCK | 销售出库单 |
T_STK_INSTOCK | 入库单 |
T_STK_INVENTORY | 即时库存快照 |
T_AP_PayBill | 应付付款单 |
T_AR_Receivable | 应收单 |
T_GL_Voucher | 凭证表 |
⚙️ 制造/生产模块表
| 表名 | 作用 |
|---|---|
T_ENG_BOM | 物料清单 |
T_PRD_MO | 生产订单 |
T_PRD_INSTOCK | 生产入库 |
T_PRD_MORPT | 生产报告 |
T_PRD_PICKMTRL | 生领料单 |
T_PRD_RETURNMTRL | 生产退料单 |
委外相关表(T_SUB_*) | 委外订单/材料回写等 |
🛠 配置与日志表
| 表名 | 作用 |
|---|---|
T_BAS_SysParameter | 系统参数 |
T_BAS_UserParameter | 用户参数 |
T_BAS_FormParameter | 界面/单据参数 |
t_bas_operateLog / _BK | 操作日志 |
T_BAS_LOG | 系统日志 |
T_BAS_SCHEDULELOG | 定时任务日志 |
T_BAS_WEBAPILOG | WebAPI 调用日志 |
🧩 流程与反写相关表
| 表名 | 作用 |
|---|---|
T_BF_DefVersion | 业务流程版本 |
t_BF_Publish / t_BF_PublishEntry | 流程发布元数据 |
T_BF_Instance | 流程实例表 |
t_bf_writebackrule | 反写规则 |
t_bf_InstanceSnap | 反写记录快照 |
ℹ️ 其它常用辅助表
- 维度扩展表:如
T_BD_FLEXAUXPROPERTY、T_BD_FLEXITEMPROPERTY - 网控相关:如
T_BAS_NETWORKCTRLOBJECT、T_BAS_NETWORKCTRLRECORDS - 反写 / 转换元数据:如
T_META_TRACKERBILLTABLE、T_META_CONVERTRULE
如果你有特定模块或 FormId,如某个单据或基础资料想查对应“所有表”(主表 + L 多语言表 + Entry 分录表等),告诉我对象名称,我可以进一步给你该对象的核心表结构一览。