Các đối tượng tùy chỉnh
Cũng có bằng 28 ngôn ngữ khác
English · Español · 日本語 · Português (Brasil) · Français · Deutsch · Italiano · 한국어 · 简体中文 · Português (Portugal) · 繁體中文 · Bahasa Indonesia · Türkçe · Polski · ไทย · Nederlands · العربية · עברית · Українська · हिन्दी · Русский · Svenska · Dansk · Norsk bokmål · Suomi · Español (México) · Français (Canada) · Deutsch (Schweiz)

Mô-đun 3 trong 10 của chương Kiến trúc dữ liệu Salesforce, chương 3 của khóa học Data Architect. Mỗi mô-đun có thể đọc độc lập. Trước: Hãy nhìn về phi thuyền mẹ: các mô hình dữ liệu chuẩn · Tiếp theo: Dữ liệu này nằm ở đâu?
Câu hỏi mô-đun này trả lời: Khi Salesforce không có sẵn, bạn thực sự nhận được gì khi tự xây đối tượng của mình?
Ở mô-đun trước chúng ta đã xem những gì Salesforce đã xây sẵn. Đôi khi nó không có thứ bạn cần. Steve Trucking vận hành xe tải, và không có đối tượng chuẩn nào tên là Xe tải (Truck). Vậy bạn tự xây một cái: một đối tượng tùy chỉnh.
Đây là điều tôi muốn bạn thấy trong mô-đun này. Một đối tượng tùy chỉnh được tạo trong siêu dữ liệu, như mọi thứ khác ở mô-đun 1, và ngay khoảnh khắc nó tồn tại, nó đã đi kèm một bộ chức năng chuẩn. Nó không phải một cái bảng trống. Và màn hình bạn điền để tạo ra nó đang hỏi bạn những câu hỏi kiến trúc, dù bạn có để ý hay không.
Màn hình tạo đối tượng tùy chỉnh mới
Phần tiêu đề “Màn hình tạo đối tượng tùy chỉnh mới ”Vào Thiết lập → Trình quản lý đối tượng → Tạo → Đối tượng tùy chỉnh (Setup → Object Manager → Create → Custom Object) và bạn sẽ có một biểu mẫu dài. Phần lớn mọi người điền hai ô đầu tiên rồi nhấp Lưu. Hãy chậm lại và đọc nó.
Nhãn và Nhãn số nhiều (Label, Plural Label). “Truck” và “Trucks”. Đây là những gì người dùng nhìn thấy, trong tab, bố cục trang và báo cáo. Bạn có thể đổi chúng sau này mà không mấy đau đớn.
Tên đối tượng (Object Name). Cái này thì khác: đó là tên API, cái tên mà mã, tích hợp, báo cáo và giờ đây cả tác tử sử dụng. Gõ “Truck” và Salesforce biến nó thành Truck__c. Đổi nó sau này nghĩa là phải tìm mọi thứ tham chiếu đến nó, và đó lại là Phép thử khả năng đảo ngược từ chương 1. Hãy làm đúng cái này ngay từ lần đầu.
Mô tả (Description). Hãy điền vào. Mọi lần. Ở mô-đun 1 tôi đã nói siêu dữ liệu không còn là đồ trang trí nữa: quản trị viên tiếp theo đọc nó, và mọi công cụ AI cố gắng hiểu org của bạn cũng vậy. Một đối tượng tùy chỉnh có phần mô tả trống là một chiếc hộp không dán nhãn.
Tên bản ghi (Record Name). Mọi đối tượng tùy chỉnh đều có một trường Tên (Name), và đây là nơi bạn quyết định nó là gì. Một tên dạng Văn bản (Text), như “Truck 117”, hoặc một Số tự động (Auto Number), như T-000184, do Salesforce điền giúp bạn. Hãy đọc lời cảnh báo trên màn hình đó: nếu bạn định chèn một khối lượng lớn bản ghi qua API, Salesforce bảo bạn dùng Văn bản. Đó là nền tảng đang nói với bạn điều gì đó về quy mô trước cả khi bạn tạo bản ghi đầu tiên.

Thiết lập Salesforce, New Custom Object: phần Record Name, cùng lời cảnh báo của nó (ảnh chụp màn hình, 2026-10-12). Xem kích thước đầy đủ
Tính năng tùy chọn (Optional Features). Cho phép báo cáo (Allow Reports), Cho phép hoạt động (Allow Activities), Theo dõi lịch sử trường (Track Field History), Cho phép trong nhóm Chatter (Allow in Chatter Groups). Mặc định đều tắt. Mỗi cái là một khả năng bạn đang bật cho đối tượng này; hãy quyết định có chủ đích.
Phân loại đối tượng (Object Classification). Cho phép chia sẻ (Allow Sharing), Cho phép truy cập Bulk API (Allow Bulk API Access), Cho phép truy cập Streaming API (Allow Streaming API Access), mặc định đều bật. Màn hình nói thẳng ra: khi bật các mục này, đối tượng là một đối tượng Enterprise Application; khi tắt, nó là một đối tượng Light Application. Những cái tên đó khớp với các giấy phép đăng ký ứng dụng của Salesforce: một Lightning Platform Light App không có chia sẻ ở cấp bản ghi và không thể dùng Bulk API hay Streaming API, còn một Enterprise App thì có thể. Lời khuyên của tôi: hãy để chúng bật, trừ khi bạn biết chính xác vì sao không. Tắt quyền truy cập Bulk API trên một đối tượng mà sau này bạn sẽ nạp dữ liệu khối lượng lớn, và bạn sẽ hiểu vì sao nó quan trọng.
Trạng thái triển khai và tìm kiếm (Deployment Status, Search). “Đang phát triển” (In Development) ẩn đối tượng khỏi người dùng trong lúc bạn xây nó; “Đã triển khai” (Deployed) đưa nó vào hoạt động. Còn Cho phép tìm kiếm (Allow Search) mặc định tắt, nên người dùng sẽ không tìm thấy các bản ghi này trong tìm kiếm toàn cục cho đến khi bạn bật nó lên. Cái này lần nào cũng làm người ta vấp.

Các giá trị mặc định: ba thiết lập API bật, Deployed, và Allow Search tắt (ảnh chụp màn hình, 2026-10-12). Xem kích thước đầy đủ
Nhấp Lưu, và Trình quản lý đối tượng hiển thị đối tượng cho bạn: tên API Truck__c, một dấu tích ở Tùy chỉnh (Custom), các nhãn, trạng thái triển khai. Nhưng hãy nhìn xuống cột bên trái: Trường & Quan hệ (Fields & Relationships), Bố cục trang (Page Layouts), Trang bản ghi Lightning (Lightning Record Pages), Loại bản ghi (Record Types), Quy tắc xác thực (Validation Rules), Trình kích hoạt (Triggers), Trình kích hoạt luồng (Flow Triggers), Quyền truy cập đối tượng (Object Access), Quyền truy cập trường (Field Access). Danh sách đó là mô-đun 1 hiện ra trước mắt. Một đối tượng không chỉ là nơi lưu trữ; nó là chỗ mà tất cả những hành vi đó được treo vào.

Trình quản lý đối tượng, Truck: tên API Truck__c, Custom, và mọi thứ được treo vào một đối tượng (ảnh chụp màn hình, 2026-10-12). Xem kích thước đầy đủ
Những trường bạn không tạo ra
Phần tiêu đề “Những trường bạn không tạo ra ”Mở Trường & Quan hệ trên một đối tượng tùy chỉnh mới tinh, và nó đã có sẵn các trường. Mọi đối tượng tùy chỉnh đều nhận một bộ trường chuẩn:
- Tên (Name), tên bản ghi bạn vừa chọn, được dùng trong bố cục trang, danh sách liên quan, quan hệ tra cứu và kết quả tìm kiếm.
- Chủ sở hữu (Owner), người dùng hoặc hàng đợi sở hữu bản ghi.
- Người tạo (Created By) và Người sửa đổi lần cuối (Last Modified By), những người dùng đã tạo và thay đổi bản ghi lần gần nhất.
- Tiền tệ (Currency), nếu đa tiền tệ được bật, và Bộ phận (Division), nếu org của bạn dùng bộ phận.
Và bên dưới, ID bản ghi từ mô-đun 1, cùng ngày tạo và ngày sửa đổi. Xuất vài bản ghi bằng Data Loader và bạn sẽ thấy tất cả chúng.
Một trong số chúng có thể biến mất. Hãy biến đối tượng tùy chỉnh của bạn thành phía chi tiết của một quan hệ chính-chi tiết, và trường Chủ sở hữu biến mất: quyền sở hữu khi đó đến từ bản ghi chính. Chuyện đó lớn hơn nghe có vẻ, và chúng ta sẽ quay lại nó ở mô-đun 7 và 8.
Tiền tố và hậu tố: bạn đang nhìn thấy gì
Phần tiêu đề “Tiền tố và hậu tố: bạn đang nhìn thấy gì ”Ở mô-đun trước tôi đã nói đối tượng chuẩn không có tiền tố và không có hậu tố. Mọi thứ khác thì có, và một khi bạn đọc được chúng, một danh sách trường cho bạn biết chính xác bạn đang nhìn thấy gì.
| Trông như thế nào | Nó là gì |
|---|---|
Account, Case | Một đối tượng hoặc trường chuẩn: không tiền tố, không hậu tố |
Truck__c | Một đối tượng tùy chỉnh, hoặc một trường tùy chỉnh, như Unit_Number__c |
abc__Inspection__c | Một đối tượng tùy chỉnh từ một gói được quản lý: abc là không gian tên của nhà cung cấp |
Delivery_History__b | Một đối tượng lớn (mô-đun 4) |
Shipment__x | Một đối tượng bên ngoài: dữ liệu nằm trong một hệ thống khác (mô-đun 4) |
Allergies__pc | Một trường liên hệ tùy chỉnh trên một tài khoản cá nhân (mô-đun 2) |
Truck__r | Quan hệ đằng sau một trường tra cứu tùy chỉnh, khi bạn đi theo nó trong một truy vấn |
Vài điều cần để ý.
Đến đây đó mới là một danh sách. Đây là cách tôi dạy nó: theo lớp. Có ba loại đối tượng: chuẩn, tùy chỉnh và gói được quản lý, và loại nào cũng có thể mang cùng những loại trường: các trường chuẩn đi kèm từ đầu, và các trường tùy chỉnh mà ai đó đã thêm vào.
Đối tượng chuẩn. Account không có tiền tố và không có hậu tố, các trường chuẩn của nó cũng vậy: Name, Industry, OwnerId. Bạn có thể thêm trường tùy chỉnh vào hầu hết đối tượng chuẩn, và mỗi trường bạn thêm đều kết thúc bằng __c: Region__c (Custom Fields (opens in a new tab), tiếng Anh). Hậu tố đó là thứ giữ an toàn cho bạn. Salesforce thêm các trường chuẩn mới vào Account trong các bản phát hành của mình, và vì trường của bạn luôn kết thúc bằng __c còn trường của họ thì không bao giờ, một trường chuẩn trong tương lai không bao giờ có thể xung đột với một trường bạn đã có.
Đối tượng tùy chỉnh. Đối tượng của chính bạn kết thúc bằng __c, Truck__c (Custom Objects (opens in a new tab), tiếng Anh), và các trường tùy chỉnh bạn đặt lên nó cũng vậy: Unit_Number__c. Nhưng các trường nó có từ lúc sinh ra, những trường ở phần trước, là trường chuẩn: Name, OwnerId, CreatedDate, không có hậu tố. Nên ngay cả trên đối tượng của chính bạn, hậu tố cho bạn biết ai đã tạo ra từng trường.
Đối tượng của gói được quản lý. Khi bạn cài một gói được quản lý từ AppExchange, các đối tượng và trường của nó đi kèm tiền tố không gian tên của nhà cung cấp: abc__Inspection__c, và các trường như abc__Result__c. Tiền tố đó là duy nhất cho nhà cung cấp, và nó không thay đổi (Namespace Prefix (opens in a new tab), tiếng Anh). Theo chính lời của Salesforce, tiền tố được thêm vào mỗi thành phần để làm nó trở nên duy nhất: name__c trở thành prefix__name__c (AppExchange Object Prefixes and the API (opens in a new tab), tiếng Anh). Vì vậy hai nhà cung cấp đều có thể phát hành một đối tượng tên Invoice__c mà không bao giờ xung đột với nhau, hay với bạn. Các đối tượng của gói vẫn có các trường chuẩn của chúng, Name và OwnerId, không có tiền tố. Một gói cũng có thể thêm các trường mang tiền tố của riêng nó vào đối tượng chuẩn, như abc__Score__c trên Account. Và bạn có thể thêm trường tùy chỉnh của riêng mình vào đối tượng của một gói: Depot__c trên abc__Inspection__c mang hậu tố __c của bạn, nhưng không bao giờ mang tiền tố của nhà cung cấp, vì bạn tạo ra nó, không phải họ (Known Issue: unmanaged custom field on a managed package object (opens in a new tab), tiếng Anh).
Đọc bất kỳ tên API nào và bạn biết ai đã tạo ra nó. Không có hậu tố: Salesforce. __c không có tiền tố: org của bạn. abc__ ở phía trước: nhà cung cấp. Điều đó quan trọng mỗi khi bạn lên kế hoạch thay đổi. Cái gì là của bạn, bạn có thể thay đổi. Cái gì là của Salesforce, bạn cấu hình và mở rộng. Cái gì là của nhà cung cấp thì phần lớn bị khóa: một vài thứ, như bố cục trang và văn bản trợ giúp, bạn được sửa, nhưng phần lớn gói, và mọi tên API, thuộc về nhà cung cấp, và các bản nâng cấp của họ mang theo thay đổi của họ (Editable Properties After Package Promotion or Installation (opens in a new tab), tiếng Anh).
Gói không được quản lý thì không có tiền tố. Cài một gói không được quản lý, và các đối tượng của nó nằm trong org của bạn như thể chính bạn đã xây chúng, không có tiền tố. Nếu nó mang theo một Truck__c mà bạn đã có sẵn một cái, bạn bị trùng tên. Hãy kiểm tra trước khi cài.
Chỉ xây những gì Salesforce chưa có
Phần tiêu đề “Chỉ xây những gì Salesforce chưa có ”Tạo một đối tượng tùy chỉnh thì dễ; đó chính là lý do tôi nghĩ chúng ta tạo quá nhiều. Màn hình tạo đối tượng tùy chỉnh mới sẽ vui vẻ tạo cho bạn một Customer__c trong một org đã có sẵn Account. Vì vậy trước khi nhấp vào, hãy hỏi câu hỏi từ mô-đun trước: phi thuyền mẹ đã có cái này chưa? Nếu có, hãy dùng nó. Nếu chưa, hãy xây nó, và điền toàn bộ màn hình như một kiến trúc sư.
Mô-đun tiếp theo đặt ra một câu hỏi còn sớm hơn: dữ liệu này có nên nằm trong Salesforce không?
Kiến trúc sư quyết định gì ở đây
Phần tiêu đề “Kiến trúc sư quyết định gì ở đây ”- Salesforce đã có đối tượng chuẩn cho việc này chưa, trước khi xây một đối tượng tùy chỉnh.
- Tên API, chọn một lần, và một mô tả viết cho cả con người lẫn máy.
- Tên bản ghi: Văn bản hay Số tự động, với khối lượng bạn dự kiến trong đầu.
- Những tính năng tùy chọn, quyền truy cập API và tìm kiếm nào cần bật, một cách có chủ đích.
- Các hậu tố trong một org cho bạn biết gì: tùy chỉnh, được quản lý, đối tượng lớn, đối tượng bên ngoài, tài khoản cá nhân.
- Một gói bạn sắp cài có thể xung đột với những gì bạn đã xây hay không.
Tìm hiểu thêm
Phần tiêu đề “Tìm hiểu thêm ”- Custom Objects (opens in a new tab) và Custom Fields (opens in a new tab), Object Reference (tiếng Anh, kiểm tra ngày 2026-10-13): “tên của đối tượng tùy chỉnh có hậu tố gồm hai dấu gạch dưới theo sau là chữ ‘c’ viết thường”; trường tùy chỉnh cũng vậy; và bảng các đối tượng chuẩn hỗ trợ trường tùy chỉnh.
- AppExchange Object Prefixes and the API (opens in a new tab), Object Reference (tiếng Anh, kiểm tra ngày 2026-10-13): tiền tố không gian tên làm cho mỗi thành phần trong gói trở nên duy nhất; “name__c trở thành prefix__name__c”.
- Namespace Prefix (opens in a new tab), Apex Developer Guide (tiếng Anh, kiểm tra ngày 2026-10-13): tiền tố không gian tên giữ tên đối tượng và trường của các gói được quản lý tách biệt với tên của các org khác.
- Editable Properties After Package Promotion or Installation (opens in a new tab), Second-Generation Managed Packaging Developer Guide (tiếng Anh, kiểm tra ngày 2026-10-13): những thuộc tính nào của các thành phần trong gói mà nhà phát triển, bên đăng ký, cả hai hoặc không ai được sửa.
- Custom Object Standard Fields (opens in a new tab), Salesforce Help (tiếng Anh, kiểm tra ngày 2026-10-12): các trường chuẩn mà mọi đối tượng tùy chỉnh đều có (Name, Owner, Created By, Last Modified By, Currency, Division), và vì sao Owner bị gỡ bỏ ở phía chi tiết của một quan hệ chính-chi tiết.
- Standard User Licenses (opens in a new tab), Salesforce Help (tiếng Anh, kiểm tra ngày 2026-10-12): một Lightning Platform Light App “không thể dùng Bulk API hay Streaming API”; một Enterprise App “hỗ trợ chia sẻ ở cấp bản ghi, có thể dùng Bulk API và Streaming API”.
