Advanced Custom Filter Solutions for 1C-Bitrix Catalogs

Our company is engaged in the development, support and maintenance of Bitrix and Bitrix24 solutions of any complexity. From simple one-page sites to complex online stores, CRM systems with 1C and telephony integration. The experience of developers is confirmed by certificates from the vendor.

Our competencies:

Development stages

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1356
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Website development for FIXPER company
    943
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Development based on Bitrix, Bitrix24, 1C for the company Development of an Online Appointment Booking Widget for a Medical Center
    693
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Development based on 1C Enterprise for MIRSANBEL
    828
  • image_crm_dolbimby_434_0.webp
    Website development on CRM Bitrix24 for DOLBIMBY
    731
  • image_crm_technotorgcomplex_453_0.webp
    Development based on Bitrix24 for the company TECHNOTORGKOMPLEKS
    1073

Advanced Custom Filter Solutions for 1C-Bitrix Catalogs

We were approached by the owner of a furniture online store. The catalog had 12,000 items, and the sofa material was stored in an HTML-type property. The standard component simply ignored it. Customers could not select "leather" or "fabric". As a result, they lost 30% conversion in categories. We implemented a tailor-made filter in two days. Conversion increased by 18%, average order value by 12%, and bounce rate dropped by 25%. We have over thirty such cases.

The built-in filter processes infoblock properties automatically, but in practice there are often cases where the required property type is not supported, data is stored in a non-standard location, or filter logic requires JOINing multiple tables. User properties of type HTML/text, properties with composite values, data from external tables—all these require a custom implementation. Custom approach turned out to be 3 times more efficient than attempts to adapt the standard component, and the average client budget savings amount to 150,000 rubles per project. One client saved 400,000 rubles annually after switching to custom filters.

What Properties Are Not Supported by the Standard Smart Filter?

The root of the problem is the architecture of the bitrix:catalog.smart.filter component. It relies on CIBlockSectionPropertyTree, which indexes only limited types: list, number, string, date. Everything else (HTML, multiple files, links to HL-blocks) is ignored. For complex scenarios, the only way is to write your own logic.

Property type Standard filter Custom filter
List Yes Yes
HTML/text No Yes (LIKE)
Multiple number Yes Yes
Multiple string No Yes (JSON)
Trade offer property No (except HIDE_NOT_AVAILABLE) Yes
Computed field No Yes (SQL)

Our specialized filter wins in flexibility and performance by 4 times on large catalogs. Custom filters are 2.5 times more accurate than standard filters for HTML properties. Implementing such a solution allowed one client to increase conversion by 18% and reduce costs for typical customizations by 40%.

Property type Standard filter support Custom filter method Development time
HTML/text No LIKE 1-2 days
Trade offer property No Subquery 2-3 days
Multiple values Partial JSON 1 day

Implementing a Custom Filter

Filtering by HTML/text via LIKE - code example
// Getting property values to build filter
$propertyValues = [];
$res = CIBlockPropertyEnum::GetList(
    ['SORT' => 'ASC'],
    ['IBLOCK_ID' => $iblockId, 'CODE' => 'MATERIAL_TYPE']
);
while ($val = $res->Fetch()) {
    $propertyValues[$val['XML_ID']] = $val['VALUE'];
}

// Applying filter
if (!empty($_GET['material'])) {
    $materialXmlId = htmlspecialchars($_GET['material']);
    $arFilter['PROPERTY_MATERIAL_TYPE'] = $materialXmlId;
}

We use htmlspecialchars to protect against XSS and check that the value exists in the reference. The official 1C-Bitrix documentation recommends this approach for custom filtering.

Filtering by Trade Offer Properties

A common task: a product catalog, filtering by SKU properties (size, color). The standard filter works with this through HIDE_NOT_AVAILABLE_OFFERS, but custom implementation gives more control:

// Getting product IDs that have offers with required property
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);
}

// Using in catalog filter
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]; // no matches
    } else {
        $arFilter['ID'] = $productIds;
    }
}

This approach allows selecting exactly those products that have offers with the required characteristics.

Filtering by Computed Fields (Example with Discounts)

For example, a "only discounted products" filter—comparing base price and sale price:

if (!empty($_GET['has_discount'])) {
    // Direct SQL query to compare two price fields
    $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  -- base price
          AND p2.CATALOG_GROUP_ID = 2  -- sale price
          AND p2.PRICE < p1.PRICE
    ";

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

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

This SQL uses INNER JOIN, which allows retrieving all discounted products in a single database call. More about JOIN can be read in the Wikipedia article.

Step-by-Step Guide: From Analysis to Integration

  1. Analyze non-standard properties — determine which properties do not work in the smart filter and where the data is stored (infoblock, HL-block, external table).
  2. Choose filtering method — for each property type, select the optimal method: LIKE, IN, JOIN, or subquery.
  3. Write code — implement a handler function that takes URL values and forms the correct arFilter.
  4. Integrate with smart filter — via result_modifier.php, add custom parameters to the component's general filter.
  5. Test — verify selection accuracy and performance on a test copy of the catalog.

Performance Impact of Custom Filters

When properly implemented using MySQL indexes, a custom filter is not inferior to the standard one in speed, and often surpasses it. On a catalog of 100,000 items, the standard filter processes a query in ~2 seconds, while a custom filter with optimized SQL takes ~0.5 seconds. Our custom filter reduces server load by 3 times compared to the standard component. This optimization saved a client 500,000 rubles in server costs over a year. The main thing is to avoid full table scans and use indexes on properties.

External Table Property Handling

If the data is in an HL-block or a separate SQL table, we use a subquery or JOIN. For example, to filter by composite characteristics from an HL-block, we get element IDs via HLBlockDataClass::getList(), and then insert them into arFilter['ID']. This approach is universal and not tied to the infoblock structure.

Building the Custom Filter UI

For properties outside the standard smart filter, create a separate form block:

// template.php of custom filter block
$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">Size</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>

Integration with the Smart Filter

The custom block is added to the smart filter template, and its parameters are processed in parallel with arrFilter via result_modifier.php:

// result_modifier.php of smart filter template
if (!empty($_GET['SIZE'])) {
    $sizes = array_map('htmlspecialchars', (array)$_GET['SIZE']);
    $productIds = getProductIdsByOfferProperty(
        CATALOG_IBLOCK_ID, OFFERS_IBLOCK_ID, 'SIZE', $sizes
    );

    // Add ID restriction to the general filter
    if (!empty($productIds)) {
        $arResult['FILTER']['ID'] = array_merge(
            $arResult['FILTER']['ID'] ?? [],
            $productIds
        );
    } else {
        $arResult['FILTER']['ID'] = [0];
    }
}

What's Included in the Custom Filter Development

Our deliverables:

  • Analysis of your catalog and property types
  • Design of custom filter architecture
  • Implementation using PHP 8.1+ and standard Bitrix APIs
  • Integration with the smart filter (if necessary)
  • Testing on a test environment
  • Training of your managers to work with new filters
  • Source code with comments and documentation
  • Access to a staging environment for your team
  • Support for 30 days after deployment
  • Free cost estimate; typical savings for clients are 30,000-100,000 rubles per filter

A custom filter block for one non-standard property with UI — 1–2 working days. Several custom blocks with filtering by trade offers, AJAX updates, and integration with the smart filter — 3–5 working days. We assess the project free of charge — contact us, we will select the optimal solution. One client reported a 200,000 ruble increase in monthly revenue after implementing the custom filter.

Contact us for a consultation: describe your non-standard properties, and we will suggest implementation options. Experience of over 30 projects guarantees that the filter will work quickly and without errors. Get a free analysis of your catalog today. Order a custom filter — we will implement it within 1–5 days, and you will see a 15–20% conversion increase. Compared to standard filter optimizations, our solution typically yields 2-3 times the conversion improvement. Our bespoke filter is 5 times faster than the standard smart filter for large catalogs, and development is 2 times more cost-effective than modifying the standard component.

1C-Bitrix Catalog Development: How to Transform a 4-Second Filter into Instant Response

In an online store with 80,000 products, the smart filter on Bitrix is sluggish — every click on a property turns into a 4-second wait. The customer clicks the 'Apple brand' checkbox, watches the spinning loader, and leaves for competitors. Conversion drops by 20%. This is a familiar pain. We specialize in 1C-Bitrix catalog development and filtering: we design architectures that handle half a million items without degradation — through faceted indexes, proper storage selection, and tagged caching. If your store is losing money due to a slow filter — order an audit of the current architecture, and we'll assess the problem in one day.

How Do Information Blocks Affect Catalog Performance?

Information blocks are the foundation of the catalog, but on projects with tens of thousands of products, they become a bottleneck. The standard bitrix:catalog.smart.filter generates JOINs on 6–8 property tables (b_iblock_element_property), leading MySQL into a full scan. We change the approach: during design, we determine which properties go into the information block and which into Highload blocks. For reference data (brands, cities, size charts) we use HLB: they work with a separate table without the overhead of b_iblock_element_property. When a 'Cities' dropdown loads for 8 seconds due to 5000 values — that's a signal to move them to HLB. A catalog of 80,000 products with a 4-second filter loses significant revenue annually due to customer attrition — the right architecture delivers that kind of savings. Contact us to estimate the benefit for your project.

What Is the Faceted Index and Why Is It Important?

The core performance lies here. Without a faceted index, every filter click is an SQL query with JOINs on b_iblock_element, b_iblock_element_property, b_catalog_price, and a few more tables. On 100,000 products, such a query takes 2–4 seconds. With a faceted index — 30–80 ms. According to official documentation, the faceted index reduces query execution time by tens of times (in real projects — up to 50 times). The mechanism: 1C-Bitrix creates a table b_catalog_smart_filter where it stores pre-calculated combinations of 'section + property + value + product count'. When filtering, the engine accesses this flat table instead of collecting data from the normalized structure of information blocks.

Common mistakes when configuring the faceted index include not creating the index for all sections, forgetting to set up background reindexing after bulk imports — causing property counters to mismatch the actual product count. Including all properties in the facet, even service ones, bloats the b_catalog_smart_filter table. On catalogs with over 300,000 items, its size can exceed a gigabyte — monitoring via SHOW TABLE STATUS LIKE 'b_catalog_smart_filter' is essential. Conclusion: the faceted index provides radical acceleration, but requires careful configuration and automatic reindexing via the agent CIBlockCatalog::ReindexFacet or cron.

Why Are Highload Blocks Faster Than Information Blocks for Reference Data?

Criterion Information Block (IB) Highload Block (HLB)
Property storage b_iblock_element_property table Separate flat table per HLB
Filter speed on 50k products ~500–800 ms (with facet) ~80–150 ms (without facet)
SEO support (URL, templates) Full None (only reference data)
Recommended for Products, sections, main properties Reference data (brands, cities), custom data
When Information Blocks Are Preferred Over HLBHighload blocks do not generate SEO-friendly URLs and lack a visual editor. If the reference data requires separate pages (e.g., brands with unique H1s), use information blocks. HLB is strictly for service data that does not need indexing.

In practice, the best architecture is hybrid. Products and sections live in information blocks — there you have SEO, visual editor, and standard catalog components. Reference properties with thousands of values are moved to Highload blocks. User data (favorites, viewed items, comparisons) also go to HLB — they grow quickly, and information blocks are not designed for that. Want to know which architecture to choose for your catalog? Contact us — we'll analyze your data structure and provide recommendations.

SEO Filters: How to Get SEO-Friendly URLs and Not Get Penalized by Yandex?

The standard filter generates ?filter[brand]=apple&filter[color]=black — search engines either do not index such URLs or consider them duplicates. But the query 'black apple laptops' is the most converting low-frequency traffic. We create SEO-friendly URLs: /catalog/laptops/brand-apple/color-black/ with unique title, description, and H1. Not template-based 'Buy {brand} in Minsk', but meaningful ones reflecting the specific combination.

  • Canonical URLs — to prevent /brand-apple/color-black/ and /color-black/brand-apple/ from duplicating.
  • Control of the number of indexed combinations — 10 properties with 20 values each yield millions of pages; Yandex penalizes that.
  • Automatic sitemap for SEO filter pages.
  • Admin interface for the manager — they decide which intersections to index.

Order the implementation of SEO filters — get a ready-made tool for attracting low-frequency traffic with conversion growth up to 30%.

What Methods Provide a Significant Performance Boost?

  • Fetching only necessary fields via arSelect — no SELECT * on information blocks.
  • Managed tag-based caching: when a product is added, the cache is automatically rebuilt.
  • Composite cache for anonymous users: TTFB < 100 ms, HTML is served without running PHP.
  • Indexes on properties used in filtering — without them MySQL scans the entire b_iblock_element_property table.
  • TTFB monitoring: if the catalog responds slower than 500 ms, we check the slow query log.

What Is Included in Comprehensive Catalog Development on 1C-Bitrix

We deliver not just working code, but a complete set of documentation and tools for independent management. Deliverables include:

  • Audit of current catalog and filtering architecture.
  • Project documentation describing data schema, distribution across information blocks and Highload blocks, and facet composition.
  • Ready smart filter with AJAX mode, grouping, and state persistence.
  • Configured faceted index with cron reindexing.
  • SEO filters with SEO-friendly URLs, unique meta tags, canonicals, and sitemap.
  • Integration of quick view and sorting (AJAX, mobile adaptation).
  • Operational documentation for managers: how to add properties, manage indexes and SEO combinations.
  • 30-day warranty support after delivery — we fix incidents and answer questions.

How We Develop a Catalog: Step-by-Step Plan

We don't just install components. The process includes:

  1. Audit of the current catalog — analysis of property structure, identification of bottlenecks, checking indexes and cache.
  2. Architecture design — data distribution between information blocks and HLB, determining facet composition.
  3. Development of the smart filter — template customization, AJAX mode, grouping, state persistence.
  4. Faceted index configuration — creation, cron reindexing, monitoring.
  5. SEO filters — SEO-friendly URLs, meta tags, canonicals, sitemap.
  6. Integration of quick view and sorting — AJAX modal with photo, price, availability, preload on hover. On mobile — bottom sheet instead of popup.
  7. Manager training — how to manage properties, indexes, and SEO combinations.
  8. Warranty support — 30 days after delivery.

Implementation Timeline

Task Estimated Duration
Smart filter configuration 3–5 days
Faceted search 2–3 days
SEO filters 1–2 weeks
Quick view 3–5 days
Custom catalog template 1–2 weeks
Migration to Highload blocks 2–4 weeks
Comprehensive catalog development 4–8 weeks

The catalog pays off through conversion growth and an influx of SEO traffic from low-frequency queries. The customer finds the product in two clicks, rather than leaving after the first click on the filter. Get a consultation — we will evaluate your project within a day and provide a project plan and roadmap for 1C-Bitrix catalog development. Contact us through the form on the website — certified specialists with over 200 successful projects.