跳至主要內容

内码和分录是什么?

Entity大约 7 分钟

内码和分录是什么?

这是金蝶 BOS 平台的术语习惯,原因如下:


为什么叫“分录”?

  • 在金蝶的单据模型中,单据头(Header) + 单据体(Entry) 是核心结构。
  • 单据体通常是一个“明细表格”,每一行代表一条业务记录(例如销售订单的每个商品行)。
  • 在会计/ERP领域,这种明细行被称为 “分录”(Entry),源自会计分录概念:一张凭证可以有多条分录。
  • 所以,表格控件对应的实体在元数据中叫 EntryEntity,其 Key 如 FSaleOrderEntry

为什么 ID 叫“内码”?

  • 金蝶平台对每个业务对象(单据、基础资料、分录行)都有一个 唯一标识字段,通常是数据库主键(FIDFEntryID)。
  • 官方术语称这个主键为 “内码”,区别于用户看到的“编号”(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); // 所有行对象

[github.com]open in new window, [gitee.com]open in new window


B. 定位“哪一行”(获取行索引)

常用方法

  • this.View.GetControl<EntryGrid>(entryKey) —— 获取分录表格控件。
  • EntryGrid.GetCurrentRowIndex() —— 取当前焦点行索引。
  • 也可循环 0..rowCount-1 逐行处理。

示例

var grid = this.View.GetControl<EntryGrid>("FEntity");
int currentRow = grid.GetCurrentRowIndex(); // 焦点行

[github.com]open in new window


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);     // 可选刷新

[github.com]open in new window


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"); // 同步刷新整表

[gitee.com]open in new window


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");

[github.com]open in new window


F. 保存/提交/审核(把内存数据“落库”)

SetValue/修改 DynamicObject 仅改内存与界面;不会自动写数据库。需执行“保存”或 WebAPI。 [github.com]open in new window

常用方法(前端表单)

  • 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]open in new window


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)
        }
    }
}

[github.com]open in new window


H. 其他常用界面/模型辅助

常用方法

  • this.View.ShowMessage(...) / ShowWarnningMessage(...) —— 提示交互。
  • this.View.GetControl("FieldKey").SetFocus() —— 设置控件焦点。
  • this.Model.GetPKValue() / this.View.Model.DataObject["Id"] —— 取当前单据头主键。
  • 生命周期事件(动态表单):PreOpenFormOnSetBusinessInfoOnSetLayoutInfoAfterBindData 等,用于动态增列、控制加载顺序。 [gitcode.com]open in new window

小结(与你的理解对齐)

  • 取某一列的值:先确定 行索引EntryGrid.GetCurrentRowIndex() 或遍历),再用 Model.GetValue(fieldKey, rowIndex)
  • 拿整表:先确定 Entry 的 Key(如 FEntity/FSaleOrderEntry),再用 Model.GetEntityDataObject(entry) 或逐行 GetValue 读取。
  • 变更后持久化:调用 InvokeFormOperation("Save") 或服务端 WebAPI 的 Save/Submit/Audit[github.com]open in new window, [zjgkd.cn]open in new window

参考资料

  • 金蝶云社区《新手入门插件实操汇总》:列出了 表单/列表/动态表单 插件的常用方法与事件(取值、赋值、分录操作、刷新、调用表单操作等)。 [github.com]open in new window
  • 博客园《K3 Cloud 插件开发新手指导 + 代码调试》:给出了 EntryEntity、DynamicObject、DbUtils 的典型用法与示例。 [gitee.com]open in new window
  • 知乎专栏《动态表单插件事件详解》:详细说明 生命周期事件OnSetBusinessInfo/OnSetLayoutInfo/AfterBindData 等)与 Context/Model/View 的角色。 [gitcode.com]open in new window

如果你告诉我 具体表单的 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_WEBAPILOGWebAPI 调用日志

🧩 流程与反写相关表

表名作用
T_BF_DefVersion业务流程版本
t_BF_Publish / t_BF_PublishEntry流程发布元数据
T_BF_Instance流程实例表
t_bf_writebackrule反写规则
t_bf_InstanceSnap反写记录快照

ℹ️ 其它常用辅助表

  • 维度扩展表:如 T_BD_FLEXAUXPROPERTYT_BD_FLEXITEMPROPERTY
  • 网控相关:如 T_BAS_NETWORKCTRLOBJECTT_BAS_NETWORKCTRLRECORDS
  • 反写 / 转换元数据:如 T_META_TRACKERBILLTABLET_META_CONVERTRULE

如果你有特定模块或 FormId,如某个单据或基础资料想查对应“所有表”(主表 + L 多语言表 + Entry 分录表等),告诉我对象名称,我可以进一步给你该对象的核心表结构一览。