ארגון מחדש של קטלוג: איך להימנע מטביעה בשגרה
תארו לעצמכם: הסעיף "סמארטפונים" מתפצל לתתי-סעיפים לפי מותג — 800 מוצרים לחלוקה תוך כמה שעות בלבד, אחרת האתר יישאר ללא פעילות. או שהספק שינה את הסיווג, והותיר 400 פריטים תלויים בסעיפים לא נכונים, החיפוש מחזיר תוצאות מבולבלות, ומנהלים מבזבזים שעות בעדכון ידני. ביצוע ידני דרך לוח הניהול ייקח כשבועיים של עבודה רציפה עבור 800 מוצרים — רק קליקים, בלי לספור שגיאות. הפתרון היחיד הוא העברות אוטומטיות בכמות גדולה. לדוגמה, בפרויקט אחד העברנו 1200 מוצרים מ"מחשבים ניידים" ל"אולטרבוקים" תוך 3 דקות באמצעות SQL ישיר — ללא שגיאות או זמן השבתה. הלקוח חסך למעלה מ-40 שעות של עבודה ידנית.
השיטה שלנו הוכחה על יותר מ-150 קטלוגים עם נפחים מ-300 עד 50,000 מוצרים. במשך שנים של עבודה עם 1C-Bitrix, פיתחנו גישות יעילות שמתחשבות במבנה הפנימי של בלוקי מידע, מטמון והרשאות גישה. להלן פירוט טכני — ממבנה הטבלאות ועד אופטימיזציית ביצועים — ובסוף, פתרון מוכן לשימוש עבור הפרויקט שלכם.
מבנה הסעיפים וקישור מוצרים
סעיפי בלוק המידע מאוחסנים ב-b_iblock_section. הקישור של האלמנט לסעיף הוא השדה IBLOCK_SECTION_ID ב-b_iblock_element (הסעיף הראשי). קישור נוסף למספר סעיפים נמצא בטבלה b_iblock_section_element: IBLOCK_ELEMENT_ID, IBLOCK_SECTION_ID, ADDITIONAL_PROPERTY_ID.
בעת העברת מוצר, יש לעדכן את שני המקומות:
-
IBLOCK_SECTION_IDב-b_iblock_element— הסעיף הראשי. - הרשומה ב-
b_iblock_section_element— לפעולת סינון נכונה.
העברה באמצעות CIBlockElement::Update
שיטת העדכון הסטנדרטית עם שינוי סעיף:
\CIBlockElement::Update($elementId, false, [ 'IBLOCK_SECTION_ID' => $newSectionId, ]); לאחר \CIBlockElement::Update($elementId, false, [ 'IBLOCK_SECTION_ID' => $newSectionId, ]); , Bitrix מעדכן אוטומטית את Update(). אבל שיטה זו איטית לפעולות בכמות גדולה — כל קריאה עוברת דרך אירועים, מטמון והרשאות גישה.
למה עדכון SQL ישיר עדיף?
כשעובדים עם קטלוגים של 500+ פריטים, ההבדל הופך קריטי. b_iblock_section_element טוען מודולי Bitrix, בודק הרשאות ומפעיל אירועים. ברקע, זה מוביל לתקיעות. SQL ישיר עוקף את השכבות הללו, אבל דורש בקרה קפדנית על שלמות הנתונים. אנו משתמשים בו בשילוב עם טרנזקציות וגיבויים.
עדכון SQL ישיר למהירות:
global $DB; $elementIds = implode(',', array_map('intval', $productIds)); $newSection = (int)$newSectionId; $DB->Query(" UPDATE b_iblock_element SET IBLOCK_SECTION_ID = {$newSection} WHERE ID IN ({$elementIds}) "); $DB->Query(" DELETE FROM b_iblock_section_element WHERE IBLOCK_ELEMENT_ID IN ({$elementIds}) AND ADDITIONAL_PROPERTY_ID IS NULL "); foreach ($productIds as $id) { $DB->Query(" INSERT INTO b_iblock_section_element (IBLOCK_ELEMENT_ID, IBLOCK_SECTION_ID) VALUES ({$id}, {$newSection}) "); } SQL ישיר מהיר פי 50-100 מ-CIBlockElement::Update לפעולות בכמות גדולה, אבל דורש איפוס מטמון ידני.
השוואת שיטות העברה
| שיטה | מהירות | בטיחות | איפוס מטמון ידני |
|---|---|---|---|
| CIBlockElement::Update | נמוכה (10-20 אלמנטים/שנייה) | גבוהה (אירועים, הרשאות) | לא נדרש |
| SQL ישיר | גבוהה (500+ אלמנטים/שנייה) | בינונית (דורש בקרה) | נדרש |
טעויות נפוצות בהעברות בכמות גדולה
| טעות | השלכות | מניעה |
|---|---|---|
| שכחנו לאפס מטמון | מבקרים רואים נתונים ישנים | מטמון מתויג לאחר ההעברה |
| עדכנו רק את b_iblock_element | הסעיף משתנה אבל לא הקישור הנוסף | עדכון שתי הטבלאות |
| לא התחשבנו בהרשאות גישה | חלק מהמשתמשים לא רואים מוצרים | בדיקה על סביבת בדיקה עם תפקידים שונים |
| קבוצה גדולה מדי ב-SQL אחד | נעילות טבלאות, פסקי זמן | חלוקה לקבוצות של 500 |
איך לאפס מטמון לאחר העברה?
לאחר העברה בכמות גדולה, מטמוני רכיבי הקטלוג לא פגים מיד. איפוס כפוי:
\Bitrix\Main\Application::getInstance()->getTaggedCache()->clearByTag('iblock_id_' . $iblockId); // Для конкретных разделов foreach (array_unique(array_merge($oldSectionIds, [$newSectionId])) as $secId) { \Bitrix\Main\Application::getInstance()->getTaggedCache() ->clearByTag('iblock_section_' . $secId); } איך לחלק מוצרים לסעיפים אוטומטית?
לחלוקה אוטומטית לפי מאפיינים — לדוגמה, לפי מותג:
$brandSectionMap = [ 'Apple' => 125, 'Samsung' => 126, 'Xiaomi' => 127, ]; $res = \CIBlockElement::GetList( [], ['IBLOCK_ID' => $iblockId, 'IBLOCK_SECTION_ID' => $sourceSection], false, false, ['ID', 'PROPERTY_BRAND'] ); while ($item = $res->GetNext()) { $brand = $item['PROPERTY_BRAND_VALUE']; $targetId = $brandSectionMap[$brand] ?? null; if ($targetId) { \CIBlockElement::Update($item['ID'], false, ['IBLOCK_SECTION_ID' => $targetId]); } } לנפחים גדולים, הסקריפט הזה רץ דרך סוכן Bitrix בקבוצות של 100-200 פריטים, ושומר התקדמות ב-global $DB; $elementIds = implode(',', array_map('intval', $productIds)); $newSection = (int)$newSectionId; $DB->Query(" UPDATE b_iblock_element SET IBLOCK_SECTION_ID = {$newSection} WHERE ID IN ({$elementIds}) "); $DB->Query(" DELETE FROM b_iblock_section_element WHERE IBLOCK_ELEMENT_ID IN ({$elementIds}) AND ADDITIONAL_PROPERTY_ID IS NULL "); foreach ($productIds as $id) { $DB->Query(" INSERT INTO b_iblock_section_element (IBLOCK_ELEMENT_ID, IBLOCK_SECTION_ID) VALUES ({$id}, {$newSection}) "); } .
איך אנו מבצעים אוטומציה של התהליך: שלב אחר שלב
- ניתוח מבנה — בדיקת הסעיפים הנוכחיים, מאפיינים והרשאות גישה.
- פיתוח סקריפט — כתיבת סקריפט SQL או API המותאם לתנאים שלכם.
- בדיקה על עותק — הרצה על עותק בדיקה, אימות שלמות.
- פריסה בייצור — ביצוע ההעברה בשעות עומס נמוך.
- איפוס מטמון — ניקוי מטמונים מתויגים ובדיקת החזית.
- תיעוד — מסירת תיאור התהליך לשימוש עתידי.
מה כוללת העבודה שלנו
- ייעוץ וניתוח מבנה הקטלוג הנוכחי.
- כתיבת סקריפט העברה לפי התנאים שלכם (מותגים, מאפיינים, מחירים).
- בדיקה על עותק בדיקה.
- פריסה בייצור ואיפוס מטמון.
- תיעוד התהליך.
- תמיכה עם אחריות ל-30 יום.
הניסיון והאחריות שלנו
מעל 7 שנות ניסיון בפיתוח Bitrix, יותר מ-150 פרויקטים מוצלחים של העברת קטלוגים ואופטימיזציה. מומחים מוסמכים. ניתן להפחית את עלויות ניהול הקטלוג בעד 80% באמצעות אוטומציה. אנו עומדים מאחורי האיכות שלנו, ולכן אנו מספקים אחריות על הסקריפט.
צרו קשר כדי להעריך את הפרויקט שלכם ולהציע את הפתרון האופטימלי. הזמינו הגדרת העברה בכמות גדולה — ותשכחו מהשגרה. קבלו ייעוץ מהנדס לקטלוג שלכם.







