Настройка массового редактирования товаров 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка массового редактирования товаров 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1181
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    813
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

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