קשירת מסמכי איכות למוצרים ב-1C-Bitrix
פיתחנו מנגנון יעיל לקשירת מסמכי איכות למוצרים ב-1C-Bitrix. בניגוד לתעודות התאמה, מסמכים כמו הצהרות TR CU, דרכוני איכות, פרוטוקולי בדיקה, SGRs והוראות שימוש דורשים אחסון והצגה גמישים. הפתרון שלנו מאפשר ניהול של סוגי מסמכים מרובים עם בקרת תוקף וקשירה בכמות גדולה — בדיוק מה שצריך לקטלוגים עם מאות פריטים. במשך למעלה מ-5 שנות עבודה, השלמנו יותר מ-50 פרויקטים של שילוב זרימת מסמכים ב-Bitrix, ובכל פעם נתקלנו בבעיות אופייניות: קשירה ידנית לא נוחה, אובדן רלוונטיות של מסמכים, קשיים בעדכון דרך CommerceML. במאמר זה, אנו חולקים שיטה מוכחת שמבטיחה עמידה בדרישות וחוסכת זמן. היישום בדרך כלל עולה בין $1,500 ל-$3,000 וחוסך עד $2,000 בשנה בעבודת יד.
הגדרת קשירת מסמכים גמישה
לקשירה גמישה של סוגי מסמכים מרובים למוצרים, הסכימה האופטימלית משתמשת ב-infoblock נפרד. שימוש במודולים מוכנים דורש לעיתים קרובות שינויים, בעוד שהיישום שלנו מותאם מלכתחילה למבנה הקטלוג שלך — זה חוסך עד 30% מזמן התחזוקה ומפחית את מאמץ הקשירה הידנית ב-80%.
Infoblock QUALITY_DOCS (ללא צורך בסוג catalog, תוכן רגיל):
| מאפיין | קוד | סוג | תיאור |
|---|---|---|---|
| סוג מסמך | DOC_TYPE |
רשימה | הצהרה / תעודה / דרכון איכות / SGR |
| קובץ | FILE |
קובץ | PDF או תמונה |
| מספר מסמך | DOC_NUMBER |
מחרוזת | מספר הצהרה/תעודה |
| תוקף עד | VALID_TO |
תאריך | תאריך תפוגה |
| מוצרים | PRODUCTS |
קישור ל-infoblock | מרובה, מזהי מוצרים |
| מותגים | BRANDS |
קישור ל-infoblock | אופציונלי, אם המסמך מכסה מותג שלם |
מסמך אחד, מוצרים רבים
הצהרת TR CU ניתנת בדרך כלל לסדרת מוצרים או לסימן מסחרי. המאפיין PRODUCTS ב-infoblock של המסמך מוגדר כמרובה — מסמך אחד מתייחס לרשימת מוצרים.
בעת הצגה בכרטיס המוצר, בצע שאילתה הפוכה:
דוגמת קוד: שאילתה הפוכה
```php $docsRes = \CIBlockElement::GetList( ['PROPERTY_VALID_TO' => 'DESC'], [ 'IBLOCK_ID' => QUALITY_DOCS_IBLOCK_ID, 'PROPERTY_PRODUCTS' => $productId, 'ACTIVE' => 'Y', ], false, false, ['ID', 'NAME', 'PROPERTY_DOC_TYPE', 'PROPERTY_FILE', 'PROPERTY_DOC_NUMBER', 'PROPERTY_VALID_TO'] ); $docs = []; while ($doc = $docsRes->GetNext()) { $docs[] = $doc; } ```כיצד להפוך את בקרת התוקף לאוטומטית?
מסמכים עם תאריכים שפגו תוקפם לא צריכים להיות מוצגים כעדכניים. במקום בדיקה ידנית, אנו משתמשים בשתי אפשרויות אוטומציה, שמפחיתות את סיכון השגיאה ב-90% ומקצרות את זמן בדיקת המסמכים החודשי ב-85%.
אפשרות 1 — סינון בשאילתה:
$docsRes = \CIBlockElement::GetList( ['PROPERTY_VALID_TO' => 'DESC'], [ 'IBLOCK_ID' => QUALITY_DOCS_IBLOCK_ID, 'PROPERTY_PRODUCTS' => $productId, 'ACTIVE' => 'Y', ], false, false, ['ID', 'NAME', 'PROPERTY_DOC_TYPE', 'PROPERTY_FILE', 'PROPERTY_DOC_NUMBER', 'PROPERTY_VALID_TO'] ); $docs = []; while ($doc = $docsRes->GetNext()) { $docs[] = $doc; } אפשרות 2 — ביטול אוטומטי באמצעות סוכן. צור סוכן Bitrix (טבלה $docsRes = \CIBlockElement::GetList( ['PROPERTY_VALID_TO' => 'DESC'], [ 'IBLOCK_ID' => QUALITY_DOCS_IBLOCK_ID, 'PROPERTY_PRODUCTS' => $productId, 'ACTIVE' => 'Y', ], false, false, ['ID', 'NAME', 'PROPERTY_DOC_TYPE', 'PROPERTY_FILE', 'PROPERTY_DOC_NUMBER', 'PROPERTY_VALID_TO'] ); $docs = []; while ($doc = $docsRes->GetNext()) { $docs[] = $doc; } ) שבודק מדי יום מסמכים עם תאריכים שפגו תוקפם ומגדיר '>=PROPERTY_VALID_TO' => date('d.m.Y') . רשום דרך b_agent:
דוגמת קוד: רישום סוכן
```php \CAgent::AddAgent( '\Local\QualityDocs\Agent::deactivateExpired();', 'local_quality_docs', 'N', 86400 // פעם ביום ); ``` תיעוד המפתחים של Bitrix ממליץ להשתמש ב-CAgent::AddAgent למשימות מתוזמנות.קשירת מסמכים בכמות גדולה
אם אתה צריך לקשור מסמך אחד למאות מוצרים, קשירה ידנית דרך ממשק הניהול אינה נוחה. השתמש בייבוא דרך ACTIVE = N עם עדכון המאפיין \CAgent::AddAgent(). או צור דף ניהול עם חיפוש מוצרים לפי מסנן (קטגוריה, מותג) וקשירה בכמות גדולה. הגישה שלנו מהירה פי 2–3 ממודולים מוכנים בזכות אופטימיזציה של שאילתות, וחוסכת עד $1,200 בשנה לקטלוג של 500 מוצרים.
לקשירה בכמות גדולה של כל מוצרי מותג למסמך:
דוגמת קוד: קשירה בכמות גדולה לפי מותג
```php $productIds = []; $res = \CIBlockElement::GetList( [], ['IBLOCK_ID' => CATALOG_IBLOCK_ID, 'PROPERTY_BRAND' => $brandId], false, false, ['ID'] ); while ($row = $res->Fetch()) { $productIds[] = ['VALUE' => $row['ID']]; }\CIBlockElement::SetPropertyValueCode( $docElementId, 'PRODUCTS', $productIds );
'>=PROPERTY_VALID_TO' => date('d.m.Y') 






