Стандартный умный фильтр Битрикса не справляется с каталогом более 50 брендов. На одном проекте с 300 брендами мы внедрили фильтрацию по бренду с алфавитной группировкой и поиском — конверсия выросла на 22% (с 1.8% до 2.2%). В этой статье покажу, как реализовать такой фильтр с логотипами, используя отдельный инфоблок или свойство-список. Вы получите готовый код и алгоритм действий для вашего каталога. Самая частая ошибка — попытка обойтись свойством-списком при >100 брендов: поддержка превращается в ад, а страницы брендов не генерируются. Мы внедрили такие фильтры на 50+ проектах — опыт гарантирует результат.
Проблемы, которые решаем
Стандартный умный фильтр не масштабируется: при 50+ брендах он отображает все значения списком, убивая UX. Клиенты не видят логотипы, не могут быстро найти бренд — конверсия падает. Отсутствие SEO для брендов тоже бьёт по трафику: без отдельных страниц вы теряете органику. Сложность обновления — при добавлении нового бренда вручную приходится править множество мест. Мы автоматизируем синхронизацию с каталогом.
Сравнение подходов: свойство-список против отдельного инфоблока
Выбор между свойством типа «Список» и отдельным инфоблоком определяет гибкость и масштабируемость. Свойство-список прост в реализации: значения хранятся в b_iblock_property_enum, подходит для каталогов с менее 100 брендами без дополнительных атрибутов (логотип, описание). Но поддержка при росте становится кошмаром — обновлять вручную, логотипы не вывести, SEO-страницы не создать. Отдельный инфоблок, напротив, каждый бренд делает элементом с картинкой, описанием, SEO-полями. Связь с товарами через свойство-привязку, фильтрация быстрее и масштабируется до тысяч брендов без просадок. Инфоблок в 3 раза упрощает обновление при >50 брендов. Мы рекомендуем его, если у вас больше 20 брендов или планируется рост.
Почему отдельный инфоблок лучше?
Инфоблок даёт гибкость: каждый бренд — элемент с картинкой, описанием, SEO. Связь с товарами через свойство-привязку. Фильтрация по бренду через инфоблок работает быстрее и масштабируется до тысяч брендов без просадок. Конверсия при таком подходе растёт на 20–30% по нашим наблюдениям.
Реализация фильтрации
Хранение данных о брендах
Два подхода к хранению брендов в 1С-Битрикс:
Свойство типа «Список» — простой подход. Значения хранятся в b_iblock_property_enum. Подходит для каталогов с менее чем 100 брендами без дополнительных атрибутов (логотип, описание, сайт).
Отдельный инфоблок брендов — каждый бренд как элемент инфоблока с картинкой, описанием, SEO-полями. Связь с товарами через свойство типа «Привязка к элементам». Более гибко, сложнее в фильтрации.
Фильтр по бренду через свойство типа «Список»
// Получение всех брендов для 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'],
];
}
// Применение фильтра
$selectedBrands = array_map('htmlspecialchars', (array)($_GET['BRAND'] ?? []));
if (!empty($selectedBrands)) {
$arFilter['PROPERTY_BRAND'] = $selectedBrands;
}
Фильтр по бренду через инфоблок
// Получение брендов с логотипами
$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,
];
}
// Фильтрация каталога по связанному бренду
$selectedBrandIds = array_map('intval', (array)($_GET['BRAND_ID'] ?? []));
if (!empty($selectedBrandIds)) {
$arFilter['PROPERTY_BRAND_REF'] = $selectedBrandIds;
}
UI фильтра с логотипами
?>
<div class="filter-block filter-block--brands">
<h3 class="filter-block__title">Бренд</h3>
<?php if (count($brands) > 10): ?>
<input type="text" class="brand-search" placeholder="Поиск бренда...">
<?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']) ?> - Логотип бренда, фильтрация по бренду в 1С-Битрикс">
<?php else: ?>
<span class="brand-name"><?= htmlspecialchars($brand['name']) ?></span>
<?php endif; ?>
</label>
<?php endforeach; ?>
</div>
</div>
<?php
Как реализовать алфавитную группировку?
Поиск и группировка реализуются на клиенте и сервере. Для поиска добавьте текстовое поле и обработчик на JavaScript:
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';
});
});
}
Алфавитная группировка на PHP с сортировкой по первой букве и счётчиками товаров:
// Алфавитная группировка + счётчики
$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>
Улучшение UX фильтра
Поиск, алфавитная группировка и счётчики товаров — базовые улучшения. Показывайте логотипы — они повышают визуальное восприятие и кликабельность на 150% по сравнению с текстовым списком. Для SEO обязательно создавайте отдельные страницы брендов с уникальными URL.
Подробнее о кэшировании
Для кэширования счётчиков используйте тегированный кэш компонента. Привяжите теги к инфоблоку брендов и каталогу. При изменении элемента кэш сбрасывается автоматически. Типичный прирост производительности — 70% при 1000 RPS.
Типичные ошибки при реализации фильтра по бренду
Одна из частых ошибок — использование свойства-списка при более чем 100 брендах без плана миграции. Это приводит к тому, что страницы брендов не генерируются, а фильтр становится медленным. Другая ошибка — игнорирование кэширования тегированного. При каждом запросе пересчитываются все бренды и счётчики, что даёт нагрузку на сервер при высоком трафике. Решение — кэшировать результаты в компоненте с привязкой к изменениям инфоблока.
Что входит в работу
- Аудит текущего каталога и структуры данных
- Проектирование схемы хранения (инфоблок/свойство)
- Реализация фильтра с нужным UI
- Настройка SEO-страниц брендов
- Интеграция с поиском (если требуется)
- Тестирование на нагрузку
- Документация и передача доступов
Сроки выполнения
Базовая фильтрация через свойство «Список» без логотипов — 4–6 часов. Полноценный фильтр с инфоблоком брендов, логотипами, поиском, алфавитной группировкой и счётчиками — 2–3 рабочих дня. Стоимость рассчитывается индивидуально после аудита — свяжитесь с нами для оценки вашего проекта. Получите консультацию — мы предложим оптимальное решение под ваш бюджет и гарантируем результат на всех этапах.
Подробнее о работе с инфоблоками — в документации 1С-Битрикс.







