В системе управления сайтом «1С-Битрикс» одним из ключевых параметров товара является настройка, разрешающая или запрещающая его покупку при отсутствии остатков на складе. Это поведение контролируется свойством CAN_BUY_ZERO.
-
CAN_BUY_ZERO = 'Y'— Разрешить покупку, даже если товара нет в наличии. -
CAN_BUY_ZERO = 'N'— Запретить покупку при нулевом остатке.
Бывают ситуации, когда необходимо массово изменить это поведение для целой группы товаров или быстро поправить один конкретный товар. С помощью API каталога Битрикс это можно легко автоматизировать.
Пример 1: Массовое изменение для группы товаров
Допустим, у вас есть инфоблок с ID = 10, и для всех товаров в нем нужно разрешить покупку при отсутствии. Следующий скрипт найдет все товары в указанном инфоблоке, у которых сейчас запрещена покупка при нулевом остатке (CAN_BUY_ZERO_ORIG = 'N'), и изменит этот флаг.
<?php
// Подключаем модуль "Торговый каталог"
CModule::IncludeModule("catalog");
// Получаем список товаров из инфоблока с ID=10, у которых запрещена покупка при нуле
$iterator = CCatalogProduct::GetList(
array('ID' => 'ASC'), // Сортировка по ID по возрастанию
array(
'ELEMENT_IBLOCK_ID' => 10, // ID вашего инфоблока
'CAN_BUY_ZERO_ORIG' => 'N' // Ищем товары, у которых сейчас стоит "Запретить"
),
false,
false,
array('ID', 'QUANTITY', 'QUANTITY_TRACE_ORIG') // Выбираем необходимые поля
);
// Обрабатываем каждый найденный товар
while ($row = $iterator->Fetch()) {
// Обновляем товар, устанавливая разрешение на покупку
CCatalogProduct::Update($row['ID'], array(
'QUANTITY' => $row['QUANTITY'], // Важно передать текущее количество, чтобы не обнулить его
'QUANTITY_TRACE' => $row['QUANTITY_TRACE_ORIG'], // Сохраняем исходное значение отслеживания остатков
'CAN_BUY_ZERO' => 'Y' // Устанавливаем флаг "Разрешить"
));
// Для наглядности выведем ID обработанного товара
echo "Обработан товар с ID: " . $row['ID'] . "<br>";
}
?>Что важно в этом коде:
-
Мы передаем в update не только
CAN_BUY_ZERO, но и текущиеQUANTITYиQUANTITY_TRACE. Это предотвращает случайное изменение этих важных параметров. -
Условие
CAN_BUY_ZERO_ORIG = 'N'в выборке позволяет применить скрипт только к нужным товарам, не затрагивая те, у которых уже стоит правильное значение.
Пример 2: Быстрое изменение для одного товара через командную строку
Если вам нужно срочно поправить один товар (например, после звонка клиента), это можно сделать в несколько строк. Например, для товара с ID = 123.
<?php
// Подключаем модуль
CModule::IncludeModule("catalog");
// ID товара, который нужно изменить
$PRODUCT_ID = 123;
// Обновляем только один параметр товара
CCatalogProduct::Update($PRODUCT_ID, array('CAN_BUY_ZERO' => 'Y'));
echo "Для товара ID={$PRODUCT_ID} установлена возможность покупки при нулевом остатке.";
?>Этот скрипт можно выполнить в отдельном PHP-файле, размещенном в корне сайта, или через функционал выполнения PHP-команд в административной части.
Пример 3: Запрет покупки при отсутствии для всех товаров в инфоблоке
Иногда требуется обратная операция — обеспечить, чтобы ни один товар из определенного инфоблока нельзя было купить без остатка.
<?php
CModule::IncludeModule("catalog");
// Ищем все товары в инфоблоке 10, у которых покупка при нуле сейчас разрешена
$iterator = CCatalogProduct::GetList(
array('ID' => 'ASC'),
array(
'ELEMENT_IBLOCK_ID' => 10,
'CAN_BUY_ZERO_ORIG' => 'Y' // Ищем те, у которых стоит "Разрешить"
),
false,
false,
array('ID', 'QUANTITY', 'QUANTITY_TRACE_ORIG')
);
while ($row = $iterator->Fetch()) {
CCatalogProduct::Update($row['ID'], array(
'QUANTITY' => $row['QUANTITY'],
'QUANTITY_TRACE' => $row['QUANTITY_TRACE_ORIG'],
'CAN_BUY_ZERO' => 'N' // Меняем на "Запретить"
));
echo "Для товара ID=" . $row['ID'] . " запрещена покупка при нулевом остатке.<br>";
}
?>Важные замечания
-
Резервное копирование: Перед выполнением массовых операций всегда делайте резервную копию базы данных.
-
Значение 'D': В некоторых скриптах можно встретить значение
'D'(по умолчанию). Оно означает, что товар наследует общую настройку из настроек модуля "Интернет-магазин" > "Настройки каталога" > "Недоступные для покупки товары". -
Тестирование: Рекомендуется сначала запускать такие скрипты на тестовой копии сайта, чтобы убедиться в ожидаемом результате.
Используя эти примеры за основу, вы можете гибко настраивать поведение вашего интернет-магазина в зависимости от бизнес-требований.