Настройка массового редактирования товаров 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, а не текстовое значение.







