Skip to content

自定义对象

另有 28 种语言版本

English · Español · 日本語 · Português (Brasil) · Français · Deutsch · Italiano · 한국어 · Português (Portugal) · 繁體中文 · Bahasa Indonesia · Türkçe · Polski · Tiếng Việt · ไทย · Nederlands · العربية · עברית · Українська · हिन्दी · Русский · Svenska · Dansk · Norsk bokmål · Suomi · Español (México) · Français (Canada) · Deutsch (Schweiz)

In a truck body shop, a custom white box body hangs on chains above a standard truck chassis, already fitted with its doors, lights and mud flaps.
图片由 AI 生成

第 3 个模块,共 10 个,属于 Data Architect 课程第 3 章Salesforce 数据架构。每个模块都可以单独阅读。 上一篇:看向母舰:标准数据模型 · 下一篇:这些数据放在哪里?

**本模块回答的问题:**当 Salesforce 没有你需要的东西时,你自己构建一个对象,实际上会得到什么?

在上一个模块里,我们看了 Salesforce 已经构建好的东西。有时候它没有你需要的东西。Steve Trucking 经营卡车,而 Salesforce 没有标准的卡车对象。所以你自己构建一个:一个自定义对象。

这是我希望你在这个模块里看到的。自定义对象是在元数据中创建的,就像模块 1 里讲的其他一切一样,而它一存在,就自带一套标准功能。它不是一张空白的表。而你为创建它而填写的那个界面,正在问你架构问题,不管你有没有注意到。

进入设置 → 对象管理器 → Create → Custom Object,你会看到一张很长的表单。大多数人填完前两个框就点保存。我们放慢速度,把它读一遍。

Label 和 Plural Label(标签和复数标签)。“Truck”和“Trucks”。这些是用户看到的,出现在选项卡、页面布局和报表里。以后修改它们不会太痛苦。

Object Name(对象名称)。这一个不一样:它是 API 名称,是代码、集成、报表以及现在的智能体所使用的名称。输入“Truck”,Salesforce 就会把它变成 Truck__c。以后修改它,意味着要找出所有引用它的地方,这又是第 1 章里的可逆性测试。第一次就把它定对。

Description(描述)。把它填上。每一次都要填。在模块 1 里我说过,元数据不再只是装饰:下一位管理员会读它,每一个试图理解你 org 的 AI 工具也会读它。一个描述为空的自定义对象,就是一个没贴标签的箱子。

Record Name(记录名称)。每个自定义对象都有一个名称字段,你在这里决定它是什么。一个文本(Text)名称,比如“Truck 117”,或者一个自动编号(Auto Number),比如 T-000184,由 Salesforce 替你填写。读一读那个界面上的警告:如果你打算通过 API 插入大量记录,Salesforce 会告诉你使用文本。这是在你还没创建一条记录之前,平台就在告诉你一些关于规模的事。

New Custom Object 界面的 Record Name 部分:Record Name 框、数据类型为 Text,以及如果你打算通过 API 插入大量记录就使用 Text 数据类型的警告

Salesforce 设置,New Custom Object:Record Name 部分及其警告(截图,2026-10-12)。 查看大图

Optional Features(可选功能)。Allow Reports、Allow Activities、Track Field History、Allow in Chatter Groups。默认都是关闭的。每一项都是你为这个对象打开的一项能力;要有意识地决定。

Object Classification(对象分类)。Allow Sharing、Allow Bulk API Access、Allow Streaming API Access,默认都是打开的。界面说得很直白:这些打开时,对象是 Enterprise Application 对象;关闭时,它是 Light Application 对象。这些名称与 Salesforce 的应用订阅许可相对应:Lightning Platform Light App 没有记录级共享,也不能使用 Bulk API 或 Streaming API,而 Enterprise App 可以。我的建议:除非你确切知道为什么不要,否则让它们保持打开。如果你在一个以后要大批量加载数据的对象上关闭了 Bulk API 访问,你就会明白它为什么重要了。

Deployment Status(部署状态)和 Search(搜索)。“In Development”会在你构建时对用户隐藏这个对象;“Deployed”则让它上线。而 Allow Search(允许搜索)默认是关闭的,所以在你把它打开之前,用户在全局搜索里找不到这些记录。这一点每次都会让人中招。

Object Classification、Deployment Status 和 Search Status 部分:Allow Sharing、Allow Bulk API Access 和 Allow Streaming API Access 已勾选;已选择 Deployed;Allow Search 未勾选

默认设置:三项 API 设置打开、Deployed、Allow Search 关闭(截图,2026-10-12)。 查看大图

点击保存,对象管理器就会向你展示这个对象:API 名称 Truck__c、Custom 处打了勾、各个标签、部署状态。不过,看看左侧那一栏:Fields & Relationships、Page Layouts、Lightning Record Pages、Record Types、Validation Rules、Triggers、Flow Triggers、Object Access、Field Access。这个列表就是把模块 1 变得看得见。对象不只是存储;它是所有这些行为挂靠的地方。

对象管理器中的 Truck 对象:API Name 为 Truck__c、已勾选 Custom、单数和复数标签,以及左侧从 Fields & Relationships 到 Validation Rules 的列表

对象管理器,Truck:API 名称 Truck__c、Custom,以及挂在一个对象上的所有东西(截图,2026-10-12)。 查看大图

在一个全新的自定义对象上打开 Fields & Relationships,它已经有字段了。每个自定义对象都会得到一套标准字段:

  • Name(名称),也就是你刚刚选定的记录名称,用在页面布局、相关列表、查找和搜索结果里。
  • Owner(所有人),拥有这条记录的用户或队列。
  • Created By(创建人)和 Last Modified By(上次修改人),创建它以及最后修改它的用户。
  • Currency(币种),如果启用了多币种;以及 Division(部门),如果你的 org 使用部门。

而在底层,还有模块 1 里讲过的记录 ID,以及创建日期和修改日期。用 Data Loader 导出几条记录,你就能看到它们全部。

其中有一个可能会消失。把你的自定义对象设为主从关系中的从对象一方,Owner 字段就会消失:所有权改为来自主记录。这件事比听起来更重要,我们会在模块 7 和模块 8 里再回到它。

在上一个模块里我说过,标准对象没有前缀也没有后缀。其他一切都有,而一旦你能读懂它们,一个字段列表就能准确告诉你你看到的是什么。

它看起来是什么样它是什么
Account、Case标准对象或标准字段:没有前缀,没有后缀
Truck__c自定义对象,或者自定义字段,比如 Unit_Number__c
abc__Inspection__c来自托管软件包的自定义对象:abc 是供应商的命名空间
Delivery_History__b大对象(模块 4)
Shipment__x外部对象:数据存放在另一个系统里(模块 4)
Allergies__pc个人客户上的自定义联系人字段(模块 2)
Truck__r在查询中沿着自定义查找关系走时,它背后的那个关系

有几点需要注意。

到这里,这还只是一个列表。下面是我的讲法:把它当作几层来看。对象有三种:标准对象、自定义对象和托管软件包对象,而每一种上面都可以有同样几类字段:它自带的标准字段,以及某个人添加的自定义字段。

标准对象。Account 没有前缀也没有后缀,它的标准字段也没有:Name、Industry、OwnerId。你可以给大多数标准对象添加自定义字段,而你添加的每一个都以 __c 结尾:Region__c(Custom Fields (opens in a new tab),英文)。正是这个后缀保护了你。Salesforce 会在它的版本中给客户对象添加新的标准字段,而因为你的字段总是以 __c 结尾,它们的永远不会,所以未来的标准字段永远不会和你已有的字段冲突。

**自定义对象。**你自己的对象以 __c 结尾,比如 Truck__c(Custom Objects (opens in a new tab),英文),你放在它上面的自定义字段也一样:Unit_Number__c。但它与生俱来的那些字段,也就是上一节讲的那些,是标准字段:Name、OwnerId、CreatedDate,没有后缀。所以即使在你自己的对象上,后缀也能告诉你每个字段是谁创建的。

托管软件包对象。当你从 AppExchange 安装一个托管软件包时,它的对象和字段都带有供应商的命名空间前缀:abc__Inspection__c,以及像 abc__Result__c 这样的字段。这个前缀是供应商独有的,而且不会改变(Namespace Prefix (opens in a new tab),英文)。用 Salesforce 自己的话说,前缀会被添加到每个组件上,让它独一无二:name__c 变成 prefix__name__c(AppExchange Object Prefixes and the API (opens in a new tab),英文)。所以两个供应商可以都发布一个叫 Invoice__c 的对象,彼此之间、和你之间都永远不会冲突。软件包的对象仍然有它们的标准字段 Name 和 OwnerId,不带前缀。软件包也可以给标准对象添加它自己带前缀的字段,比如客户上的 abc__Score__c。而你也可以给软件包的对象添加你自己的自定义字段:abc__Inspection__c 上的 Depot__c 带的是你的 __c 后缀,但永远不会带供应商的前缀,因为它是你创建的,不是他们创建的(Known Issue: unmanaged custom field on a managed package object (opens in a new tab),英文)。

读懂名称 三种对象,每种都按同样的四层来读。标准对象,由 Salesforce 构建:Account;它的标准字段,例如 Name、OwnerId 和 Industry,没有后缀;托管软件包可以添加自己的字段,例如 abc__Score__c;你的自定义字段以 __c 结尾,例如 Region__c。自定义对象,由你构建:Truck__c;它的标准字段 Name、OwnerId 和 CreatedDate 没有后缀;没有软件包字段,因为对象是你的;你的自定义字段以 __c 结尾,例如 Unit_Number__c。托管软件包对象,从供应商 abc 安装:abc__Inspection__c;它的标准字段没有前缀;软件包自己的字段带有前缀,例如 abc__Result__c;而你添加的字段,例如 Depot__c,带你的 __c 后缀,但绝不带供应商的前缀。底部:无后缀是 Salesforce 的,__c 是自定义的,abc__ 是供应商的,而且永远不变。 标准对象 由 Salesforce 构建 对象 Account 它的标准字段 Name、OwnerId、Industry:无后缀 软件包的字段 abc__Score__c,如果有软件包添加 你的自定义字段 Region__c 自定义对象 由你构建 对象 Truck__c 它的标准字段 Name、OwnerId、CreatedDate:无后缀 软件包的字段 没有:对象是你的 你的自定义字段 Unit_Number__c 托管软件包对象 已安装,来自供应商 abc 对象 abc__Inspection__c 它的标准字段 Name、OwnerId、CreatedDate:无前缀 软件包的字段 abc__Result__c 你的自定义字段 Depot__c:你的后缀,绝不带他们的前缀 无后缀:Salesforce 的。__c:自定义。abc__:供应商的,而且永远不变。 © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

读任何一个 API 名称,你都知道它是谁创建的。没有后缀:Salesforce。有 __c 但没有前缀:你的 org。前面有 abc__:供应商。每次你计划一项变更时,这都很重要。你的东西,你可以改。Salesforce 的东西,你可以配置和扩展。供应商的东西大多是锁定的:少数几样,比如页面布局和帮助文本,可以由你编辑,但软件包的大部分内容以及每一个 API 名称都属于供应商,他们的升级会带来他们的变更(Editable Properties After Package Promotion or Installation (opens in a new tab),英文)。

**非托管软件包没有前缀。**安装一个非托管软件包,它的对象就会落进你的 org,就好像是你自己构建的一样,没有前缀。如果它带来一个 Truck__c,而你已经有一个了,你就遇到了名称冲突。安装之前先检查。

创建自定义对象很容易;正因为如此,我认为我们创建得太多了。New Custom Object 界面会很乐意在一个已经有客户对象的 org 里为你创建一个 Customer__c。所以在你点下去之前,先问上一个模块里的那个问题:**母舰是不是已经有这个了?**如果有,就用它。如果没有,就构建它,并且像架构师一样把整个界面填完。

下一个模块会问一个更早的问题:这些数据到底应不应该放在 Salesforce 里?

  • 在构建自定义对象之前,Salesforce 是否已经有一个标准对象可以做这件事。
  • API 名称,一次定好;以及一段为人和机器而写的描述。
  • 记录名称:文本还是自动编号,同时考虑你预期的数据量。
  • 要打开哪些可选功能、API 访问和搜索,有意识地决定。
  • 一个 org 里的后缀告诉你什么:自定义、托管、大对象、外部对象、个人客户。
  • 你即将安装的软件包是否可能和你已经构建的东西冲突。