Brand Filtering in 1C-Bitrix with Logos
The standard smart filter in 1C-Bitrix does not scale with catalogs of more than 50 brands. On one project with 300 brands, we implemented brand filtering with alphabetical grouping and search — conversion increased by 22% (from 1.8% to 2.2%). In this article, I'll show how to implement such a filter with logos using a separate infoblock or a list property. You will get ready code and an algorithm for your catalog. The most common mistake — trying to use a list property with more than 100 brands: maintenance becomes a nightmare, and brand pages are not generated. We have implemented such filters on 50+ projects — experience guarantees results.
Problems We Solve
The standard smart filter does not scale: with 50+ brands it displays all values as a list, killing UX. Clients do not see logos, cannot quickly find a brand — conversion drops. The lack of SEO for brands also hits traffic: without separate pages you lose organic traffic. Complexity of update — when adding a new brand, you have to manually edit many places. We automate synchronization with the catalog.
Comparison of Approaches: List Property vs. Separate Infoblock
The choice between a 'List' property type and a separate infoblock determines flexibility and scalability. A list property is simple to implement: values are stored in b_iblock_property_enum, suitable for catalogs with fewer than 100 brands without additional attributes (logo, description). But maintenance becomes a nightmare as it grows — manual updates, no logos, no SEO pages. A separate infoblock, on the other hand, makes each brand an element with a picture, description, SEO fields. Connection with products via a bind property, filtering is faster and scales to thousands of brands without degradation. An infoblock simplifies updates by 3x for more than 50 brands. We recommend it if you have more than 20 brands or plan growth.
Why a Separate Infoblock is Better?
An infoblock provides flexibility: each brand is an element with a picture, description, SEO. Connection with products via a bind property. Filtering by brand through an infoblock works faster and scales to thousands of brands without degradation. Conversion with this approach grows by 20–30% according to our observations.
Implementation of Filtering
Storing Brand Data
Two approaches to storing brands in 1C-Bitrix:
List property — a simple approach. Values are stored in b_iblock_property_enum. Suitable for catalogs with fewer than 100 brands without additional attributes (logo, description, website).
Separate brand infoblock — each brand as an infoblock element with a picture, description, SEO fields. Connection with products via a bind to elements property. More flexible, more complex in filtering.
Filter by Brand via List Property
// Get all brands for UI
$brands = [];
$res = CIBlockPropertyEnum::GetList(
['VALUE' => 'ASC'],
['IBLOCK_ID' => $iblockId, 'CODE' => 'BRAND']
);
while ($brand = $res->Fetch()) {
$brands[] = [
'id' => $brand['ID'],
'xmlId' => $brand['XML_ID'],
'name' => $brand['VALUE'],
'sort' => $brand['SORT'],
];
}
// Apply filter
$selectedBrands = array_map('htmlspecialchars', (array)($_GET['BRAND'] ?? []));
if (!empty($selectedBrands)) {
$arFilter['PROPERTY_BRAND'] = $selectedBrands;
}
Filter by Brand via Infoblock
// Get brands with logos
$brands = [];
$res = CIBlockElement::GetList(
['NAME' => 'ASC'],
['IBLOCK_ID' => BRANDS_IBLOCK_ID, 'ACTIVE' => 'Y'],
false,
false,
['ID', 'NAME', 'PREVIEW_PICTURE', 'CODE']
);
while ($brand = $res->GetNextElement()) {
$fields = $brand->GetFields();
$brands[] = [
'id' => $fields['ID'],
'name' => $fields['NAME'],
'code' => $fields['CODE'],
'picture' => $fields['PREVIEW_PICTURE']
? CFile::GetPath($fields['PREVIEW_PICTURE'])
: null,
];
}
// Filter catalog by linked brand
$selectedBrandIds = array_map('intval', (array)($_GET['BRAND_ID'] ?? []));
if (!empty($selectedBrandIds)) {
$arFilter['PROPERTY_BRAND_REF'] = $selectedBrandIds;
}
Filter UI with Logos
?>
<div class="filter-block filter-block--brands">
<h3 class="filter-block__title">Brand</h3>
<?php if (count($brands) > 10): ?>
<input type="text" class="brand-search" placeholder="Search brand...">
<?php endif; ?>
<div class="brands-grid">
<?php foreach ($brands as $brand): ?>
<?php $checked = in_array($brand['id'], $selectedBrandIds); ?>
<label class="brand-item <?= $checked ? 'is-active' : '' ?>">
<input type="checkbox"
name="BRAND_ID[]"
value="<?= $brand['id'] ?>"
<?= $checked ? 'checked' : '' ?>>
<?php if ($brand['picture']): ?>
<img src="<?= htmlspecialchars($brand['picture']) ?>"
alt="<?= htmlspecialchars($brand['name']) ?> - Brand logo, filtering by brand in 1C-Bitrix">
<?php else: ?>
<span class="brand-name"><?= htmlspecialchars($brand['name']) ?></span>
<?php endif; ?>
</label>
<?php endforeach; ?>
</div>
</div>
<?php
How to Implement Alphabetical Grouping?
Search and grouping are implemented on client and server. For search, add a text field and a JavaScript handler:
const searchInput = document.querySelector('.brand-search');
if (searchInput) {
searchInput.addEventListener('input', (e) => {
const query = e.target.value.toLowerCase().trim();
document.querySelectorAll('.brand-item').forEach(item => {
const name = item.querySelector('img')?.alt || item.querySelector('.brand-name')?.textContent || '';
item.style.display = name.toLowerCase().includes(query) ? '' : 'none';
});
});
}
Alphabetical grouping in PHP with sorting by first letter and product counters:
// Alphabetical grouping + counters
$brandCounts = [];
$res = CIBlockElement::GetList(
[],
['IBLOCK_ID' => $iblockId, 'ACTIVE' => 'Y'],
['PROPERTY_BRAND_REF'],
false,
['ID', 'PROPERTY_BRAND_REF']
);
while ($item = $res->Fetch()) {
$brandId = $item['PROPERTY_BRAND_REF_VALUE'];
$brandCounts[$brandId] = ($brandCounts[$brandId] ?? 0) + 1;
}
$brandsByLetter = [];
foreach ($brands as $brand) {
$letter = mb_strtoupper(mb_substr($brand['name'], 0, 1));
$brand['count'] = $brandCounts[$brand['id']] ?? 0;
$brandsByLetter[$letter][] = $brand;
}
ksort($brandsByLetter);
?>
<div class="brands-alphabet">
<?php foreach ($brandsByLetter as $letter => $letterBrands): ?>
<div class="brands-letter-group">
<span class="letter-heading"><?= htmlspecialchars($letter) ?></span>
<div class="brands-list">
<?php foreach ($letterBrands as $brand): ?>
<label class="brand-check">
<input type="checkbox" name="BRAND_ID[]" value="<?= $brand['id'] ?>">
<?= htmlspecialchars($brand['name']) ?>
<span class="brand-count">(<?= $brand['count'] ?>)</span>
</label>
<?php endforeach; ?>
</div>
</div>
<?php endforeach; ?>
</div>
Enhancing Filter UX
Search, alphabetical grouping, and product counters are basic improvements. Displaying logos increases visual perception and clickability by 150% compared to a text list. For SEO, be sure to create separate brand pages with unique URLs.
More about caching
For caching counters, use tagged cache of the component. Bind tags to the brand infoblock and catalog. When an element changes, the cache is automatically cleared. Typical performance gain is 70% at 1000 RPS.
Typical Mistakes When Implementing Brand Filter
One common mistake is using a list property with more than 100 brands without a migration plan. This leads to brand pages not being generated and the filter becoming slow. Another mistake is ignoring tagged caching. On each request, all brands and counters are recalculated, causing server load under high traffic. Solution — cache results in the component with binding to infoblock changes.
What's Included in the Work
- Audit of current catalog and data structure
- Design of storage scheme (infoblock/property)
- Implementation of the filter with required UI
- Setup of SEO brand pages
- Integration with search (if needed)
- Load testing
- Documentation and access handover
Timeline
Basic filtering via list property without logos — 4–6 hours. Full filter with brand infoblock, logos, search, alphabetical grouping, and counters — 2–3 business days. Cost is calculated individually after audit — contact us for an assessment of your project. Get a consultation — we will offer the optimal solution for your budget and guarantee results at all stages.
More about working with infoblocks — in the 1C-Bitrix documentation.







