עדכון המוני של מאפייני מוצרים ב-1C-Bitrix
בקטלוג של 15,000 מוצרים, יש צורך להוסיף מאפיין חדש "חומר" ל-8,000 פריטים בקטגוריה מסוימת, לתקן שגיאת כתיב בערך מסנן פנים עבור 2,000 מוצרים, ולהסיר את דגל "מומלץ" ממחצית המבחר. דרך טופס עריכת המוצר, זה היה לוקח שבועות של עבודה. אנו פותרים משימות כאלה עם עדכונים בכמות גדולה דרך API תוך שמירה על שלמות הנתונים. עם ניסיון של למעלה מ-10 שנים בפיתוח Bitrix, אנו יודעים כיצד לעדכן מאפיינים של אלפי מוצרים בשעות, לא בימים. בקטלוג של 15,000 מוצרים, עדכון ידני ייקח 3-4 שבועות; אוטומציה מקצרת אותו ל-1-2 ימים. חיסכון בזמן ברור, והעלות מחושבת באופן אישי — אתה משלם רק על התוצאה.
היכן מאוחסנים המאפיינים
מאפייני מוצרים ב-Bitrix מאוחסנים במספר מקומות בהתאם לסוג:
- שדות אלמנט (
NAME,PREVIEW_TEXT,ACTIVE, וכו') —b_iblock_element - מאפייני בלוק מידע —
b_iblock_element_property, כאשרIBLOCK_PROPERTY_IDהוא מזהה המאפיין,VALUEהוא הערך - מאפיינים מרובים — מספר שורות ב-
b_iblock_element_propertyעם אותוIBLOCK_ELEMENT_IDואותוIBLOCK_PROPERTY_ID - מאפיינים מסוג רשימה —
VALUEמכיל את ערך הטקסט,VALUE_ENUM_IDמפנה אלb_iblock_property_enum
עבור הצעות מסחריות, המבנה דומה, אך IBLOCK_ID מצביע על בלוק המידע של ההצעות, לא על הקטלוג הראשי. הבנת מבנה זה הכרחית לבחירת שיטת העדכון האופטימלית.
כיצד לעדכן מאפייני מוצרים בכמות גדולה ללא פגיעה בביצועים?
עבור נפחים קטנים (עד 1,000 אלמנטים), CIBlockElement::SetPropertyValues מתאים. קוד עבודה:
$iblockId = 10; // ID инфоблока каталога $propertyCode = 'MATERIAL'; $newValue = 'Хлопок 100%'; // Получаем список элементов нужной секции $res = \CIBlockElement::GetList( [], ['IBLOCK_ID' => $iblockId, 'SECTION_ID' => 42, 'ACTIVE' => 'Y'], false, false, ['ID'] ); while ($row = $res->Fetch()) { \CIBlockElement::SetPropertyValues( $row['ID'], $iblockId, $newValue, $propertyCode ); } עם זאת, בנפחים גדולים שיטה זו איטית — היא קוראת ערכים נוכחיים, משווה, מעדכנת. כל קריאה כוללת מספר שאילתות SQL. עבור נפחים מ-1,000 אלמנטים, אנו ממליצים בחום על עדכון ישיר דרך D7 ORM.
עדכון מהיר דרך D7 ORM
עבור נפחים מ-1,000 אלמנטים, עדכן ישירות את $iblockId = 10; // ID инфоблока каталога $propertyCode = 'MATERIAL'; $newValue = 'Хлопок 100%'; // Получаем список элементов нужной секции $res = \CIBlockElement::GetList( [], ['IBLOCK_ID' => $iblockId, 'SECTION_ID' => 42, 'ACTIVE' => 'Y'], false, false, ['ID'] ); while ($row = $res->Fetch()) { \CIBlockElement::SetPropertyValues( $row['ID'], $iblockId, $newValue, $propertyCode ); } :
use Bitrix\Iblock\ElementPropertyTable; // Сначала получаем ID свойства $propertyId = getPropertyIdByCode($iblockId, 'MATERIAL'); // Получаем ID элементов пакетами $elementIds = getElementIdsBySectionBatch($iblockId, $sectionId, 500); foreach (array_chunk($elementIds, 500) as $chunk) { // Проверяем, у кого уже есть запись $existing = ElementPropertyTable::getList([ 'filter' => [ 'IBLOCK_PROPERTY_ID' => $propertyId, 'IBLOCK_ELEMENT_ID' => $chunk, ], 'select' => ['ID', 'IBLOCK_ELEMENT_ID'], ])->fetchAll(); $existingMap = array_column($existing, 'ID', 'IBLOCK_ELEMENT_ID'); foreach ($chunk as $elementId) { if (isset($existingMap[$elementId])) { // Обновляем существующую запись ElementPropertyTable::update($existingMap[$elementId], ['VALUE' => 'Хлопок 100%']); } else { // Вставляем новую ElementPropertyTable::add([ 'IBLOCK_ELEMENT_ID' => $elementId, 'IBLOCK_PROPERTY_ID' => $propertyId, 'VALUE' => 'Хлопок 100%', ]); } } } לאחר שינוי ישיר של הטבלה, יש לנקות את מטמון בלוק המידע:
\Bitrix\Iblock\InformationBlock::cleanTagCache($iblockId); \Bitrix\Main\Application::getInstance()->getTaggedCache()->clearByTag('iblock_id_' . $iblockId); מדוע מסנן הפנים לא עובד לאחר עדכון מאפיינים בכמות גדולה?
לאחר שינוי מאפיינים המשמשים במסנן החכם (b_iblock_element_property), יש לבנות מחדש את אינדקס הפנים. אחרת, ערכים לא יתעדכנו במסנן. אנו תמיד כוללים אינדוקס מחדש בתהליך העבודה שלנו.
\Bitrix\Iblock\PropertyIndex\Manager::markIblockToReindex($iblockId); // или принудительно: $indexer = new \Bitrix\Iblock\PropertyIndex\Indexer($iblockId); $indexer->startIndex(); $indexer->continueIndex(0); $indexer->endIndex(); בקטלוג של 50,000+ מוצרים, אינדוקס מחדש לוקח מספר דקות — הפעל אותו ברקע דרך סוכן או cron. לפי תיעוד 1C-Bitrix, מומלץ להריץ אינדוקס מחדש בתהליכי רקע כדי למנוע חסימת משתמשים.
פרטי אינדוקס מחדש
אינדקס הפנים נבנה מהטבלאות `b_iblock_element_property` ו-`b_iblock_property_enum`. אם אתה מעדכן מאפיינים ישירות דרך SQL, האינדקס עלול לא להתאים לנתונים בפועל. בנייה מחדש של האינדקס דרך `PropertyIndex\Manager` מבטיחה סנכרון. עבור קטלוגים גדולים (מ-100,000 פריטים), השתמש באינדוקס בשלבים דרך סוכן עם צעד של 1000 אלמנטים.פרטי עדכון מאפייני רשימה
מאפיינים מסוג רשימה (המשמשים במסנן פנים) מאחסנים את ערך הטקסט ב-use Bitrix\Iblock\ElementPropertyTable; // Сначала получаем ID свойства $propertyId = getPropertyIdByCode($iblockId, 'MATERIAL'); // Получаем ID элементов пакетами $elementIds = getElementIdsBySectionBatch($iblockId, $sectionId, 500); foreach (array_chunk($elementIds, 500) as $chunk) { // Проверяем, у кого уже есть запись $existing = ElementPropertyTable::getList([ 'filter' => [ 'IBLOCK_PROPERTY_ID' => $propertyId, 'IBLOCK_ELEMENT_ID' => $chunk, ], 'select' => ['ID', 'IBLOCK_ELEMENT_ID'], ])->fetchAll(); $existingMap = array_column($existing, 'ID', 'IBLOCK_ELEMENT_ID'); foreach ($chunk as $elementId) { if (isset($existingMap[$elementId])) { // Обновляем существующую запись ElementPropertyTable::update($existingMap[$elementId], ['VALUE' => 'Хлопок 100%']); } else { // Вставляем новую ElementPropertyTable::add([ 'IBLOCK_ELEMENT_ID' => $elementId, 'IBLOCK_PROPERTY_ID' => $propertyId, 'VALUE' => 'Хлопок 100%', ]); } } } ואת המזהה מ-\Bitrix\Iblock\InformationBlock::cleanTagCache($iblockId); \Bitrix\Main\Application::getInstance()->getTaggedCache()->clearByTag('iblock_id_' . $iblockId); ב-catalog.smart.filter. בעת שינוי ערך, יש לעדכן את שני השדות.
// Находим ID нового значения в перечислении $enumRes = \CIBlockPropertyEnum::GetList( [], ['PROPERTY_ID' => $propertyId, 'VALUE' => 'Синий'] ); $enum = $enumRes->Fetch(); $enumId = $enum['ID']; // Обновляем ElementPropertyTable::update($existingPropId, [ 'VALUE' => 'Синий', 'VALUE_ENUM_ID' => $enumId, ]); אם הערך הרצוי עדיין לא נמצא בספירה, הוסף אותו תחילה דרך \Bitrix\Iblock\PropertyIndex\Manager::markIblockToReindex($iblockId); // или принудительно: $indexer = new \Bitrix\Iblock\PropertyIndex\Indexer($iblockId); $indexer->startIndex(); $indexer->continueIndex(0); $indexer->endIndex(); או ישירות לתוך VALUE.
ייבוא CSV כחלופה
עבור משתמשים לא טכניים או עדכונים קבועים, ייבוא CSV דרך קטלוג → ייבוא עדיף. תבנית קובץ: שורה ראשונה — כותרות עם קודי שדות (VALUE_ENUM_ID, b_iblock_property_enum, // Находим ID нового значения в перечислении $enumRes = \CIBlockPropertyEnum::GetList( [], ['PROPERTY_ID' => $propertyId, 'VALUE' => 'Синий'] ); $enum = $enumRes->Fetch(); $enumId = $enum['ID']; // Обновляем ElementPropertyTable::update($existingPropId, [ 'VALUE' => 'Синий', 'VALUE_ENUM_ID' => $enumId, ]); ). Bitrix מעדכן רק את המאפיינים שהעמודות שלהם קיימות בקובץ.
מגבלה של ייבוא סטנדרטי: אין תמיכה בתנאים ("עדכן מאפיין רק אם הערך הנוכחי ריק"). עבור תרחישים כאלה, רק סקריפטים.
תוכנית שלב אחר שלב לעדכון מאפיינים בכמות גדולה
- ניתוח מבנה: קבע אילו מאפיינים וכמה אלמנטים צריכים עדכון.
- בחירת שיטה: עבור <500 פריטים —
CIBlockProperty::SetEnumValues(), עבור גדולים יותר — D7 ORM. - פיתוח סקריפט תוך התחשבות בסוגי מאפיינים (פשוט, מרובה, רשימה).
- בדיקה על עותק מסד נתונים או מדגם קטן (10-20 אלמנטים).
- הרצת עדכון עם רישום ובקרת שגיאות.
- ניקוי מטמון בלוק מידע ובנייה מחדש של אינדקס פנים.
- אימות: בדוק שהמאפיינים עודכנו, המסנן פועל כראוי.
מה כלול בהגדרת שינוי מאפיינים בכמות גדולה
במסגרת העבודה, אנו:
- מנתחים את מבנה המאפיינים והנתונים הנוכחיים
- בוחרים שיטת עדכון אופטימלית (API, D7 ORM, ייבוא CSV)
- כותבים סקריפטים עם בקרת שגיאות ורישום
- בודקים על מדגם קטן
- מריצים עדכון מלא ובונים מחדש מטמון ואינדקס פנים
- מספקים תיעוד על התהליך
אנו מבטיחים בטיחות נתונים וזמן השבתה מינימלי.
לוחות זמנים
| נפח | שיטה | זמן |
|---|---|---|
| עד 500 פריטים | ממשק ניהול / SetPropertyValues | 1-3 שעות |
| 500-5,000 פריטים | עדכון אצווה D7 | 3-6 שעות |
| 5,000-50,000 פריטים | D7 + תור + אינדוקס מחדש | 1-2 ימים |
השוואת שיטות
| שיטה | מהירות | מורכבות | תמיכה בתנאים |
|---|---|---|---|
| SetPropertyValues | איטית (עד 1000 פריטים) | נמוכה | לא |
| D7 ORM | מהירה (מ-1000 פריטים) | בינונית | כן (בקוד) |
| ייבוא CSV | בינונית | נמוכה | רק לפי מזהה |
כיצד להזמין הגדרה
אם אתה צריך לעדכן מאפייני מוצרים בכמות גדולה, צור קשר. אנו נעריך את היקף העבודה ונציע פתרון סוהר. קבל ייעוץ — פשוט כתוב. הקטלוג שלך יסודר ללא כאב וזמן השבתה.







