Custom Catalog Filter Module for 1C-Bitrix

Custom Catalog Filter Module for 1C-Bitrix Imagine: your catalog has grown to 50,000 products, and the standard Bitrix filter starts loading the page in 10 seconds. We've encountered this on almost every second project. Over 8 years developing modules for Bitrix, we've crafted a solution that pro

Our competencies:

Frequently Asked Questions

Custom Catalog Filter Module for 1C-Bitrix

Imagine: your catalog has grown to 50,000 products, and the standard Bitrix filter starts loading the page in 10 seconds. We've encountered this on almost every second project. Over 8 years developing modules for Bitrix, we've crafted a solution that provides a performance guarantee even on catalogs with 200+ properties. Savings on server resources through optimized queries can reduce infrastructure costs by up to 60% for high-volume catalogs. Typical investment starts at $2,000 for a basic module.

The standard component catalog.section.list with the filter catalog.section.list.filter works out-of-the-box, but with a large number of properties (b_iblock_element_prop_s*, b_iblock_element_prop_m*), queries become slow due to multiple JOINs. Checkboxes show all possible values without considering how many products are behind them — users click and get an empty result. Dynamic filter rebuilding kills performance on catalogs from 10,000 items.

Denormalized Index Acceleration of Filtering

The root cause is the storage architecture of infoblock properties. Each property requires a separate JOIN. Our solution is a denormalized filter index. The module creates and maintains a table myvendor_filter_index where for each product a flat structure of all filterable property values is stored in JSONB:

CREATE TABLE myvendor_filter_index ( element_id INT PRIMARY KEY, section_id INT NOT NULL, price_min DECIMAL(12,2), in_stock BOOLEAN, props JSONB NOT NULL -- {"brand": "Samsung", "color": ["black", "white"]} ); CREATE INDEX idx_filter_props ON myvendor_filter_index USING gin(props); CREATE INDEX idx_filter_section ON myvendor_filter_index(section_id); CREATE INDEX idx_filter_price ON myvendor_filter_index(price_min); 

The indexing approach uses GIN which supports advanced operators like @>, ?, ?|. The index is updated via the OnAfterIBlockElementUpdate event for a specific product and via an agent for bulk recalculation. According to our tests with EXPLAIN ANALYZE, the JSONB index executes queries 15 times faster than standard JOINs on catalogs from 50,000 products, reducing query plan cost from thousands to tens.

Index update details

The agent runs every 5 minutes when there are changes. It collects IDs of changed elements and updates only their records in myvendor_filter_index. During mass import from 1C, the index is rebuilt on a schedule — a nightly agent performs a full re-index.

Importance of Smart Counters (Facets) for UX

This is a key feature — showing next to each filter value the number of products that correspond to it taking into account already selected filters. This behavior is called faceted search (Faceted search).

-- Counting options for the filter "Brand" -- taking into account the already selected filter "Color: black" SELECT props->>'brand' AS brand, COUNT(*) AS cnt FROM myvendor_filter_index WHERE section_id = :section_id AND in_stock = true AND props @> '{"color": "black"}'::jsonb GROUP BY props->>'brand' ORDER BY cnt DESC; 

This query returns all brands with the count of in-stock black products. A separate such query is executed for each property — but it's fast thanks to the GIN index. The count results are cached with tags based on the section and the active filter set. When any product changes, the tag is reset. Cache TTL is 30 minutes.

AJAX Update Mechanism

When the filter changes, the page does not reload: an AJAX request goes to /api/catalog/filter/, the server returns JSON with the IDs of filtered products and updated counters. The frontend updates the list and checkboxes. The browser history is updated via history.pushState. This ensures smooth navigation without flickering.

Filter URL Scheme

The filter builds "clean" URLs that are SEO-friendly:

  • /catalog/smartphones/brand-samsung/color-black/ — a page with filters and product list
  • /catalog/smartphones/brand-samsung/ — a category filter with its own H1 and description

Key filter pages can have unique meta tags set via the module's admin interface. Others are automatically generated based on a template. This improves indexing and ranking in search engines.

Results Ranking

In addition to filtering, the module manages sorting: by price, popularity (number of orders from b_sale_basket), novelty, rating. "Popularity" is recalculated by an agent once a day and stored in myvendor_filter_index.popularity_score.

Comparison: Standard Filter vs Our Module

Parameter Standard Bitrix Filter Our Module
Query time (50k products, 100 properties) 8–12 sec 0.3–0.8 sec
Number of JOINs in query 10–100+ 1 (to denormalized table)
Smart counters No Yes
SEO-URL /catalog/?filter=... /catalog/brand-samsung/
Caching of results Limited Tagged with TTL 30 min

Stages of Filter Module Development

  1. Audit of the current catalog architecture and infoblock properties.
  2. Designing the denormalized index schema based on your data volume.
  3. Implementing facets with smart counters and caching.
  4. Configuring AJAX updates and clean URLs.
  5. Query optimization for catalogs up to 500,000 products.
  6. Documentation for maintenance and training administrators.

What's Included in the Deliverables

  • Complete source code of the custom filter module
  • Detailed technical documentation and deployment guide
  • Admin training session (up to 4 hours)
  • 6 months of support and bug fixes
  • Performance report with before/after metrics

Development Timelines

Scale Scope Timeline
Basic Denormalized index + checkboxes + price range 3–4 weeks
Medium + Smart counters (facets) + AJAX + URL scheme 5–7 weeks
Extended + SEO filter pages + personalized sorting 8–11 weeks

The number of infoblock properties and catalog size are the main factors in choosing the architecture. With 200+ properties, the JSONB approach requires careful index schema design.

Why Choose Us

We have been developing modules for Bitrix for over 8 years, implementing 40+ projects with catalog filtering. We guarantee performance on volumes from 10,000 products. We offer turnkey filter module development — write to us for a free project evaluation. The package includes everything you need: documentation, training, and ongoing support. Contact us today to get a customized solution within your budget.