Разработка фильтрации по пользовательским свойствам 1С-Битрикс

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

Разработка фильтрации по пользовательским свойствам 1С-Битрикс

Стандартный умный фильтр обрабатывает свойства инфоблока автоматически. Но на практике регулярно возникают случаи, когда нужный тип свойства не поддерживается фильтром, данные хранятся в нестандартном месте, или логика фильтрации требует JOIN нескольких таблиц. Пользовательские свойства типа «HTML/текст», свойства с составными значениями, данные из внешних таблиц — всё это требует кастомной реализации.

Типы свойств, не поддерживаемые стандартным фильтром

Умный фильтр не работает «из коробки» с:

  • Свойствами типа HTML/TEXT
  • Свойствами с множественными значениями и сложной структурой
  • Данными из таблиц модулей (не инфоблока)
  • Вычисляемыми полями (например, «маржинальность» из двух других полей)
  • Свойствами торговых предложений в контексте фильтра по каталогу

Фильтрация по свойству типа HTML/TEXT

Для свойств с текстовым содержимым (описание материала, техническая документация) фильтрация реализуется через LIKE-поиск:

// Получение значений свойства для построения фильтра
$propertyValues = [];
$res = CIBlockPropertyEnum::GetList(
    ['SORT' => 'ASC'],
    ['IBLOCK_ID' => $iblockId, 'CODE' => 'MATERIAL_TYPE']
);
while ($val = $res->Fetch()) {
    $propertyValues[$val['XML_ID']] = $val['VALUE'];
}

// Применение фильтра
if (!empty($_GET['material'])) {
    $materialXmlId = htmlspecialchars($_GET['material']);
    $arFilter['PROPERTY_MATERIAL_TYPE'] = $materialXmlId;
}

Фильтрация по свойствам торговых предложений

Частая задача: каталог товаров, фильтрация по свойствам SKU (размер, цвет). Стандартный фильтр работает с этим через HIDE_NOT_AVAILABLE_OFFERS, но кастомная реализация даёт больше контроля:

// Получение ID товаров, у которых есть предложения с нужным свойством
function getProductIdsByOfferProperty($iblockId, $offersIblockId, $propertyCode, $values) {
    $offerFilter = [
        'IBLOCK_ID' => $offersIblockId,
        'ACTIVE'    => 'Y',
        'PROPERTY_' . $propertyCode => $values,
    ];

    $productIds = [];
    $res = CIBlockElement::GetList(
        [],
        $offerFilter,
        false,
        false,
        ['PROPERTY_CML2_LINK']
    );

    while ($offer = $res->GetNext()) {
        if ($offer['PROPERTY_CML2_LINK_VALUE']) {
            $productIds[] = intval($offer['PROPERTY_CML2_LINK_VALUE']);
        }
    }

    return array_unique($productIds);
}

// Использование в фильтре каталога
if (!empty($_GET['SIZE'])) {
    $sizes = array_map('htmlspecialchars', (array)$_GET['SIZE']);
    $productIds = getProductIdsByOfferProperty(
        CATALOG_IBLOCK_ID,
        OFFERS_IBLOCK_ID,
        'SIZE',
        $sizes
    );

    if (empty($productIds)) {
        $arFilter['ID'] = [0]; // нет совпадений
    } else {
        $arFilter['ID'] = $productIds;
    }
}

Фильтрация по вычисляемым значениям

Например, фильтр «только товары со скидкой» — сравнение базовой цены и цены акции:

if (!empty($_GET['has_discount'])) {
    // SQL-запрос напрямую для сравнения двух полей цен
    $connection = \Bitrix\Main\Application::getConnection();

    $sql = "
        SELECT DISTINCT p.PRODUCT_ID
        FROM b_catalog_price p1
        INNER JOIN b_catalog_price p2 ON p1.PRODUCT_ID = p2.PRODUCT_ID
        WHERE p1.CATALOG_GROUP_ID = 1  -- базовая цена
          AND p2.CATALOG_GROUP_ID = 2  -- акционная цена
          AND p2.PRICE < p1.PRICE
    ";

    $res = $connection->query($sql);
    $discountProductIds = [];
    while ($row = $res->fetch()) {
        $discountProductIds[] = $row['PRODUCT_ID'];
    }

    if (!empty($discountProductIds)) {
        $arFilter['ID'] = $discountProductIds;
    }
}

Построение UI кастомного фильтра

Для свойств вне стандартного умного фильтра — отдельный блок формы:

// template.php кастомного блока фильтра
$sizes = [];
$res = CIBlockPropertyEnum::GetList(
    ['SORT' => 'ASC'],
    ['IBLOCK_ID' => OFFERS_IBLOCK_ID, 'CODE' => 'SIZE']
);
while ($row = $res->Fetch()) {
    $sizes[] = $row;
}

$selectedSizes = array_map('htmlspecialchars', (array)($_GET['SIZE'] ?? []));
?>
<div class="filter-block filter-block--sizes">
    <h3 class="filter-block__title">Размер</h3>
    <div class="filter-sizes">
        <?php foreach ($sizes as $size): ?>
        <label class="size-option <?= in_array($size['XML_ID'], $selectedSizes) ? 'is-selected' : '' ?>">
            <input type="checkbox" name="SIZE[]"
                   value="<?= htmlspecialchars($size['XML_ID']) ?>"
                   <?= in_array($size['XML_ID'], $selectedSizes) ? 'checked' : '' ?>>
            <span><?= htmlspecialchars($size['VALUE']) ?></span>
        </label>
        <?php endforeach; ?>
    </div>
</div>

Интеграция с умным фильтром

Кастомный блок добавляется в шаблон умного фильтра, а его параметры обрабатываются параллельно с arrFilter через result_modifier.php:

// result_modifier.php шаблона умного фильтра
if (!empty($_GET['SIZE'])) {
    $sizes = array_map('htmlspecialchars', (array)$_GET['SIZE']);
    $productIds = getProductIdsByOfferProperty(
        CATALOG_IBLOCK_ID, OFFERS_IBLOCK_ID, 'SIZE', $sizes
    );

    // Добавляем ограничение по ID в общий фильтр
    if (!empty($productIds)) {
        $arResult['FILTER']['ID'] = array_merge(
            $arResult['FILTER']['ID'] ?? [],
            $productIds
        );
    } else {
        $arResult['FILTER']['ID'] = [0];
    }
}

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

Кастомный блок фильтра по одному нестандартному свойству с UI — 1–2 рабочих дня. Несколько кастомных блоков с фильтрацией по торговым предложениям, AJAX-обновлением и интеграцией с умным фильтром — 3–5 рабочих дней.