Разработка фильтрации по бренду 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Разработка фильтрации по бренду 1С-Битрикс
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1238
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    844
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    582
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    749
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    981

Разработка фильтрации по бренду 1С-Битрикс

Фильтр по бренду — стандартная потребность для большинства B2C-каталогов. Стандартный умный фильтр обрабатывает его как обычное свойство типа «Список». Проблема возникает когда нужны логотипы брендов в фильтре, алфавитная группировка при 50+ брендах, отдельные страницы брендов со своими SEO-URL или быстрый поиск по названию бренда.

Хранение данных о брендах

Два подхода к хранению брендов в 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']) ?>">
            <?php else: ?>
            <span class="brand-name"><?= htmlspecialchars($brand['name']) ?></span>
            <?php endif; ?>
        </label>
        <?php endforeach; ?>
    </div>
</div>
<?php

Поиск по бренду

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';
    });
  });
}

Алфавитная группировка

При большом количестве брендов (50+) — группировка по первой букве:

$brandsByLetter = [];
foreach ($brands as $brand) {
    $letter = mb_strtoupper(mb_substr($brand['name'], 0, 1));
    $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']) ?>
            </label>
            <?php endforeach; ?>
        </div>
    </div>
    <?php endforeach; ?>
</div>

Счётчик товаров по бренду

// Подсчёт товаров для каждого бренда
$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;
}

// Использование в шаблоне
foreach ($brands as &$brand) {
    $brand['count'] = $brandCounts[$brand['id']] ?? 0;
}

Сроки выполнения

Фильтр по бренду через стандартное свойство «Список» без логотипов — 4–6 часов. Полноценный фильтр с инфоблоком брендов, логотипами, поиском, алфавитной группировкой и счётчиками — 2–3 рабочих дня.