43
NULL - ערכים חסרים. אין לבלבל עם null! NULL אינו מספר, אינו שווה לרווח, הפניה null, undefined. NULL הוא ערך יוצר טיפוס, כלומר. יש סוג NULL וערך בודד מסוג זה. ריק... 26
כדי ליצור ולבצע שאילתות לטבלאות מסד נתונים בפלטפורמת 1C, נעשה שימוש באובייקט מיוחד של שפת התכנות Request. אובייקט זה נוצר על ידי קריאה למבנה הבקשה החדשה. בקשה נוחה... 18
המאמר מספק טריקים שימושיים בעבודה עם שאילתות 1C v.8.2, כמו גם מידע שאינו כל כך ידוע על שפת השאילתה. אני לא מבקש לתת תיאור מלא של שפת השאילתה, אבל אני רוצה להתמקד רק ב... 13
LIKE - אופרטור לבדוק אם מחרוזת דומה לתבנית. אנלוגי של LIKE ב-SQL. האופרטור LIKE מאפשר לך להשוות את הערך של הביטוי שצוין משמאל לו עם מחרוזת התבנית שצוינה מימין. ערך ביטוי...

לעתים קרובות מאוד זה יוצר טעות נפוצה - בקשה בלולאה. כלומר, המפתח לא יודע לכלול טבלת ערכים בבקשה ולכן מתחיל לעקוף אותה בלולאה ולהגיש בקשה משלו לכל איטרציה. בואו נסתכל על דוגמה פשוטה כיצד לעשות זאת.

דוגמא

כדוגמה להצבת טבלת ערכים בשאילתת 1C 8.3, ניקח מצב פשוט - יש, שמכיל רשימה של פריטים. יש צורך לקבל נתונים על היתרות במחסנים לכל פריט מלאי.

קבל 267 שיעורי וידאו 1C בחינם:

יכולים להיות שני מצבים, איך נוצרת טבלת ערכים - באופן תוכניתי וכבר מתקבל מאיפשהו (למשל, מסמך PM). אם הטבלה נוצרת באופן תכנותי, עליך הגדר סוג עמודה, זה קל לעשות

הָהֵן. בעת הוספת עמודה, עליך לציין את סוגי הנתונים כפרמטר השני באמצעות הבנאי של האובייקט TypeDescription.

בואו נעבור לבניית שאילתה. ניתן להעביר טבלת ערכים לשאילתה עם &פרמטר פשוט.

ניואנס חובה הוא שיש למקם את הטבלה שנוצרה בטבלה זמנית, אחרת המערכת תציג הודעה: "שגיאה בעת קריאה לשיטת ההקשר (הפעלה): ניתן לאחזר את התוכן של אובייקט הנתונים לטבלה זמנית בלבד».

לפיכך, אנו ממקמים את השאילתה הראשונה בטבלה זמנית, ולאחר מכן מחברים אותה למאגר יתרת המלאי.

זהו, הבעיה נפתרה.

יש לנו פריט שנמצא בקבוצת "פריט אסור", בו אתה צריך לאסור על משתמשים להשתמש במסמך "הזמנה לספק" בסעיף הטבלה "סחורה". יחד עם זאת, ראוי לשקול את העובדה שיתכן שמיקומו של המינוח אינו בקבוצת "המינוח האסור" עצמו, אלא בקבוצות הכפופות לה. במקרה זה, האיסור צריך לחול גם. בנוסף, צריך להוסיף צ'ק למילוי הזמנה פנימית.

יש לבצע בדיקה לפני ההקלטהמסמך למסד הנתונים אם מצב הכתיבה הנוכחי הוא "פרסום".

יישום

בוא נעבור למודול אובייקט המסמך, לאירוע "BeforeWrite". זה המקום שבו אנחנו צריכים ליישם בדיקת אימות. מכיוון שהרשומה באירוע זה יש לנו רק אובייקט מסמך שעדיין לא הוצב במסד הנתונים, לא נוכל לבצע שאילתה ישירות לטבלת "מוצרים" של המסמך.

מדוע יש צורך לבצע את הבדיקה עם שאילתה? העובדה היא שכאשר משתמשים במודל גישה לנתוני אובייקט, בדיקה כזו תעלה לא מעט משאבים עבור מכונת שרת. אם נבצע קונסטרוקציות כמו:

אם TableString. מִנוּחַ. הוֹרֶה. הוֹרֶה. Parent = ForbiddenGroup Then // Actions EndIf ;

אז זמן הביצוע של אירוע "BeforeWrite" יכול לעלות באופן דרמטי.

הפתרון האופטימלי ביותר הוא להשתמש בשאילתה כדי לבדוק את תקינות המילוי, כי בה נוכל להשתמש בקונסטרוקציה

"בהיררכיה () "

מה שמאפשר לך לקבל את כל הרכיבים של הספרייה הכלולים בקבוצה או ברכיב הנבדק. עכשיו הכי מעניין. כך נוכל להעביר טבלת ערכים לשאילתה ולעבד אותה הלאה:

אם WriteMode = DocumentWriteMode. מחזיק אז // הכרטיסייה 'פרוק'. מסמך לטבלת ערכים עם העמודות הרצויות TabProducts = מוצרים. Upload(, "LineNumber , מינוח, סדר" ); Request = בקשה חדשה; // כרטיסייה עוברת. ערכים לבקשה כפרמטרחֲקִירָה. SetParameter(" TabDoc " , TabProducts) ; // הגדר את קבוצת הפריטים האסוריםחֲקִירָה. setParameter(" קבוצה אסורה" , ספריות. מינוי. FindByName(" מינוח אסור" , True ) ); שאילתה. טקסט = " SELECT | ט . מספר קו,| ט . מִנוּחַ,| בחירה | כאשר T | | | OR T. סדר = לא מוגדר | ואז נכון | אחרת שקר | END AS Order Unfilled|הכרטיסייה PUT | מ // החלף את הטבלה שעברה בקטע "FROM" כפרמטר | & TabDoc AS T| איפה | (T. Nomenclature IN HIERARCHY (והקבוצה האסורה) | או בחירה| כאשר T . הזמנה = VALUE(מסמך. הזמנת ייצור. EmptyReference) | OR T. Order = VALUE(מסמך. הזמנת קונה. EmptyReference) | OR T.Order = VALUE(Document.InternalOrder.NullReference) | OR T. סדר = לא מוגדר | ואז נכון | אחרת שקר| הסוף ) |; | |//////////////////////////////////////////////////////////////////////////////// |בחר | לשונית . מִנוּחַ,| לשונית . מספר קו,| לשונית . Order Unfilled |מ| Tab AS Tab "; Selection = Query. Execute () . Select() ; // עבדו את התוצאהבעוד הבחירה. Next() לולאה כללית. ReportError(" בשורה " + בחירה. LineNumber + " נעשה שימוש במינוח אסור" + " " " " + דגימה. מינוי + " " " " + ? (דגימה. סדר לא מלא, " וגם ההזמנה לא הושלמה!" , " " ), כשל); EndCycle ; EndIf ;

טבלת הערכים מועברת כפרמטר לבקשה. אם תפתח שאילתה כזו בקונסטרוקטור, אז טבלה כזו תוגדר כ"תיאור של טבלה זמנית" ותראה כך:

תכונה חשובה של עבודה עם טבלת ערכים בבקשה היא מיקום החובה בטבלה זמנית של בקשה שמקבלת טבלת ערכים מהפרמטר שעבר. אם תנסה לבצע שאילתה מבלי להשתמש בטבלה זמנית, הפלטפורמה תדווח על שגיאה.

כמו כן, חשוב להבין שלא ניתן יהיה לארגן אחזור נתונים מטבלת ערכים באמצעות בונה השאילתות. בקונסטרוקטור, נוכל להגדיר רק את התיאור של הטבלה הזמנית. לא ניתן יהיה לציין שהבחירה תתבצע מהפרמטר שעבר בקונסטרוקטור - יופיעו שגיאות תחביר.

סיכום

המשימה נפתרה. דוגמה לבדיקה שהופעלה לפני כתיבת מסמך:

כמובן, הדוגמה לעיל היא די פשוטה. ניתן לפתור את המשימה על ידי העברת הסימון לאירוע "בכתיבה", ואז היינו מסתדרים עם שאילתות פשוטות למסד הנתונים מבלי להעביר טבלת ערכים לשאילתה. כדי לשפוט את נכונות השימוש בשיטה המתוארת, אתה צריך לדעת את התנאים הספציפיים של הבעיה.