Настройка массового изменения свойств товаров в 1С-Битрикс
В каталоге 15 000 товаров нужно проставить новое свойство «Материал» у 8 000 позиций определённой категории, исправить опечатку в значении фасетного фильтра у 2 000 товаров, снять флаг «Рекомендуемый» у половины ассортимента. Через карточку товара это недели работы. Мы решаем такие задачи пакетным обновлением через API с контролем целостности данных. У нас за плечами более 10 лет опыта в разработке на Битрикс — мы знаем, как обновить свойства тысяч товаров за часы, а не дни. На каталоге из 15 000 товаров ручное обновление заняло бы 3–4 недели, автоматизация сокращает до 1–2 дней. Экономия времени очевидна, а стоимость рассчитывается индивидуально — вы платите только за результат.
Где хранятся свойства
Свойства товаров в Битрикс хранятся в нескольких местах в зависимости от типа:
- Поля элемента (
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 указывает на инфоблок предложений, а не основной каталог. Понимание этой структуры необходимо для выбора оптимального метода обновления.
Как массово обновить свойства товаров без просадки производительности?
Для небольших объёмов (до 1 000 элементов) подходит CIBlockElement::SetPropertyValues. Код рабочий:
$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-запросов. Для объёмов от 1 000 элементов настоятельно рекомендуем прямое обновление через D7 ORM.
Быстрое обновление через 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);
Почему после массового обновления свойств не работает фасетный фильтр?
После изменения свойств, которые используются в умном фильтре (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. Согласно документации 1С-Битрикс, рекомендуется запускать переиндексацию в фоновых процессах, чтобы не блокировать пользователей.
Детали переиндексации
Фасетный индекс строится на основе таблиц `b_iblock_element_property` и `b_iblock_property_enum`. Если вы обновляете свойства напрямую через SQL, индекс может не соответствовать актуальным данным. Перестройка индекса через `PropertyIndex\Manager` гарантирует синхронизацию. Для больших каталогов (от 100 000 товаров) используйте поэтапную индексацию через агент с шагом по 1000 элементов.Особенности обновления списковых свойств
Свойства типа «Список» (используются в фасетном фильтре) хранят в 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 как альтернатива
Для нетехнических пользователей или регулярных обновлений лучше подходит импорт CSV через Каталог → Импорт. Шаблон файла: первая строка — заголовки с кодами полей (ID, PROPERTY_MATERIAL, PROPERTY_COLOR). Битрикс обновляет только те свойства, колонки которых присутствуют в файле.
Ограничение стандартного импорта: нет поддержки условий («обновить свойство только если текущее значение пустое»). Для таких сценариев — только скрипты.
Пошаговый план массового обновления
- Анализ структуры: выяснить, какие свойства и сколько элементов нужно обновить.
- Выбор метода: для <500 товаров —
SetPropertyValues, для больших — D7 ORM. - Разработка скрипта с учётом типа свойств (простые, множественные, списковые).
- Тестирование на копии базы или небольшой выборке (10-20 элементов).
- Запуск обновления с логированием и контролем ошибок.
- Сброс кэша инфоблока и перестроение фасетного индекса.
- Валидация: проверить, что свойства обновились, фильтр работает корректно.
Что входит в настройку массового изменения свойств
В рамках работы мы:
- Анализируем текущую структуру свойств и данные
- Выбираем оптимальный метод обновления (API, D7 ORM, импорт CSV)
- Пишем скрипты с контролем ошибок и логированием
- Тестируем на небольшой выборке
- Запускаем полное обновление и перестраиваем кэш и фасетный индекс
- Предоставляем документацию по процессу
Мы гарантируем сохранность данных и минимизацию времени простоя.
Сроки выполнения
| Объём | Метод | Время |
|---|---|---|
| До 500 товаров | Admin UI / SetPropertyValues | 1–3 часа |
| 500–5 000 товаров | D7 пакетное обновление | 3–6 часов |
| 5 000–50 000 товаров | D7 + очередь + переиндексация | 1–2 дня |
Сравнение методов обновления
| Метод | Скорость | Сложность | Поддержка условий |
|---|---|---|---|
| SetPropertyValues | Медленно (до 1000 эл.) | Низкая | Нет |
| D7 ORM | Быстро (от 1000 эл.) | Средняя | Да (в коде) |
| CSV-импорт | Средне | Низкая | Только по ID |
Как заказать настройку
Если вам нужно массово обновить свойства товаров, свяжитесь с нами. Мы оценим объём работ и предложим решение под ключ. Получите консультацию — просто напишите. Ваш каталог будет приведён в порядок без боли и простоев.







