Bitrix\Iblock\PropertyIndex\Storage: полное руководство с примерами

Внимание! Работает режим премодерации. Все сообщения публикуются после проверки!
Страницы: 1
Ответить
RSS
Bitrix\Iblock\PropertyIndex\Storage: полное руководство с примерами
Руководство по работе с Bitrix\Iblock\PropertyIndex\Storage

Storage — это низкоуровневый класс ядра 1С-Битрикс, отвечающий за хранение и поддержку фасетного индекса свойств инфоблока. В статье мы разберём каждую возможность класса и покажем рабочие примеры кода, которые можно вставить в свои скрипты или модули.
Изменено: Валерий Макеев - 28.09.2025 14:34:28
Полностью перестроим фасетный индекс для указанного  инфоблока, корректно получая базовые цены товаров и обрабатывая числовые  свойства активных элементов.
Код
<?php
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');

Bitrix\Main\Loader::includeModule('iblock');
Bitrix\Main\Loader::includeModule('catalog');

$iblockId = 1; // ID вашего инфоблока
$storage = new Bitrix\Iblock\PropertyIndex\Storage($iblockId);

// Пересоздаем индекс
if ($storage->isExists()) {
    $storage->drop();
}
$storage->create();

// Выбираем активные элементы
$elements = CIBlockElement::GetList(
    [],
    ['IBLOCK_ID' => $iblockId, 'ACTIVE' => 'Y'],
    false,
    false,
    ['ID', 'IBLOCK_SECTION_ID']
);

while ($element = $elements->Fetch()) {
    $elementId = (int)$element['ID'];
    $sectionId = (int)$element['IBLOCK_SECTION_ID'];

    // Индексируем базовую цену (правильный метод)
    $price = CPrice::GetList(
        array(),
        array(
            "PRODUCT_ID" => $elementId,
            "CATALOG_GROUP_ID" => 1 // ID базового типа цены
        )
    )->Fetch();
    
    if ($price && isset($price['PRICE'])) {
        $storage->queueIndexEntry(
            $sectionId,
            $elementId,
            $storage::priceIdToFacetId(1),
            0,
            (float)$price['PRICE'],
            true
        );
    }

    // Индексируем только числовые свойства
    $properties = CIBlockElement::GetProperty($iblockId, $elementId, [], []);
    while ($prop = $properties->Fetch()) {
        if ($prop['PROPERTY_TYPE'] === 'N' && !empty($prop['VALUE'])) {
            $storage->queueIndexEntry(
                $sectionId,
                $elementId,
                $storage::propertyIdToFacetId($prop['ID']),
                0,
                (float)$prop['VALUE'],
                true
            );
        }
    }
}

$storage->flushIndexEntries();
echo "Индекс перестроен для числовых свойств и цен";
Страницы: 1
Ответить
Форма ответов
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
 

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Участие в проекте

привлечение в проект на part-time основе

от 30 000 рублей / неделя

Возможно участие в проекте на ежедневной основе, как разработчика. Занятость - до 20 часов в неделю
Минимальный срок - одна неделя.

* сумма фиксированная

Интернет-магазин на готовом решении

от 7 дней

от 40 000 рублей
запуск сайта в максимально короткие сроки

* указана минимальная стоимость. Стоимость выбранной лицензии «1С-Битрикс» оплачивается отдельно.

Лендинг

от 3 дней

от 25 000 рублей

Разработка одностраничного сайта на платформе Битрикс

* стоимость зависит от наличия верстки, использования готового решения и т.д.