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
- Audit of the current catalog architecture and infoblock properties.
- Designing the denormalized index schema based on your data volume.
- Implementing facets with smart counters and caching.
- Configuring AJAX updates and clean URLs.
- Query optimization for catalogs up to 500,000 products.
- 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.

