@m4son

Как в 1С-Битрикс массово обновить товары?

Есть 300-500 товаров, которым нужно обновить и свойства, и остатки, и цены. И возникли вопросы:
1) Я правильно понимаю, что если делать через итерацию то это куча запросов в базу данных, что тормозит код?
Например:
foreach ($items as $item) {
  \CIBlockElement::Update();
  \CCatalogProduct::Add();
  \CCatalogStoreProduct::UpdateFromForm();
  \CPrice::Update()
}

2) Если делать через транзакции, то это тоже обновление по очереди, но с возможностью откатить все изменения, если обновление одного прошло с ошибкой?
Например:
// Запуск транзакции
$DB->StartTransaction();
try {
  foreach ($items as $item) {
    \CIBlockElement::Update();
    \CCatalogProduct::Add();
    \CCatalogStoreProduct::UpdateFromForm();
    \CPrice::Update();

    if ($error) throw new Exception($error_text); 
  }

  $DB->Commit();
}

// Обработка ошибок
catch( Exception $ex ) {
   $DB->Rollback(); // Откат изменений
}

3) Как вообще ускорить обновление? Есть функция для массового обновления?
  • Вопрос задан
  • 1053 просмотра
Пригласить эксперта
Ответы на вопрос 1
WebDev2030
@WebDev2030
Битриксоид до мозга и костей
Насколько я знаю нету функции массового обновления. Структурно значения свойств это отдельная таблица, с ценами тоже отдельная и остатки тоже отдельная. По таблицам могу ошибаться, лучше перепроверить:
b_catalog_price - цены
b_catalog_store_product - значения остатков
b_iblock_element_property - значения свойств
Во всех случая зная ID товара можно найти и обновить значения. Удобно использовать ORM. У инфоблоков есть свой orm https://dev.1c-bitrix.ru/learning/course/index.php....

Но в общем и целом я бы обновлял свойства через \CIBlockElement::Update(); или \CIBlockElement::SetPropertyValuesEx(); Остатки и цены уже через ORM к таблицам.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы