Настройка массового изменения статусов товаров 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С-Битрикс

Сезон закончился — 200 товаров нужно снять с публикации. Акция запускается в полночь — 50 товаров активируются одновременно. Оба сценария решаются массовым изменением статусов, но неправильная реализация даёт race condition или кладёт сайт под нагрузкой на MySQL.

Что такое «статус» товара в Битриксе

Товар в Битриксе — элемент инфоблока. «Статус» — это поле ACTIVE (Y/N) в b_iblock_element. Дополнительно существуют поля ACTIVE_FROM и ACTIVE_TO — период активности. Если текущее время не попадает в диапазон, элемент считается неактивным вне зависимости от ACTIVE.

Кастомные статусы (новинка, акция, хит) — это свойства инфоблока, а не поле ACTIVE. Массовое изменение свойств разбирается ниже.

Массовое изменение ACTIVE через D7

Прямое обновление через ORM — быстрейший способ для поля ACTIVE:

$productIds = [1001, 1002, 1003];

foreach (array_chunk($productIds, 100) as $chunk) {
    \Bitrix\Iblock\ElementTable::updateMulti($chunk, ['ACTIVE' => 'N']);
    // Сброс кэша для обновлённых элементов
    foreach ($chunk as $id) {
        \Bitrix\Main\Application::getInstance()->getTaggedCache()
            ->clearByTag('iblock_element_' . $id);
    }
}

updateMulti выполняет один UPDATE b_iblock_element SET ACTIVE='N' WHERE ID IN (...) — оптимально для MySQL.

Однако прямое обновление через ORM минует события Битрикса (OnBeforeIBlockElementUpdate, OnAfterIBlockElementUpdate). Если другие модули подписаны на эти события (CRM, поиск, кастомные обработчики), нужно использовать CIBlockElement::Update():

foreach ($productIds as $id) {
    \CIBlockElement::Update($id, false, ['ACTIVE' => 'N'], false);
    // 4-й параметр false — без пересчёта прав доступа
}

Отложенная активация по расписанию

Для акционных запусков в конкретное время используются поля ACTIVE_FROM / ACTIVE_TO. Не нужно запускать скрипт в полночь — достаточно задать даты:

\CIBlockElement::Update($productId, false, [
    'ACTIVE'      => 'Y',
    'ACTIVE_FROM' => '01.12.2024 00:00:00',
    'ACTIVE_TO'   => '31.12.2024 23:59:59',
]);

Битрикс при отображении в каталоге автоматически учитывает текущую дату. Фильтр в компоненте bitrix:catalog.section по умолчанию включает ACTIVE_DATE = 'Y', что проверяет попадание в диапазон.

Массовое изменение кастомных свойств-статусов

Свойство типа «Список» (L) — например, «Статус: Новинка / Акция / Хит» — меняется через SetPropertyValuesEx. Для массового обновления:

$enumValues = [];
$enum = \CIBlockPropertyEnum::GetList(
    [],
    ['PROPERTY_ID' => $propertyId, 'VALUE' => 'Акция']
);
if ($enumItem = $enum->Fetch()) {
    $enumValueId = $enumItem['ID'];
}

foreach (array_chunk($productIds, 50) as $chunk) {
    foreach ($chunk as $id) {
        \CIBlockElement::SetPropertyValuesEx($id, $iblockId, [
            'STATUS' => $enumValueId,
        ]);
    }
    usleep(50000);
}

Условное изменение статуса

Если нужно изменить статус только для товаров с определёнными условиями (например, деактивировать все товары с нулевым остатком), выборка делается заранее:

// Найти товары с нулевым остатком
$zeroStock = \Bitrix\Catalog\ProductTable::getList([
    'filter' => ['QUANTITY' => 0, 'QUANTITY_TRACE' => 'Y'],
    'select' => ['ID', 'IBLOCK_ELEMENT_ID'],
])->fetchAll();

$elementIds = array_column($zeroStock, 'IBLOCK_ELEMENT_ID');

// Деактивировать
foreach (array_chunk($elementIds, 100) as $chunk) {
    \Bitrix\Iblock\ElementTable::updateMulti($chunk, ['ACTIVE' => 'N']);
}

Этот запрос выполняется за секунды для тысяч товаров против минут при поэлементном обходе через CIBlockElement::GetList.