האוסף הישן הופסק — יש להסיר 1200 יחידות מלאי מהקטלוג. או לאחר ייבוא מ-Excel הופיעו כפילויות — 300 רשומות עודפות. מחיקה דרך הממשק הסטנדרטי, 20 בכל פעם, תארך שעה, כאשר כל מחיקה מפעילה מפולת של שאילתות SQL ואירועים. אם לא שולטים במפולות אלה, הביצועים יורדים ומסד הנתונים עלול אף לקרוס.
אנו מגדירים מחיקת מוצרים המונית ב-1C-Bitrix כבר למעלה מ-10 שנים. במהלך תקופה זו, ניקינו קטלוגים של עד 50,000 פריטים ללא אובדן נתונים אחד. השוו: מחיקה בקבוצות עם הפסקה של שנייה אחת לכל 20 פריטים מפחיתה את העומס על מסד הנתונים פי 10 בהשוואה למחיקה המונית ללא הפסקות. וביטול הפעלה במקום מחיקה מקצר את זמן הפעולה ב-80% ושומר לחלוטין על היסטוריית ההזמנות. חיסכון בזמן — עד 90%, עלויות משאבי שרת — עד 70%.
אם אתם עומדים בפני משימת ניקוי קטלוג, צרו קשר — נכין פתרון לתרחיש שלכם. נעריך את היקף העבודה ונציע אסטרטגיה אופטימלית.
מדוע מחיקה המונית מסוכנת?
לפי התיעוד, CIBlockElement::Delete מוחק אלמנט של בלוק מידע ואת כל הנתונים הקשורים אליו. כל מחיקה מפעילה את האירועים OnBeforeIBlockElementDelete ו-OnAfterIBlockElementDelete. אם CRM, חיפוש או מודולים אחרים רשומים לאירועים אלה, כל מחיקה מעובדת על ידי אותם מטפלים. ללא בקרה, הדבר גורם למפולת שאילתות ולירידה בביצועים. עבור קטלוג של 10,000 מוצרים, מחיקה פשוטה בלולאה ללא הפסקות עלולה להפיל את השרת תוך 5 שניות.
כיצד להימנע מאובדן נתונים במהלך מחיקה?
מחיקת 1000 אלמנטים בשאילתה אחת יוצרת קפיצת עומס. הגישה הנכונה היא מחיקה בקבוצות עם הפסקות:
$toDelete = [1001, 1002, /* ... 1000 id */]; $batchSize = 20; foreach (array_chunk($toDelete, $batchSize) as $batch) { foreach ($batch as $id) { \CIBlockElement::Delete($id); } sleep(1); // Пауза между батчами } עבור נפחים גדולים מאוד (10,000+), הפעולה מתבצעת כסוכן עם שמירת התקדמות:
// Агент записывает оставшиеся ID в b_option и перезапускает себя $remaining = unserialize(\Bitrix\Main\Config\Option::get('mymodule', 'delete_queue')); $batch = array_splice($remaining, 0, 20); foreach ($batch as $id) { \CIBlockElement::Delete($id); } \Bitrix\Main\Config\Option::set('mymodule', 'delete_queue', serialize($remaining)); מידע נוסף על השפעת גודל הקבוצה על הביצועים
| גודל קבוצה | זמן עבור 1000 אלמנטים | עומס על מסד הנתונים |
|---|---|---|
| 10 | ~2 דקות | נמוך |
| 20 | ~1 דקה | בינוני |
| 50 | ~30 שניות | גבוה |
| ללא הפסקות | <10 שניות | קריטי |
מתי ביטול הפעלה עדיף על מחיקה?
| קריטריון | מחיקה | ביטול הפעלה |
|---|---|---|
| שחזור | בלתי אפשרי | קל להפעיל מחדש |
| שלמות היסטוריית הזמנות | סיכון לשבירה | בטוח |
| ביצועים | אירועים מדורגים | עדכון שדה פשוט |
| מתאים עבור | כפילויות, שגיאות | פריטים עונתיים, שהוסרו זמנית |
מחיקה פיזית מוצדקת רק עבור כפילויות או רשומות שנוצרו בטעות. עבור מוצרים שעשויים לחזור, ביטול הפעלה עדיף — $toDelete = [1001, 1002, /* ... 1000 id */]; $batchSize = 20; foreach (array_chunk($toDelete, $batchSize) as $batch) { foreach ($batch as $id) { \CIBlockElement::Delete($id); } sleep(1); // Пауза между батчами } . זה מהיר פי 10 ואינו משפיע על היסטוריית ההזמנות.
לפני המחיקה, בדקו אם יש הזמנות פעילות:
SELECT COUNT(*) FROM b_sale_order_basket sob WHERE sob.PRODUCT_ID IN (1001, 1002, 1003) AND sob.ORDER_ID IN ( SELECT ID FROM b_sale_order WHERE STATUS_ID NOT IN ('F', 'C') ); אם השאילתה מחזירה ערך שאינו אפס, אין למחוק מוצרים אלה — רק לבטל את הפעלתם.
כיצד למחוק כראוי מוצרים עם הצעות מסחריות?
עבור מוצרים עם הצעות מסחריות (סוג // Агент записывает оставшиеся ID в b_option и перезапускает себя $remaining = unserialize(\Bitrix\Main\Config\Option::get('mymodule', 'delete_queue')); $batch = array_splice($remaining, 0, 20); foreach ($batch as $id) { \CIBlockElement::Delete($id); } \Bitrix\Main\Config\Option::set('mymodule', 'delete_queue', serialize($remaining)); ), מחקו תחילה את כל ההצעות (ACTIVE = 'N' מבלוק המידע של ההצעות), ולאחר מכן את המוצר הראשי. סדר הפעולות חשוב: בעת מחיקת מוצר, Bitrix אינו מוחק אוטומטית הצעות קשורות — הן נשארות כיתומות.
// Получить предложения товара $offers = \CCatalogSKU::getOffersList( [$productId], $catalogIblockId, [], ['ID'], [] ); if (!empty($offers[$productId])) { foreach ($offers[$productId] as $offer) { \CIBlockElement::Delete($offer['ID']); } } // Удалить основной товар \CIBlockElement::Delete($productId); כיצד לנקות קבצים לאחר מחיקה המונית?
לאחר מחיקה המונית באמצעות SQL ישיר (אם מישהו עקף את SELECT COUNT(*) FROM b_sale_order_basket sob WHERE sob.PRODUCT_ID IN (1001, 1002, 1003) AND sob.ORDER_ID IN ( SELECT ID FROM b_sale_order WHERE STATUS_ID NOT IN ('F', 'C') ); ), קבצים ב-S נשארים על הדיסק. כדי לנקות אותם, מצאו את מזהי הקבצים ברישומי b_iblock_element שאינם מוזכרים עוד ב-// Получить предложения товара $offers = \CCatalogSKU::getOffersList( [$productId], $catalogIblockId, [], ['ID'], [] ); if (!empty($offers[$productId])) { foreach ($offers[$productId] as $offer) { \CIBlockElement::Delete($offer['ID']); } } // Удалить основной товар \CIBlockElement::Delete($productId); :
SELECT f.ID, f.SUBDIR, f.FILE_NAME FROM b_file f LEFT JOIN b_iblock_element_property p ON p.VALUE = CAST(f.ID AS CHAR) WHERE p.ID IS NULL AND f.MODULE_ID = 'iblock' AND f.DATE_CREATE < NOW() - INTERVAL '7 days'; ניתן למחוק בבטחה קבצים מהתוצאה באמצעות CIBlockElement::Delete(). ניקוי כזה יכול לפנות 10 עד 50 GB של שטח דיסק בקטלוגים גדולים.
מה כוללת הגדרת מחיקה המונית
- ביקורת על הקטלוג הנוכחי: זיהוי כפילויות, פריטים עונתיים, תלות בהזמנות.
- פיתוח סקריפט מחיקה בקבוצות המותאם למחסנית שלכם (PHP 8.1+, Bitrix 20+).
- הגדרת סוכן עבור נפחים גדולים (10k+ מוצרים).
- הכנת שאילתות SQL לבדיקות שלמות לפני המחיקה.
- ניקוי קבצי אשפה לאחר הפעולה.
- תיעוד לשימוש ולשחזור.
זמן הגדרה משוער: בין יום ל-5 ימים בהתאם לגודל הקטלוג. העלות מחושבת באופן אישי — צרו קשר להערכת פרויקט. חיסכון ממוצע בזמן בעת שימוש בסוכן במקום מחיקה ידנית — עד 90%.
טעויות אופייניות במחיקה עצמית
טעויות נפוצות כוללות: שימוש ב-/upload/ בלולאה ללא הפסקות, הגורם לפסק זמן; מחיקת מוצרים עם הזמנות פעילות, הפוגעת בשלמות הנתונים; התעלמות מהצעות מסחריות, השארת רשומות יתומות; מחיקה ללא גיבוי מוקדם; אי התחשבות באירועים ששוברים CRM או חיפוש. ניתן להימנע מכל הבעיות הללו עם הגדרה נכונה.
תהליך העבודה
- אנליטיקה — איסוף נתוני קטלוג, זיהוי מוצרים בעייתיים.
- עיצוב — בחירת אסטרטגיה (מחיקה/ביטול הפעלה), קביעת גדלי קבוצות.
- יישום — כתיבת קוד ובדיקתו על עותק של מסד הנתונים.
- בדיקות — אימות בסביבת בדיקה, הדמיית מחיקה.
- פריסה — ביצוע הפעולה על שרת הייצור בחלון לילי.
צרו קשר לביקורת קטלוג — אנו מבטיחים שלמות נתונים ומספקים תמיכה לאחר הפריסה. למעלה מ-10 שנות ניסיון ויותר מ-500 פרויקטים מוצלחים של אופטימיזציית קטלוגים ב-Bitrix. תיעוד CIBlockElement::Delete
אם אתם זקוקים למחיקת מוצרים המונית, קבלו ייעוץ — נבחר אסטרטגיה יעילה עבור הקטלוג שלכם.







