עדכון סטטוס מוצרים בכמות גדולה ב-1C-Bitrix
לאחר סיום עונה, יש צורך לבטל פרסום של 200 מוצרים. בחצות מתחיל מבצע שמפעיל 50 מוצרים בו-זמנית. שני התרחישים דורשים שינויי סטטוס בכמות גדולה, אך יישום נאיבי עלול לגרום לתנאי מרוץ או לעומס גבוה על MySQL. עם ניסיון של למעלה מ-5 שנים בפיתוח Bitrix ויותר מ-50 פרויקטים שהושלמו, אנו מספקים פתרונות מוכחים. יישום אצווה נכון יכול להאיץ עדכוני סטטוס פי 100 בהשוואה ללולאה של מוצר-אחר-מוצר. לקוחות בדרך כלל חוסכים 60–80% בעלויות תפעול, מה שיכול להסתכם באלפי דולרים בשנה.
הבנת סטטוס מוצר ב-Bitrix
מוצר ב-Bitrix הוא רכיב בלוק מידע עם מספר מאפייני פעילות. השדה הראשי הוא ACTIVE (Y/N) בטבלת b_iblock_element. בנוסף, ישנם גבולות זמן פעילות: ACTIVE_FROM ו-ACTIVE_TO — התקופה שבה המוצר פעיל. אם הזמן הנוכחי אינו בטווח, הרכיב נחשב לא פעיל ללא קשר לדגל ACTIVE.
סטטוסים מותאמים אישית (חדש, מבצע, להיט, רב-מכר) הם מאפייני אינפובלוק נפרדים מסוג "רשימה", לא השדה המובנה ACTIVE. שינויים בכמות גדולה במאפיינים מותאמים אישית דורשים גישה שונה, הנדונה בסעיף הרלוונטי להלן.
כיצד לעדכן סטטוס ACTIVE בכמות גדולה באמצעות D7?
עדכון ישיר דרך ה-ORM הוא השיטה המהירה ביותר עבור השדה ACTIVE. לעדכון סטטוס בכמות גדולה ב-Bitrix, השתמש ב-D7:
$productIds = [1001, 1002, 1003]; foreach (array_chunk($productIds, 100) as $chunk) { \Bitrix\Iblock\ElementTable::updateMulti($chunk, ['ACTIVE' => 'N']); // Сброс кэша для обновлённых элементов foreach ($chunk as $id) { \Bitrix\Main\Application::getInstance()->getTaggedCache() ->clearByTag('iblock_element_' . $id); } } $productIds = [1001, 1002, 1003]; foreach (array_chunk($productIds, 100) as $chunk) { \Bitrix\Iblock\ElementTable::updateMulti($chunk, ['ACTIVE' => 'N']); // Сброс кэша для обновлённых элементов foreach ($chunk as $id) { \Bitrix\Main\Application::getInstance()->getTaggedCache() ->clearByTag('iblock_element_' . $id); } } מבצע updateMulti יחיד — אופטימלי עבור MySQL. לפי תיעוד המפתחים של Bitrix, שיטה זו עוקפת אירועים, מה שהופך אותה לאידיאלית למניפולציית נתונים טהורה. D7 updateMulti מהיר פי 100 מ-CIBlockElement::Update עבור פעולות בכמות גדולה.
עם זאת, עדכון ישיר דרך ORM עוקף אירועי Bitrix (UPDATE b_iblock_element SET ACTIVE='N' WHERE ID IN (...), OnBeforeIBlockElementUpdate). אם מודולים אחרים רשומים לאירועים אלה (CRM, חיפוש, מטפלים מותאמים אישית), עליך להשתמש ב-OnAfterIBlockElementUpdate:
foreach ($productIds as $id) { \CIBlockElement::Update($id, false, ['ACTIVE' => 'N'], false); // 4-й параметр false — без пересчёта прав доступа } עבור עדכון CIBlockElement עם אירועים, השתמש בגישת הלולאה.
כיצד לתזמן הפעלה לזמן מסוים?
להשקות מבצעיות בזמן מסוים, השתמש בשדות CIBlockElement::Update() / foreach ($productIds as $id) { \CIBlockElement::Update($id, false, ['ACTIVE' => 'N'], false); // 4-й параметр false — без пересчёта прав доступа } . אין צורך להריץ סקריפט בחצות — פשוט הגדר את התאריכים:
\CIBlockElement::Update($productId, false, [ 'ACTIVE' => 'Y', 'ACTIVE_FROM' => '01.12.2024 00:00:00', 'ACTIVE_TO' => '31.12.2024 23:59:59', ]); Bitrix מתחשב אוטומטית בתאריך הנוכחי בעת הצגה בקטלוג. הפילטר ברכיב ACTIVE_FROM כולל כברירת מחדל את ACTIVE_TO, שבודק את טווח התאריכים.
עדכון בכמות גדולה של מאפייני סטטוס מותאמים אישית
מאפיין מסוג "רשימה" (\CIBlockElement::Update($productId, false, [ 'ACTIVE' => 'Y', 'ACTIVE_FROM' => '01.12.2024 00:00:00', 'ACTIVE_TO' => '31.12.2024 23:59:59', ]); ) — לדוגמה, "סטטוס: חדש / מבצע / להיט" — מעודכן באמצעות bitrix:catalog.section. לעדכון בכמות גדולה:
$enumValues = []; $enum = \CIBlockPropertyEnum::GetList( [], ['PROPERTY_ID' => $propertyId, 'VALUE' => 'Акция'] ); if ($enumItem = $enum->Fetch()) { $enumValueId = $enumItem['ID']; } foreach (array_chunk($productIds, 50) as $chunk) { foreach ($chunk as $id) { \CIBlockElement::SetPropertyValuesEx($id, $iblockId, [ 'STATUS' => $enumValueId, ]); } usleep(50000); } שינוי סטטוס מותנה
אם יש צורך לשנות את הסטטוס רק עבור מוצרים עם תנאים מסוימים (לדוגמה, השבתת כל המוצרים עם מלאי אפס), הבא תחילה את הרשימה:
// Найти товары с нулевым остатком $zeroStock = \Bitrix\Catalog\ProductTable::getList([ 'filter' => ['QUANTITY' => 0, 'QUANTITY_TRACE' => 'Y'], 'select' => ['ID', 'IBLOCK_ELEMENT_ID'], ])->fetchAll(); $elementIds = array_column($zeroStock, 'IBLOCK_ELEMENT_ID'); // Деактивировать foreach (array_chunk($elementIds, 100) as $chunk) { \Bitrix\Iblock\ElementTable::updateMulti($chunk, ['ACTIVE' => 'N']); } שאילתה זו רצה בשניות עבור אלפי מוצרים לעומת דקות כאשר עוברים רכיב-אחר-רכיב דרך ACTIVE_DATE = 'Y'.
בעיות ביצועים ותנאי מרוץ
כאשר שתי פעולות מעדכנות מוצרים בו-זמנית (לדוגמה, מישהו לוחץ על כפתור "הפעל" בעוד משימת cron מריצה עדכון בכמות גדולה), נוצר תנאי מרוץ. מטפל אחד קורא נתונים ישנים, אחר קורא נתונים חדשים. התוצאה: עדכונים אבודים או התנגשויות. הפתרון הוא שימוש בטרנזקציות ובגרסאות. לפני העדכון, בדוק אם הרשומה השתנתה:
$element = \Bitrix\Iblock\ElementTable::getByPrimary($id)->fetch(); if ($element['MODIFIED'] === $knownModified) { \Bitrix\Iblock\ElementTable::update($id, ['ACTIVE' => 'N']); } else { // Запись изменилась, пропускаем } עומס MySQL גדל עם מספר המוצרים. עדכון 100,000 מוצרים באופן נאיבי (אחד-אחד בלולאה) אורך שעות או אפילו ימים, מכיוון שכל עדכון דורש שאילתת SQL נפרדת. הגישה הנכונה: עדכון אצווה (עדכון 100-500 בבת אחת בטרנזקציה אחת). עם אצווה, הזמן יורד משעות לדקות, ועומס מסד הנתונים יורד פי 10-50. עבור קטלוגים עם למעלה מ-100,000 מוצרים, אנו ממליצים להשתמש ב-cron-agent שמעדכן מוצרים ברקע כדי למנוע חסימה של ממשק הניהול.
| שיטה | מהירות | אירועים מופעלים | מקרה שימוש |
|---|---|---|---|
| D7 updateMulti | מהירה מאוד (SQL יחיד) | לא | עדכוני נתונים טהורים, ללא תופעות לוואי |
| CIBlockElement::Update | בינונית (SQL אחד לכל פריט) | כן | כאשר נדרשים אירועים |
| SetPropertyValuesEx | איטית (מספר SQL) | כן | עדכוני מאפיינים מותאמים אישית |
כוונון ביצועים מתקדם
עבור קטלוגים עם למעלה ממיליון מוצרים, שקול שימוש ב-SQL ישיר דרך $DB->Query() עם חלוקה למקטעים וטרנזקציות. זה עוקף לחלוטין את תקורת ה-ORM, אך דורש טיפול זהיר בפסילת מטמון.אינטגרציה עם 1C
בעת עדכון אוטומטי של סטטוסים מ-1C, יש להבחין בין שינויים המגיעים מ-1C לבין עדכונים מקומיים שנעשו דרך פאנל הניהול. השתמש בדגל מאפיין נוסף: אם מוצר עודכן מ-1C, הגדר את L ושמור חותמת זמן של הסנכרון האחרון. זה מונע עדכונים מחזוריים (Bitrix שולח שינוי חזרה ל-1C, 1C מחזיר אותו שוב) ועוזר בניפוי באגים בסנכרון ביומנים. בעת עדכון מוצר דרך CommerceML, חשוב לשמר התאמות מקומיות — לדוגמה, אם מנהל השבית מוצר ידנית, אין לדרוס אותו על ידי 1C בסנכרון הבא. טכניקה זו אידיאלית להפעלת מוצרי Bitrix בכמות גדולה.
תוצרים
- אב-טיפוס ובדיקות ביצועים על נפח המוצרים שלך.
- פיתוח קונסולת בקרה (פאנל ניהול) לפעולות בכמות גדולה.
- אינטגרציה עם 1C (במידת הצורך).
- טיפול בתנאי מרוץ ופעולות מקבילות בטוחות.
- אופטימיזציה של מטמון ואינדקסים.
- תיעוד והדרכת צוות.
- הגדרת הרשאות גישה.
- 3 חודשי תמיכה לאחר ההשקה.
לוחות זמנים ואחריות
יישום בסיסי של עדכון סטטוס בכמות גדולה — 3–5 ימים. מערכת מלאה עם פאנל ניהול, אינטגרציה עם 1C וטיפול בהתנגשויות — 1–2 שבועות. יישום בסיסי מתחיל ב-$500; מערכת מלאה עם כל התכונות מ-$2,000. אנו מבטיחים שעדכון 100,000 מוצרים יושלם במסגרת זמן שתגדיר (בדרך כלל פחות מ-5 דקות, לעומת 10+ שעות ידנית). צור קשר לייעוץ — ננתח את הקטלוג שלך ונציע את הפתרון האופטימלי.
עם ניסיון של למעלה מ-5 שנים בפיתוח Bitrix ויותר מ-50 פרויקטים מוצלחים, אנו מבטיחים אספקה באיכות גבוהה.







