סוגי נתונים ופורמטי החוט
זה העמוד שהכי הרבה אינטגרציות נכשלות בו, ותמיד באותו אופן: הבקשה מחזירה 200 OK והשדה נשאר ריק.
הסיבה כמעט תמיד אחת — אותו טיפוס נכתב בצורה שונה בכל שכבה. Pointer ב‑REST הוא אובייקט עטוף; ב‑web2table הוא מחרוזת חשופה. מי שמעתיק snippet משכבה אחת לשנייה מקבל שקט, לא שגיאה.
1 · טבלת הטיפוסים המלאה
Section titled “1 · טבלת הטיפוסים המלאה”הפלטפורמה בנויה על Parse, שמקודד כל טיפוס שאינו JSON טבעי כאובייקט עם מפתח שמור __type.
לעולם אל תשתמשו ב‑__type לנתונים משלכם.
| טיפוס בסכימה | פורמט החוט (קריאה וכתיבה) | הערות |
|---|---|---|
String |
"טקסט" |
רוב השדות. תוכן עברי הוא UTF‑8 רגיל |
Number |
42 · 3.14 |
שדות כסף הם מספרים רגילים — אין טיפוס מטבע |
Boolean |
true / false |
|
Object |
כל אובייקט JSON | למשל Config.Value, _Timeline.data |
Array |
כל מערך JSON | כולל מערכי בחירה מרובה (§4) |
Date |
{"__type":"Date","iso":"2026-01-15T10:30:00.000Z"} |
UTC, ISO‑8601, עם אלפיות שנייה |
Pointer |
{"__type":"Pointer","className":"Accounts","objectId":"xK9mP2qRsT"} |
מפתח זר. שם השדה מסתיים ב‑Id |
Relation |
{"__type":"Relation","className":"_User"} |
רבים‑לרבים. מסוננים עם $relatedTo, לא מוחזרים inline |
File |
{"__type":"File","name":"…-photo.jpg","url":"https://…"} |
ה‑URL אינו נפתח בלי אישור: קריאה בלי מפתח מנותבת ל‑/authorize-file-access. ראו קבצים |
PrivateFile |
אותה צורה כמו File; הגישה מתווכת דרך הרשומה |
הרחבה של MyBusiness. בשמירה ה‑URL נכתב מחדש לנתיב …/<Table>/<objectId>/<Field> ונוסף לו "private": true |
HTML/XML |
מחרוזת שמכילה תגיות | הרחבה של MyBusiness לשדות טקסט עשיר |
AutoIncrement |
מספר, התייחסו אליו כלקריאה בלבד | הרחבה של MyBusiness — מספר רץ שהשרת מקצה כשהשדה חסר בבקשה (ומוחזר כבר בתשובת ה‑POST). אין אכיפה: POST/PUT עם ערך מפורש מתקבלים, המונה ב‑_AutoIncrementValues אינו מתעדכן, ומספרים כפולים אפשריים. ראו דוח הבאג start-b-02 |
GeoPoint |
{"__type":"GeoPoint","latitude":32.0853,"longitude":34.7818} |
נדיר במוצר — אין אף שדה כזה בבסיס המוצר, אבל הטיפוס נתמך בכתיבה ובקריאה |
ACL |
{"<userId|role:Name|*>":{"read":true,"write":true}} |
הרשאות ברמת שורה; לרוב ריק — השליטה היא ברמת הטבלה (CLP) |
Null |
null |
כל שדה יכול לקבל null ללא קשר לטיפוס שלו |
2 · טבלת ההמרה בין שלוש השכבות
Section titled “2 · טבלת ההמרה בין שלוש השכבות”זו הליבה של העמוד. אותה עובדה עסקית — “קשר את הליד למקור הליד ‘פייסבוק’” — נכתבת בשלוש צורות שונות:
| טיפוס | REST API | טפסי web2table (שדות table_* / account_*) |
כלי MCP (Create-Data, Update-Data) |
מה קורה כששולחים לא נכון |
|---|---|---|---|---|
| String | "טקסט" |
"טקסט" |
"טקסט" |
— |
| Number | 1500 |
1500 או "1500" (השרת ממיר) |
1500 |
"abc" → נשמר null בשקט, גם ב‑REST וגם בטופס (start-b-03) |
| Boolean | true |
true או "true" — שתי הצורות עובדות בשדה בוליאני רגיל |
true |
חריג: account_IsAccount מקבל רק בוליאני אמיתי (web-forms-04) |
| Date | {"__type":"Date","iso":"2026-01-15T10:30:00.000Z"} |
"2026-01-15" — מחרוזת ISO שטוחה ומרופדת; גם אובייקט Date עטוף נקלט |
{"__type":"Date","iso":"YYYY-MM-DD"} |
"2026-1-5" (לא מרופד) → 400 קוד 111, הבקשה כולה נכשלת |
| Pointer | {"__type":"Pointer","className":"X","objectId":"xK9mP2qRsT"} |
"xK9mP2qRsT" — objectId חשוף, בדיוק 10 תווים |
{"__type":"Pointer","className":"X","objectId":"…"} |
המלכודת מספר 1. בשדות table_* — Pointer עטוף או מזהה באורך אחר → 200 והשדה חסר (start-b-01). בשדות account_* — עטוף נקלט; אורך שגוי → 400/111 |
| Array של Pointer (בחירה מרובה) | ראו §4 — שתי צורות בשטח | מערך של מחרוזות objectId חשופות | כמו REST | אין ולידציה: מערך אובייקטי Pointer, או איבר באורך שגוי, נשמר כפי שנשלח — ב‑REST ובטופס |
| File / PrivateFile | {"__type":"File","name":"…","url":"…"} |
לא נתמך — 400, הבקשה כולה נכשלת (web-forms-10) |
ראו קבצים | — |
| GeoPoint | {"__type":"GeoPoint","latitude":…,"longitude":…} |
אותה צורה כמו REST — נקלט ונשמר | אותה צורה כמו REST, על שדה GeoPoint קיים |
כתיבה ב‑MCP לשם שדה חדש יוצרת עמודה שאינה GeoPoint והערך נשמר כמערך |
| AutoIncrement | לקריאה בלבד | לא לשלוח | לא לשלוח | מתקבל; המונה ב‑_AutoIncrementValues אינו מתעדכן (start-b-02) |
הצורה הנכונה, זו מול זו
Section titled “הצורה הנכונה, זו מול זו”// REST API — /parse/classes/Accounts{ "Name": "ישראל ישראלי", "LeadSourceId": { "__type": "Pointer", "className": "LeadSource", "objectId": "vOZLqOWnQf" }, "LeadConversionDate": { "__type": "Date", "iso": "2026-01-15T10:30:00.000Z" }, "IsAccount": false}// web2table — /functions/{appId}/web2table (ללכידת ליד בלבד: getlead, בשמות שטוחים){ "table": "Sales", "phone": "0501234567", "account_Name": "ישראל ישראלי", "account_LeadSourceId": "vOZLqOWnQf", "account_IsAccount": false, "table_Name": "פנייה מדף נחיתה", "table_ClosingDate": "2026-01-15"}// MCP — Create-Data{ "table": "Accounts", "data": { "Name": "ישראל ישראלי", "LeadSourceId": { "__type": "Pointer", "className": "LeadSource", "objectId": "vOZLqOWnQf" }, "LeadConversionDate": { "__type": "Date", "iso": "2026-01-15" }, "IsAccount": false }}(ConversionDate אינו בבסיס המוצר — השדה בבסיס הוא LeadConversionDate, ראו מפת הטבלאות.)
3 · תאריכים — שלוש הערות שחוסכות באגים
Section titled “3 · תאריכים — שלוש הערות שחוסכות באגים”-
תמיד UTC. הפורמט הקנוני הוא ISO‑8601 עם אלפיות שנייה ו‑
Zבסוף. אם המשתמש בישראל רואה “15/01/2026 12:30”, הערך המאוחסן הוא2026-01-15T10:30:00.000Zבחורף. -
createdAtו‑updatedAtהם חריגים. בתשובה הם חוזרים כמחרוזת ISO שטוחה ("2026-08-20T06:12:44.109Z"), אבל ב‑whereהם עדיין דורשים את האובייקט העטוף:JSON { "createdAt": { "$gt": { "__type": "Date", "iso": "2026-01-01T00:00:00.000Z" } } } -
בשכבת הטפסים מחרוזת שטוחה מספיקה, ובלבד שהיא מרופדת (
"2026-01-15", או ISO מלא). גם אובייקט Date עטוף נקלט."2026-1-5"לא מרופד →400קוד 111 — הבקשה כולה נכשלת, לא רק השדה.
4 · בחירה מרובה — array_<purpose>_Pointer_<TargetTable>
Section titled “4 · בחירה מרובה — array_<purpose>_Pointer_<TargetTable>”לפלטפורמה אין טיפוס “בחירה מרובה” ייעודי. במקום זה שם השדה הוא המטא‑דאטה:
| חלק | משמעות |
|---|---|
array_ |
קידומת באותיות קטנות — הרנדור יהיה <select multiple> |
<purpose> |
snake_case חופשי, מתעלמים ממנו בזמן ריצה (languages, tags) |
_Pointer_ |
ליטרל, P גדולה — איברי המערך הם Pointer |
<TargetTable> |
שם הטבלה המדויק, case‑sensitive |
הטיפוס בסכימה חייב להיות Array. שגיאת אותיות (array_x_pointer_Y) או טיפוס Pointer שוברים את המנגנון בשקט.
בשאילתה, containedIn ($in) הוא הכלי לריבוי ערכים; שוויון פשוט ({"array_…": "zY2p6jpXqm"}) גם מתאים לאיבר בתוך המערך, כמקובל ב‑Parse. ערך שנבחר ולא נמצא בטבלת ה‑lookup — השמיטו את השדה מהגוף, אל תשלחו מחרוזת ריקה.
5 · פעולות אטומיות (REST PUT)
Section titled “5 · פעולות אטומיות (REST PUT)”במקום לקרוא‑לשנות‑לכתוב, שלחו אופרטור. זה גם בטוח מפני מרוץ בין תהליכים:
{ "StockCount": { "__op": "Increment", "amount": -5 } }{ "Tags": { "__op": "AddUnique", "objects": ["דחוף"] } }{ "Tags": { "__op": "Add", "objects": ["חוזר"] } }{ "Tags": { "__op": "Remove", "objects": ["דחוף"] } }{ "Comment": { "__op": "Delete" } }__op: "Delete" מוחק את ערך השדה מהרשומה — לא את השדה מהסכימה ולא את הרשומה.
בשכבת ה‑MCP אותן פעולות עוברות כמות שהן דרך data של Update-Data — {"__op":"Increment","amount":n} עובד ומחזיר את הערך המעודכן.
6 · שדות מערכת שקיימים בכל רשומה
Section titled “6 · שדות מערכת שקיימים בכל רשומה”| שדה | טיפוס | נקבע על ידי |
|---|---|---|
objectId |
String | השרת — בדיוק 10 תווים |
createdAt |
Date | השרת, בלתי משתנה — PUT עם createdAt מוחזר 200 ומתעלם מהערך |
updatedAt |
Date | השרת, בכל שמירה |
ACL |
ACL | האפליקציה; לרוב ריק |
createdBy |
Pointer→_User |
השרת — הרחבה של MyBusiness. בכתיבה עם Master Key או API Key ה‑objectId הוא המחרוזת "Master", לא משתמש אמיתי |
updatedBy |
Pointer→_User |
השרת — הרחבה של MyBusiness; אותו כלל |
אל תשלחו אף אחד מהם ביצירה. createdAt מפורש פשוט מתעלמים ממנו; אבל objectId מפורש כן מתקבל כשכותבים עם Master Key (POST {"objectId":"abcdefghij"} → 201 עם המזהה הזה) — אל תעשו זאת, זה פותח את הדלת להתנגשויות.
בנוסף, טבלאות שאוטומציות נוגעות בהן נושאות שדה updatedByTrigger:String (בבסיס המוצר: Accounts, Tasks, SaleRows, _Notification) — שומר הלולאה של מנוע הטריגרים, וגם רמז ביקורת ש“טריגר נגע ברשומה הזו”: הערך הוא מזהה הטריגר שכתב אחרון.
7 · דוט‑נוטציה — קריאה דרך Pointer
Section titled “7 · דוט‑נוטציה — קריאה דרך Pointer”בדוחות, בתנאים, בהגדרות טריגרים ובאגרגציות אפשר לפנות לשדה בטבלה המקושרת:
לדוגמה AccountId.Accounts.Email · SaleStatusId.SaleStatuses.Name · array_tags_Pointer_Tags.Tags.Name.
ב‑placeholders של הודעות (טריגרים, תבניות מייל/SMS) התחביר קצר יותר — קפיצה אחת בלבד:
{{{Name}}}{{{AccountId.Name}}}{{{SaleDate.format(date,he-IL,Asia/Jerusalem)}}}8 · צ’קליסט לפני הכתיבה הראשונה
Section titled “8 · צ’קליסט לפני הכתיבה הראשונה”- שלפו את הסכימה של הטבלה — סכימות. לעולם אל תקודדו רשימת שדות מהזיכרון.
- לכל שדה Pointer בטופס, שלפו את טבלת ה‑lookup וקבעו מיפוי
תווית → objectId. - בנו את הערכים בפורמט של השכבה שאליה אתם פונים, לפי §2.
- השמיטו שדות ריקים לגמרי מהגוף — אל תשלחו
""אוnull“ליתר ביטחון”. - אחרי הכתיבה הראשונה — קראו את הרשומה בחזרה וּודאו שכל שדה נשמר. זו הבדיקה היחידה שתופסת השמטה שקטה.
המשך מכאן
Section titled “המשך מכאן”- מוסכמות המוצר — למה
Accountsמחזיקה גם לידים, ומאיפה מגיעות התוויות בעברית - מפת הטבלאות — לאיזו טבלה בכלל כותבים
- סכימות — לקרוא לפני שכותבים
- getlead · web2table — הדיאלקט של שכבת הטפסים
- שגיאות ופתרון תקלות — “200 אבל השדה ריק” מסודר לפי תסמין