Массово обновить остатки для товаров в каталоге Bitrix
В штатном импорте из CSV нет возможности импортировать остатки. Не всегда на сайте нужен полноценный складской учет, но какой-то базовый нужен - для внутренней аналитики. Поэтому его включают, а потом вручную проставляют остатки для каждого товара (через массовое редактирование).
А иногда задача может быть достаточно простой - в новом каталоге массово задать всем товарам начальный остаток. Это можно сделать с помощью данного сниппета и php-консоли Битрикс.
Добавляете данный код в консоль.
В начале нужно указать правильный id нужного вам инфоблока каталога, в переменную CATALOG_IBLOCK_ID.
А в переменную $newQuantity подставить желаемое количество (сейчас 1000)
// Определяем ID инфоблока каталога
define("CATALOG_IBLOCK_ID", 63); // Укажите здесь правильный ID вашего инфоблока
if (!\Bitrix\Main\Loader::includeModule('iblock')) {
die('Модуль "iblock" не установлен.');
}
if (!\Bitrix\Main\Loader::includeModule('catalog')) {
die('Модуль "catalog" не установлен.');
}
use Bitrix\Iblock\ElementTable;
use Bitrix\Catalog\ProductTable;
use Bitrix\Main\Type\DateTime;
try {
// Получаем всех элементов инфоблока
$rsElements = ElementTable::getList([
'filter' => ['IBLOCK_ID' => CATALOG_IBLOCK_ID],
'select' => ['ID']
]);
while ($arElement = $rsElements->fetch()) {
$productId = $arElement['ID'];
// Установите желаемое значение для CATALOG_QUANTITY
$newQuantity = 1000; // Укажите нужное значение
// Обновляем поле CATALOG_QUANTITY
$result = ProductTable::update(
$productId,
[
'QUANTITY' => $newQuantity,
'AVAILABLE' => 'Y',
'TIMESTAMP_X' => new DateTime()
]
);
if ($result->isSuccess()) {
echo "Продукт с ID {$productId} обновлен до количества {$newQuantity}.\n";
} else {
echo "Ошибка при обновлении продукта с ID {$productId}: " . implode(', ', $result->getErrorMessages()) . "\n";
}
}
} catch (\Exception $e) {
echo "Произошла ошибка: " . $e->getMessage() . "\n";
}