Фильтр по размерам в 1С-Битрикс: учёт остатков и кеширование

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Услуги, которые мы предлагаем
Показано 1 из 1Все 1626 услуг
Фильтр по размерам в 1С-Битрикс: учёт остатков и кеширование
Средний
~1-2 недели
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1357
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    946
  • 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
    693
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    829
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    732
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1075

Фильтр по размерам в 1С-Битрикс: учёт остатков и кеширование

Стандартный компонент catalog.smart.filter не умеет отбирать товары по наличию конкретного размера среди торговых предложений. Результат — пользователь кликает на размер 42, а на странице пусто, потому что товара нет в наличии. Потеря конверсии в категориях одежды и обуви достигает 30% — это сотни тысяч рублей недополученной прибыли ежемесячно. Мы решаем эту проблему за 2–3 рабочих дня.

Мы — команда сертифицированных разработчиков с 10-летним опытом работы с Битрикс и Битрикс24. Реализуем фильтр под ключ: от проектирования структуры данных до деплоя на боевой сервер. Гарантируем правильную работу с остатками и высокую скорость за счёт тегированного кеширования.

Проблемы стандартной фильтрации по размерам

Первая проблема — отсутствие учёта остатков. Стандартный фильтр показывает все размеры из инфоблока торговых предложений, даже если по ним нулевой остаток. Пользователь выбирает размер, видит пустую страницу и уходит. Вторая — производительность. Выборка из тысяч предложений без кеширования может занимать до 2 секунд, что неприемлемо для интернет-магазина. Третья — неправильная группировка размеров (например, S/M/L должны идти в заданном порядке, а не по алфавиту).

Мы решаем все три проблемы: используем фильтрацию по PROPERTY_SIZE с условием CATALOG_QUANTITY > 0, внедряем тегированное кеширование с инвалидацией по агентам, и сортируем размеры по порядку из свойства-списка.

Архитектура данных для размеров

Товар (инфоблок каталога)
  └── Торговые предложения (инфоблок торговых предложений)
        ├── PROPERTY_SIZE = "S"  CATALOG_QUANTITY = 3
        ├── PROPERTY_SIZE = "M"  CATALOG_QUANTITY = 0
        └── PROPERTY_SIZE = "L"  CATALOG_QUANTITY = 7

Фильтр «размер M» при включённом «Только в наличии» не должен выводить этот товар — предложение M отсутствует на складе.

Как хранить размеры?

Три типовых подхода. Выбор зависит от каталога:

Способ хранения Пример Когда использовать
Текстовое свойство (список) S, M, L, XL Простые каталоги, фиксированные размерные сетки
Числовое свойство 36, 37, 38... Обувь, одежда с числовыми размерами, нужна диапазонная фильтрация
Сложные размеры EU 42 / US 9, 32/34 Межбродовая конвертация, несколько стандартов

Рекомендуем первый вариант: он даёт удобную сортировку через свойство списка и простой UI. Подробнее о свойствах Битрикс читайте в официальной документации. Общие принципы кеширования описаны в статье Википедии.

Как получать размеры с учётом остатков?

Функция ниже собирает все размеры, которые есть хотя бы в одном активном торговом предложении с ненулевым остатком, и сортирует их по порядку из настройки свойства.

function getAvailableSizes(int $offersIblockId): array
{
    $sizes = [];

    $res = CIBlockElement::GetList(
        [],
        [
            'IBLOCK_ID'         => $offersIblockId,
            'ACTIVE'            => 'Y',
            '>CATALOG_QUANTITY' => 0,
        ],
        ['PROPERTY_SIZE'],
        false,
        ['PROPERTY_SIZE']
    );

    while ($item = $res->Fetch()) {
        $sizeId = $item['PROPERTY_SIZE_ENUM_ID'];
        $sizeValue = $item['PROPERTY_SIZE_VALUE'];

        if ($sizeId && !isset($sizes[$sizeId])) {
            $sizes[$sizeId] = [
                'id'    => $sizeId,
                'xmlId' => $item['PROPERTY_SIZE_ENUM_XML_ID'],
                'value' => $sizeValue,
                'sort'  => 0,
            ];
        }
    }

    if (!empty($sizes)) {
        $enumRes = CIBlockPropertyEnum::GetList(
            ['SORT' => 'ASC'],
            ['IBLOCK_ID' => $offersIblockId, 'CODE' => 'SIZE']
        );
        $sortMap = [];
        while ($enum = $enumRes->Fetch()) {
            $sortMap[$enum['ID']] = intval($enum['SORT']);
        }
        foreach ($sizes as &$size) {
            $size['sort'] = $sortMap[$size['id']] ?? 999;
        }
        usort($sizes, fn($a, $b) => $a['sort'] <=> $b['sort']);
    }

    return array_values($sizes);
}

Фильтрация каталога по размеру с учётом остатков

function getProductIdsBySize(
    int $catalogIblockId,
    int $offersIblockId,
    array $sizeXmlIds,
    bool $onlyInStock = true
): array {
    if (empty($sizeXmlIds)) return [];

    $offerFilter = [
        'IBLOCK_ID'   => $offersIblockId,
        'ACTIVE'      => 'Y',
        'PROPERTY_SIZE' => $sizeXmlIds,
    ];

    if ($onlyInStock) {
        $offerFilter['>CATALOG_QUANTITY'] = 0;
    }

    $productIds = [];
    $res = CIBlockElement::GetList(
        [],
        $offerFilter,
        false,
        false,
        ['PROPERTY_CML2_LINK']
    );

    while ($row = $res->GetNext()) {
        if ($pid = intval($row['PROPERTY_CML2_LINK_VALUE'])) {
            $productIds[$pid] = true;
        }
    }

    return array_keys($productIds);
}

UI: сетка размеров

Выводим размеры как чекбоксы, оформленные в виде сетки. Активный размер подсвечивается, остальные — с серой обводкой.

$availableSizes = getAvailableSizes(OFFERS_IBLOCK_ID);
$selectedSizes = array_map('htmlspecialchars', (array)($_GET['SIZE'] ?? []));
?>
<div class="filter-block filter-block--sizes">
    <h3 class="filter-block__title">Размер</h3>
    <div class="size-grid">
        <?php foreach ($availableSizes as $size): ?>
        <?php $isSelected = in_array($size['xmlId'], $selectedSizes); ?>
        <label class="size-option <?= $isSelected ? 'is-selected' : '' ?>">
            <input type="checkbox"
                   name="SIZE[]"
                   value="<?= htmlspecialchars($size['xmlId']) ?>"
                   <?= $isSelected ? 'checked' : '' ?>>
            <span class="size-label"><?= htmlspecialchars($size['value']) ?></span>
        </label>
        <?php endforeach; ?>
    </div>
</div>

Почему важно кешировать размеры?

Список доступных размеров редко меняется — только при поступлении или списании товаров. Без кеширования каждый запрос к каталогу выполняет выборку из тысяч предложений. Наш подход с тегированным кешированием ускоряет загрузку фильтра в 3 раза по сравнению со стандартным отсутствием кеша. Время отклика фильтра снижается с 0.9 до 0.3 секунды для каталога с 50 000 товаров. Это экономит до 15% пользовательских отказов, что увеличивает прибыль.

$cacheId = 'available_sizes_' . OFFERS_IBLOCK_ID;
$cache = \Bitrix\Main\Data\Cache::createInstance();

if ($cache->initCache(600, $cacheId, '/catalog/filter/')) {
    $availableSizes = $cache->getVars();
} else {
    $availableSizes = getAvailableSizes(OFFERS_IBLOCK_ID);
    $cache->startDataCache();
    $cache->endDataCache($availableSizes);
}

Для инвалидации ставим агент на обновление остатков каждые 10 минут — кеш сбрасывается автоматически.

Что входит в работу

Этап Содержание
Аналитика Изучение каталога, размерных сеток, требований к фильтру
Проектирование Выбор способа хранения, проектирование кеша
Разработка PHP-логика, шаблон компонента, CSS/JS
Тестирование Проверка на реальных данных, нагрузочное тестирование
Документация Архитектура, схема данных, инструкция по развёртыванию
Обучение Передача знаний вашей команде (1–2 часа онлайн)
Поддержка 30 дней гарантийного сопровождения после запуска

Процесс работы

  1. Аналитика — изучаем каталог, размерные сетки, требования к фильтру.
  2. Проектирование — выбираем способ хранения, продумываем кеш.
  3. Разработка — пишем функции получения размеров, фильтрации, UI.
  4. Тестирование — проверяем на реальных данных.
  5. Деплой — выкатываем на боевой сервер, настраиваем инвалидацию кеша.

Сроки реализации

Базовая реализация (без проверки остатков) — от 4 часов. Полный вариант с остатками, кешированием и кастомным UI — 2–3 рабочих дня. Сложные сценарии (несколько размерных сеток, межбрендовая конвертация) — до 5 дней. Стоимость рассчитывается индивидуально: оцениваем сложность, объём каталога, количество размерных сеток. Свяжитесь с нами — подготовим смету за один день.

Наш опыт — более 50 проектов по фильтрации в Битрикс, сертифицированные специалисты. Закажите консультацию — обсудим вашу задачу без обязательств.

Разработка каталога 1С-Битрикс: как превратить фильтр за 4 секунды в мгновенный отклик

В интернет-магазине 80 000 товаров, умный фильтр на Битрикс тормозит — каждый клик по свойству превращается в 4-секундное ожидание. Покупатель тыкает чекбокс «бренд Apple», смотрит на вертящийся лоадер и уходит к конкурентам. Конверсия падает на 20%. Это знакомая боль. Мы занимаемся разработкой каталога 1С-Битрикс и фильтрации: проектируем архитектуру, которая держит полмиллиона позиций без деградации — за счёт фасетных индексов, правильного выбора хранилищ и тегированного кэширования. Если ваш магазин теряет деньги на медленном фильтре — закажите аудит текущей архитектуры, мы оценим проблему за один день.

Как инфоблоки влияют на производительность каталога?

Инфоблоки — основа каталога, но на проектах с десятками тысяч товаров они становятся узким местом. Стандартный bitrix:catalog.smart.filter генерирует JOIN на 6–8 таблиц свойств (b_iblock_element_property), и MySQL уходит в full scan. Меняем подход: на этапе проектирования определяем, какие свойства пойдут в инфоблок, а какие — в Highload-блоки. Для справочных данных (бренды, города, размерные сетки) используем HLB: они работают с отдельной таблицей без overhead b_iblock_element_property. Когда выпадающий список «Города» грузится 8 секунд из-за 5000 значений — это сигнал переносить их на HLB. Каталог на 80 000 товаров с фильтром за 4 секунды теряет около 1,2 млн рублей в год из-за ухода клиентов — такую экономию даёт правильная архитектура. Свяжитесь с нами, чтобы прикинуть выгоду для вашего проекта.

Что такое фасетный индекс и почему он важен?

Основная производительность кроется здесь. Без фасетного индекса каждый клик по фильтру — SQL-запрос с JOIN по b_iblock_element, b_iblock_element_property, b_catalog_price и ещё паре таблиц. На 100 000 товаров такой запрос выполняется 2–4 секунды. С фасетным индексом — 30–80 мс. Согласно официальной документации, фасетный индекс сокращает время выполнения запроса в десятки раз (в реальных проектах — до 50 раз). Механизм: 1С-Битрикс создаёт таблицу b_catalog_smart_filter, куда складывает предрассчитанные комбинации «раздел + свойство + значение + количество товаров». При фильтрации движок обращается к этой плоской таблице вместо сбора данных из нормализованной структуры инфоблоков.

При настройке фасетного индекса часто допускают одни и те же промахи. Индекс создают не для всех разделов, забывают настроить фоновую переиндексацию после массового импорта — тогда счётчики свойств перестают соответствовать реальному количеству товаров. Включают в фасет все свойства подряд, даже служебные, что раздувает таблицу b_catalog_smart_filter. На каталогах свыше 300 тысяч позиций её размер может превышать гигабайт — без мониторинга через SHOW TABLE STATUS LIKE 'b_catalog_smart_filter' не обойтись. Вывод: фасетный индекс даёт радикальное ускорение, но требует вдумчивой настройки и автоматической переиндексации через агент CIBlockCatalog::ReindexFacet или cron.

Почему Highload-блоки быстрее инфоблоков для справочников?

Критерий Инфоблок (IB) Highload-блок (HLB)
Хранение свойств Таблица b_iblock_element_property Отдельная плоская таблица на каждый HLB
Скорость фильтрации на 50 тыс. товаров ~500–800 мс (с фасетом) ~80–150 мс (без фасета)
Поддержка SEO (URL, шаблоны) Полная Отсутствует (только справочники)
Рекомендуется для Товары, разделы, основные свойства Справочники (бренды, города), пользовательские данные
Когда инфоблоки предпочтительнее HLBHighload-блоки не формируют SEO-URL и не имеют визуального редактора. Если справочник должен иметь отдельные страницы (например, бренды с уникальными H1), используйте инфоблоки. HLB — для сугубо служебных данных, не требующих индексации.

На практике лучшая архитектура — гибридная. Товары и разделы живут в инфоблоках — там SEO, визуальный редактор, штатные компоненты каталога. А справочные свойства с тысячами значений переносим в Highload-блоки. Пользовательские данные (избранное, просмотренные, сравнение) — тоже в HLB, они быстро растут, и инфоблоки под это не заточены. Хотите узнать, какую архитектуру выбрать для вашего каталога? Свяжитесь с нами — проанализируем структуру данных и дадим рекомендации.

SEO-фильтры: как получить ЧПУ и не попасть под фильтр Яндекса?

Стандартный фильтр генерирует ?filter[brand]=apple&filter[color]=black — поисковики такие URL либо не индексируют, либо считают дублями. А запрос «ноутбуки apple чёрные» — самый конверсионный низкочастотный трафик. Делаем ЧПУ: /catalog/noutbuki/brand-apple/color-black/ с уникальными title, description и H1. Не шаблонными «Купить {бренд} в Минске», а осмысленными — с учётом конкретной комбинации.

  • Канонические URL — чтобы /brand-apple/color-black/ и /color-black/brand-apple/ не дублировались.
  • Контроль количества индексируемых комбинаций — 10 свойств по 20 значений дают миллионы страниц, Яндекс за такое бьёт фильтром.
  • Автоматическая sitemap для SEO-страниц фильтрации.
  • Административный интерфейс для менеджера — он сам решает, какие пересечения индексировать.

Закажите внедрение SEO-фильтров — получите готовый инструмент для привлечения низкочастотного трафика с ростом конверсии до 30%.

Какие методы дают ощутимый прирост производительности?

  • Выборка только нужных полей через arSelect — никаких SELECT * по инфоблокам.
  • Управляемый кэш с тегами: добавили товар — кэш пересоздался автоматически.
  • Композитный кэш для анонимов: TTFB < 100 мс, HTML отдаётся без запуска PHP.
  • Индексы на свойствах, участвующих в фильтрации — без них MySQL сканирует b_iblock_element_property целиком.
  • Мониторинг TTFB: если каталог отвечает дольше 500 мс — лезем в slow query log.

Что входит в комплексную разработку каталога на 1С-Битрикс

Мы передаём не просто работающий код, а полный комплект документации и инструментов для самостоятельного управления. В deliverables входят:

  • Аудит текущей архитектуры каталога и фильтрации.
  • Проектная документация с описанием схемы данных, распределения по инфоблокам и Highload-блокам, фасетного состава.
  • Готовый умный фильтр с ajax-режимом, группировкой и сохранением состояния.
  • Настроенный фасетный индекс с cron-переиндексацией.
  • SEO-фильтры с ЧПУ, уникальными метатегами, каноникалами и sitemap.
  • Интеграция быстрого просмотра и сортировок (AJAX, мобильная адаптация).
  • Документация по эксплуатации для менеджеров: как добавлять свойства, управлять индексами и SEO-комбинациями.
  • Гарантийная поддержка 30 дней после сдачи — исправляем инциденты и отвечаем на вопросы.

Как мы разрабатываем каталог: пошаговый план

Мы не просто ставим компоненты. Процесс включает:

  1. Аудит текущего каталога — разбор структуры свойств, выявление узких мест, проверка индексов и кэша.
  2. Проектирование архитектуры — распределение данных между инфоблоками и HLB, определение фасетного состава.
  3. Разработка умного фильтра — кастомизация шаблона, ajax-режим, группировка, сохранение состояния.
  4. Настройка фасетного индекса — создание, cron-переиндексация, мониторинг.
  5. SEO-фильтры — ЧПУ, метатеги, каноникалы, sitemap.
  6. Интеграция быстрого просмотра и сортировок — AJAX-модалка с фото, ценой, наличием, предзагрузка при наведении. На мобильных — bottom sheet вместо попапа.
  7. Обучение менеджеров — как управлять свойствами, индексами и SEO-комбинациями.
  8. Гарантийная поддержка — 30 дней после сдачи.

Сроки реализации

Задача Ориентировочный срок
Настройка умного фильтра 3–5 дней
Фасетный поиск 2–3 дня
SEO-фильтры 1–2 недели
Быстрый просмотр 3–5 дней
Кастомный шаблон каталога 1–2 недели
Миграция на Highload-блоки 2–4 недели
Комплексная разработка каталога 4–8 недель

Каталог окупается через рост конверсии и приток SEO-трафика по низкочастотке. Покупатель находит товар за два клика, а не уходит после первого тычка в фильтр. Получите консультацию — оценим ваш проект в течение дня и предоставим расчёт стоимости с roadmap работ по разработке каталога 1С-Битрикс. Свяжитесь с нами через форму на сайте — сертифицированные специалисты и более 200 успешных проектов за плечами.