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

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка массового изменения свойств товаров 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1167
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • 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
    563
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    743
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

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

В каталоге 15 000 товаров нужно проставить новое свойство «Материал» у 8 000 позиций определённой категории, исправить опечатку в значении фасетного фильтра у 2 000 товаров, снять флаг «Рекомендуемый» у половины ассортимента. Через карточку товара это недели работы. Задача решается пакетным обновлением через API с контролем целостности данных.

Где хранятся свойства

Свойства товаров в Битрикс хранятся в нескольких местах в зависимости от типа:

  • Поля элемента (NAME, PREVIEW_TEXT, ACTIVE и др.) — b_iblock_element
  • Свойства инфоблокаb_iblock_element_property, где IBLOCK_PROPERTY_ID — ID свойства, VALUE — значение
  • Множественные свойства — несколько строк в b_iblock_element_property с одним IBLOCK_ELEMENT_ID и одним IBLOCK_PROPERTY_ID
  • Свойства типа «Список»VALUE содержит текстовое значение, VALUE_ENUM_ID — ссылку на b_iblock_property_enum

Для торговых предложений — аналогичная структура, но IBLOCK_ID указывает на инфоблок предложений, а не основной каталог.

Массовое обновление через CIBlockElement::SetPropertyValues

Базовый подход для небольших объёмов (до 1 000 элементов):

$iblockId   = 10; // ID инфоблока каталога
$propertyCode = 'MATERIAL';
$newValue   = 'Хлопок 100%';

// Получаем список элементов нужной секции
$res = \CIBlockElement::GetList(
    [],
    ['IBLOCK_ID' => $iblockId, 'SECTION_ID' => 42, 'ACTIVE' => 'Y'],
    false,
    false,
    ['ID']
);

while ($row = $res->Fetch()) {
    \CIBlockElement::SetPropertyValues(
        $row['ID'],
        $iblockId,
        $newValue,
        $propertyCode
    );
}

На больших объёмах этот метод медленный — он читает текущие значения, сравнивает, обновляет. Каждый вызов — несколько SQL-запросов.

Быстрое обновление через D7 ORM

Для объёмов от 1 000 элементов используйте прямое обновление b_iblock_element_property:

use Bitrix\Iblock\ElementPropertyTable;

// Сначала получаем ID свойства
$propertyId = getPropertyIdByCode($iblockId, 'MATERIAL');

// Получаем ID элементов пакетами
$elementIds = getElementIdsBySectionBatch($iblockId, $sectionId, 500);

foreach (array_chunk($elementIds, 500) as $chunk) {
    // Проверяем, у кого уже есть запись
    $existing = ElementPropertyTable::getList([
        'filter' => [
            'IBLOCK_PROPERTY_ID' => $propertyId,
            'IBLOCK_ELEMENT_ID'  => $chunk,
        ],
        'select' => ['ID', 'IBLOCK_ELEMENT_ID'],
    ])->fetchAll();

    $existingMap = array_column($existing, 'ID', 'IBLOCK_ELEMENT_ID');

    foreach ($chunk as $elementId) {
        if (isset($existingMap[$elementId])) {
            // Обновляем существующую запись
            ElementPropertyTable::update($existingMap[$elementId], ['VALUE' => 'Хлопок 100%']);
        } else {
            // Вставляем новую
            ElementPropertyTable::add([
                'IBLOCK_ELEMENT_ID'  => $elementId,
                'IBLOCK_PROPERTY_ID' => $propertyId,
                'VALUE'              => 'Хлопок 100%',
            ]);
        }
    }
}

После прямого изменения таблицы нужно сбросить кэш инфоблока:

\Bitrix\Iblock\InformationBlock::cleanTagCache($iblockId);
\Bitrix\Main\Application::getInstance()->getTaggedCache()->clearByTag('iblock_id_' . $iblockId);

Массовое изменение значений типа «Список»

Свойства типа «Список» (используются в фасетном фильтре) хранят в VALUE текстовое значение, а в VALUE_ENUM_ID — ID из b_iblock_property_enum. При изменении значения нужно обновлять оба поля.

// Находим ID нового значения в перечислении
$enumRes = \CIBlockPropertyEnum::GetList(
    [],
    ['PROPERTY_ID' => $propertyId, 'VALUE' => 'Синий']
);
$enum = $enumRes->Fetch();
$enumId = $enum['ID'];

// Обновляем
ElementPropertyTable::update($existingPropId, [
    'VALUE'         => 'Синий',
    'VALUE_ENUM_ID' => $enumId,
]);

Если нужного значения ещё нет в перечислении — сначала добавьте его через CIBlockProperty::SetEnumValues() или напрямую в b_iblock_property_enum.

Обновление через административный импорт

Для нетехнических пользователей или регулярных обновлений лучше подходит импорт CSV через Каталог → Импорт. Шаблон файла: первая строка — заголовки с кодами полей (ID, PROPERTY_MATERIAL, PROPERTY_COLOR). Битрикс обновляет только те свойства, колонки которых присутствуют в файле.

Ограничение стандартного импорта: нет поддержки условий («обновить свойство только если текущее значение пустое»). Для таких сценариев — только скрипты.

Инвалидация фасетного индекса

После массового изменения свойств, которые используются в фасетном фильтре (catalog.smart.filter), необходимо перестроить индекс:

\Bitrix\Iblock\PropertyIndex\Manager::markIblockToReindex($iblockId);
// или принудительно:
$indexer = new \Bitrix\Iblock\PropertyIndex\Indexer($iblockId);
$indexer->startIndex();
$indexer->continueIndex(0);
$indexer->endIndex();

На каталоге 50 000+ товаров переиндексация занимает несколько минут — запускайте в фоне через агент или cron.

Сроки выполнения

Объём Метод Время
До 500 товаров Admin UI / SetPropertyValues 1–3 часа
500–5 000 товаров D7 пакетное обновление 3–6 часов
5 000–50 000 товаров D7 + очередь + переиндексация 1–2 дня