الكائنات المخصصة
متاح أيضًا بـ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)

الوحدة 3 من 10 في فصل معمارية بيانات Salesforce، الفصل 3 من دورة Data Architect. كل وحدة قائمة بذاتها. السابق: انظر إلى السفينة الأم: نماذج البيانات القياسية · التالي: أين تعيش هذه البيانات؟
السؤال الذي تجيب عنه هذه الوحدة: عندما لا يكون الشيء لدى Salesforce، ما الذي تحصل عليه فعلًا حين تبني كائنك الخاص؟
في الوحدة السابقة نظرنا إلى ما بنته Salesforce بالفعل. وأحيانًا لا يكون لديها ما تحتاج إليه. تشغّل Steve Trucking شاحنات، ولا يوجد كائن قياسي للشاحنة (Truck). لذا تبني واحدًا: كائنًا مخصصًا.
إليك ما أريدك أن تراه في هذه الوحدة. يُنشأ الكائن المخصص في البيانات الوصفية، مثل كل شيء آخر في الوحدة 1، ولحظة وجوده يأتي معه طقم من الوظائف القياسية. إنه ليس جدولًا فارغًا. والشاشة التي تملؤها لإنشائه تطرح عليك أسئلة معمارية، سواء لاحظت ذلك أم لا.
شاشة New Custom Object
Section titled “شاشة New Custom Object ”اذهب إلى Setup → Object Manager → Create → Custom Object فتحصل على نموذج طويل واحد. معظم الناس يملؤون أول خانتين وينقرون Save. لنتمهّل ونقرأه.
Label وPlural Label (التسمية والتسمية بصيغة الجمع). «Truck» و«Trucks». هذه هي ما يراه المستخدمون، في علامات التبويب وتخطيطات الصفحات والتقارير. يمكنك تغييرها لاحقًا دون عناء كبير.
Object Name (اسم الكائن). هذا مختلف: إنه اسم API، الاسم الذي تستخدمه الشيفرة والتكاملات والتقارير، والآن الوكلاء. اكتب «Truck» فتجعله Salesforce Truck__c. وتغييره لاحقًا يعني البحث عن كل ما يشير إليه، وهذا اختبار قابلية التراجع من الفصل 1 مرة أخرى. أصِب في هذا من المرة الأولى.
Description (الوصف). املأه. في كل مرة. في الوحدة 1 قلت إن البيانات الوصفية لم تعد زينة: المسؤول التالي يقرأ هذا، وكذلك كل أداة ذكاء اصطناعي تحاول فهم مؤسستك. الكائن المخصص بوصف فارغ صندوق بلا ملصق.
Record Name (اسم السجل). لكل كائن مخصص حقل Name، وهنا تقرر ما هو. اسم من نوع Text، مثل «Truck 117»، أو Auto Number، مثل T-000184، تملؤه Salesforce لك. اقرأ التحذير على تلك الشاشة: إذا كنت تخطط لإدراج حجم كبير من السجلات عبر API، تخبرك Salesforce أن تستخدم Text. هذه المنصة تخبرك بشيء عن الحجم قبل أن تُنشئ سجلًا واحدًا.

Salesforce Setup، شاشة 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 معطّل افتراضيًا، لذا لن يجد المستخدمون هذه السجلات في البحث العام حتى تفعّله. وهذا يوقع الناس في كل مرة.

الإعدادات الافتراضية: إعدادات API الثلاثة مفعّلة، وDeployed، وAllow Search معطّل (لقطة شاشة، 2026-10-12). الحجم الكامل
انقر Save، فيعرض لك Object Manager الكائن: اسم API Truck__c، وعلامة في Custom، والتسميات، وحالة النشر. لكن انظر إلى الجانب الأيسر: Fields & Relationships، Page Layouts، Lightning Record Pages، Record Types، Validation Rules، Triggers، Flow Triggers، Object Access، Field Access. هذه القائمة هي الوحدة 1 وقد صارت مرئية. الكائن ليس مجرد تخزين؛ إنه المكان الذي يتعلق به كل ذلك السلوك.

Object Manager، كائن Truck: اسم API Truck__c، وCustom، وكل ما يتعلق بالكائن (لقطة شاشة، 2026-10-12). الحجم الكامل
الحقول التي لم تُنشئها
Section titled “الحقول التي لم تُنشئها ”افتح Fields & Relationships على كائن مخصص جديد تمامًا، وستجد أن لديه حقولًا بالفعل. كل كائن مخصص يحصل على طقم قياسي:
- Name، اسم السجل الذي اخترته للتو، ويُستخدم في تخطيطات الصفحات والقوائم المرتبطة وعلاقات البحث ونتائج البحث.
- Owner، المستخدم أو قائمة الانتظار (queue) التي تملك السجل.
- Created By وLast Modified By، المستخدمان اللذان أنشآه وغيّراه آخر مرة.
- Currency، إذا كانت العملات المتعددة مفعّلة، وDivision، إذا كانت مؤسستك تستخدم الأقسام (divisions).
وفي الأسفل، معرّف السجل من الوحدة 1، وتاريخا الإنشاء والتعديل. صدّر بضعة سجلات باستخدام Data Loader وستراها كلها.
واحد منها يمكن أن يختفي. اجعل كائنك المخصص الطرف التفصيلي في علاقة رئيسي-تفصيلي (master-detail)، ويختفي حقل Owner: فالملكية تأتي من السجل الرئيسي بدلًا من ذلك. هذا أهم مما يبدو، وسنعود إليه في الوحدتين 7 و8.
البادئات واللواحق: ما الذي تنظر إليه
Section titled “البادئات واللواحق: ما الذي تنظر إليه ”في الوحدة السابقة قلت إن الكائنات القياسية بلا بادئة ولا لاحقة. أما كل ما عداها فله ذلك، وبمجرد أن تستطيع قراءتها، تخبرك قائمة الحقول بالضبط بما تنظر إليه.
| شكله | ما هو |
|---|---|
Account، Case | كائن أو حقل قياسي: بلا بادئة ولا لاحقة |
Truck__c | كائن مخصص، أو حقل مخصص، مثل Unit_Number__c |
abc__Inspection__c | كائن مخصص من حزمة مُدارة (managed package): abc هو مساحة الأسماء (namespace) الخاصة بالمورّد |
Delivery_History__b | big object (الوحدة 4) |
Shipment__x | كائن خارجي: البيانات تعيش في نظام آخر (الوحدة 4) |
Allergies__pc | حقل جهة اتصال مخصص على حساب شخصي (الوحدة 2) |
Truck__r | العلاقة الكامنة خلف علاقة بحث مخصصة، حين تتبعها في استعلام |
بعض الأمور التي تستحق الملاحظة.
حتى الآن هذه قائمة. وإليك كيف أُدرّسها: كطبقات. هناك ثلاثة أنواع من الكائنات، قياسية ومخصصة ومن حزمة مُدارة، وكل واحد منها يمكن أن يحمل الأنواع نفسها من الحقول: الحقول القياسية التي جاء بها، والحقول المخصصة التي أضافها أحدهم.
الكائنات القياسية. Account بلا بادئة ولا لاحقة، وكذلك حقوله القياسية: Name، Industry، OwnerId. يمكنك إضافة حقول مخصصة إلى معظم الكائنات القياسية، وكل حقل تضيفه ينتهي بـ __c: Region__c (Custom Fields (opens in a new tab)). هذه اللاحقة هي ما يحميك. تضيف Salesforce حقولًا قياسية جديدة إلى Account في إصداراتها، ولأن حقولك تنتهي دائمًا بـ __c وحقولها لا تنتهي بها أبدًا، فلا يمكن لحقل قياسي مستقبلي أن يتصادم أبدًا مع حقل لديك بالفعل.
الكائنات المخصصة. كائنك الخاص ينتهي بـ __c، Truck__c (Custom Objects (opens in a new tab))، وكذلك الحقول المخصصة التي تضعها عليه: Unit_Number__c. لكن الحقول التي وُلد بها، تلك التي في القسم السابق، حقول قياسية: Name، OwnerId، CreatedDate، بلا لاحقة. لذا حتى على كائنك الخاص، تخبرك اللاحقة بمن صنع كل حقل.
كائنات الحزم المُدارة. عندما تثبّت حزمة مُدارة من AppExchange، تأتي كائناتها وحقولها مع بادئة مساحة الأسماء (namespace prefix) الخاصة بالمورّد: 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 على Account. ويمكنك أنت أن تضيف حقولك المخصصة إلى كائنات الحزمة: Depot__c على abc__Inspection__c يأخذ لاحقتك __c، لكنه لا يأخذ أبدًا بادئة المورّد، لأنك أنت صنعته، لا هم (Known Issue: unmanaged custom field on a managed package object (opens in a new tab)).
اقرأ أي اسم API وستعرف من صنعه. بلا لاحقة: Salesforce. __c بلا بادئة: مؤسستك. abc__ في المقدمة: المورّد. وهذا مهم في كل مرة تخطط فيها لتغيير. ما هو لك، يمكنك تغييره. وما هو لـ Salesforce، تضبطه وتوسّعه. وما هو للمورّد مقفل في معظمه: بعض الأشياء، مثل تخطيطات الصفحات ونص المساعدة، يمكنك تعديلها، لكن معظم الحزمة، وكل اسم API، ملك للمورّد، وتحديثاته تجلب تغييراته (Editable Properties After Package Promotion or Installation (opens in a new tab)).
الحزم غير المُدارة لا تفعل ذلك. ثبّت حزمة غير مُدارة، فتستقر كائناتها في مؤسستك كأنك بنيتها بنفسك، بلا بادئة. وإذا جلبت Truck__c وكان لديك واحد بالفعل، فلديك تصادم في الأسماء. تحقق قبل أن تثبّت.
لا تبنِ إلا ما ليس لدى Salesforce
Section titled “لا تبنِ إلا ما ليس لدى Salesforce ”إنشاء كائن مخصص سهل؛ ولهذا بالضبط أظن أننا نُنشئ منها الكثير. ستصنع لك شاشة New Custom Object بكل سرور Customer__c في مؤسسة لديها Account بالفعل. لذا قبل أن تنقر عليها، اطرح سؤال الوحدة السابقة: هل لدى السفينة الأم هذا بالفعل؟ إذا كان لديها، فاستخدمه. وإذا لم يكن، فابنِه، واملأ الشاشة كلها كمعماري.
والوحدة التالية تطرح سؤالًا أسبق: هل ينبغي أن تكون هذه البيانات في Salesforce أصلًا؟
ما الذي يقرره المعماري هنا
Section titled “ما الذي يقرره المعماري هنا ”- هل لدى Salesforce بالفعل كائن قياسي لهذا، قبل بناء كائن مخصص.
- اسم API، يُختار مرة واحدة، ووصف مكتوب للناس وللآلات.
- اسم السجل: Text أم Auto Number، مع مراعاة الحجم الذي تتوقعه.
- أي الميزات الاختيارية والوصول عبر API والبحث تُفعَّل، عن قصد.
- ما الذي تخبرك به اللواحق في المؤسسة: مخصص، مُدار، big object، خارجي، حساب شخصي.
- هل يمكن لحزمة توشك على تثبيتها أن تتصادم مع ما بنيته.
للاستزادة
Section titled “للاستزادة ”- Custom Objects (opens in a new tab) وCustom Fields (opens in a new tab)، Object Reference (بالإنجليزية، تم التحقق في 2026-10-13): «تتضمن أسماء الكائنات المخصصة لاحقة من شرطتين سفليتين يليهما حرف ‘c’ صغير»؛ والأمر نفسه للحقول المخصصة؛ وجدول الكائنات القياسية التي تدعم الحقول المخصصة.
- AppExchange Object Prefixes and the API (opens in a new tab)، Object Reference (بالإنجليزية، تم التحقق في 2026-10-13): بادئة مساحة الأسماء تجعل كل مكوّن في الحزمة فريدًا؛ «name__c becomes prefix__name__c».
- Namespace Prefix (opens in a new tab)، Apex Developer Guide (بالإنجليزية، تم التحقق في 2026-10-13): بادئات مساحة الأسماء تُبقي أسماء كائنات الحزم المُدارة وحقولها منفصلة عن أسماء المؤسسات الأخرى.
- Editable Properties After Package Promotion or Installation (opens in a new tab)، Second-Generation Managed Packaging Developer Guide (بالإنجليزية، تم التحقق في 2026-10-13): أي خصائص مكوّنات الحزمة يستطيع المطوّر أو المشترك أو كلاهما أو لا أحد منهما تعديلها.
- Custom Object Standard Fields (opens in a new tab)، Salesforce Help (بالإنجليزية، تم التحقق في 2026-10-12): الحقول القياسية التي يحصل عليها كل كائن مخصص (Name، Owner، Created By، Last Modified By، Currency، Division)، ولماذا يُزال Owner على الطرف التفصيلي في علاقة رئيسي-تفصيلي.
- Standard User Licenses (opens in a new tab)، Salesforce Help (بالإنجليزية، تم التحقق في 2026-10-12): تطبيق Lightning Platform Light App «لا يستطيع استخدام Bulk API أو Streaming API»؛ وتطبيق Enterprise App «يدعم المشاركة على مستوى السجل، ويستطيع استخدام Bulk API وStreaming API».
