Настройка масового редагування товарів 1С-Бітрікс
У каталозі 5000 товарів, у 800 з них потрібно оновити одне поле — скажімо, додати прапор «Хіт продажу». Редагувати по одному — робочий день. Штатний інструмент масового редагування в адміністративній частині Бітрікса закриває більшість сценаріїв, але має обмеження, які потрібно знати.
Стандартний механізм масового редагування
В адміністративному списку товарів (/bitrix/admin/iblock_list_admin.php?type=catalog) вибираються потрібні позиції, потім дія «Редагувати вибрані». Відкривається форма, де вказуються лише змінювані поля — решта залишаються без змін.
Технічно це працює через CIBlockElement::Update(), викликаний для кожного вибраного ID. Параметр $bWorkFlow = false — без створення чорновика. При оновленні властивостей Бітрікс перезаписує лише передані властивості, не торкаючись інших.
Обмеження стандартного механізму: не працює з множинними властивостями (тип L з кількома значеннями) та не підтримує умовне оновлення («установити значення лише якщо поточне пусте»).
Масове оновлення через API
Для оновлення великої кількості товарів через скрипт правильніше використовувати D7 API з батчевою обробкою:
$productIds = [1001, 1002, 1003, /* ... */];
$batchSize = 50;
$chunks = array_chunk($productIds, $batchSize);
foreach ($chunks as $chunk) {
foreach ($chunk as $id) {
\CIBlockElement::Update($id, false, [
'PROPERTY_VALUES' => [
'IS_HIT' => 'Y',
],
]);
}
// Невеликі затримка між батчами, щоб не перевантажувати MySQL
usleep(100000); // 100ms
}
Для чисто табличних даних (b_catalog_product, а не властивості інфоблока) швидше пряме оновлення через D7:
\Bitrix\Catalog\ProductTable::updateMulti($productIds, [
'VAT_ID' => 3,
'VAT_INCLUDED' => 'Y',
]);
Метод updateMulti виконує один SQL UPDATE з WHERE ID IN (...) замість N окремих запитів.
Оновлення властивостей з індексацією
При масовому оновленні властивостей інфоблока Бітрікс за замовчуванням оновлює поисковий індекс для кожного елемента — виклик CSearch::Index(). При оновленні 1000 товарів це створює 1000 вставок у b_search_content.
Відключення переіндексації при масовому оновленні:
define('BX_SKIP_SEARCH_REINDEX', true);
// ... масове оновлення ...
// Після — запустити переіндексацію одним агентом
\Bitrix\Main\Config\Option::set('search', 'reindex_pending', 'Y');
Після завершення масового оновлення запускається агент CSearchReindex::AgentReindex(), який пакетно перебудовує індекс.
Зміни полів у одній трансакції
При оновленні кількох полів одного товару всі зміни повинні йти в одному вилику Update(), а не кількома послідовними викликами. Кожен вислів CIBlockElement::Update() запускає події, оновлює кеш та створює запис у історії змін (якщо включений модуль iblock.workflow). Зайві виклики збільшують час операції пропорційно.
Моніторинг прогресу
При масовому оновленні через веб-інтерфейс Бітрікс використовує механізм «продовження» через параметр sessid та приховані поля — кожні N елементів сторінка перезавантажується з прогресом. Для скриптової обробки зручніше писати прогрес у файл і читати його через AJAX:
file_put_contents('/tmp/update_progress.json', json_encode([
'processed' => $processed,
'total' => $total,
'percent' => round($processed / $total * 100),
]));
При оновленні властивостей типу «список» (L) масово необхідно попередньо отримати ID значення списку з b_iblock_property_enum — передавати потрібно ID, а не текстове значення.







