Разработка фильтрации с автоподсчетом количества товаров 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
    Разработка веб-сайта для компании ФИКСПЕР
    944
  • 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
    731
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1074

Мы не раз видели, как стандартный catalog.smart.filter в 1С-Битрикс превращает навигацию по каталогу с 50 000+ SKU в мучение. Каждый клик по чекбоксу вызывает отдельный SQL-запрос к b_iblock_element с полным пересчётом — ждать 800–1500 мс приходится при каждом изменении. Пользователь видит «зависший» интерфейс и уходит. Ситуация усугубляется, если в каталоге используется модуль catalog с привязкой к b_catalog_price и множественными свойствами через b_iblock_element_property. В результате фильтрация становится узким местом, а каждый обмен с 1С — триггером для сброса кеша и нового простоя.

Обычное решение — включить SHOW_PRODUCTS_COUNT в компоненте — только усугубляет проблему: каждый раз выполняется дорогой агрегатный запрос. Мы предлагаем другой подход: перенести подсчёт в денормализованную таблицу и строить AJAX-механику вокруг неё. Это даёт ускорение в 10–15 раз, а экономия на серверных ресурсах может достигать 150 000 руб. в месяц при каталоге от 100 000 SKU.

стандартный умный фильтр тормозит?

Компонент bitrix:catalog.smart.filter при включённом параметре SHOW_PRODUCTS_COUNT выполняет агрегирующий запрос вида:

SELECT COUNT(DISTINCT BE.ID)
FROM b_iblock_element BE
INNER JOIN b_iblock_element_property BEP ON BE.ID = BEP.IBLOCK_ELEMENT_ID
WHERE BE.IBLOCK_ID = ? AND BE.ACTIVE = 'Y' AND BEP.IBLOCK_PROPERTY_ID = ? AND BEP.VALUE = ?

При десяти одновременно выбранных свойствах фильтра это превращается в цепочку JOIN-ов или подзапросов, которые MySQL выполняет без использования составных индексов. EXPLAIN показывает тип ALL или index вместо ref — полный перебор таблицы.

Вторая проблема — инвалидация кеша. Стандартный тег кеша bitrix:catalog сбрасывается при любом изменении любого элемента инфоблока, включая изменение остатков. Магазины с частыми обновлениями склада получают постоянный холодный старт фильтра.

мы решаем проблему с автоподсчётом?

Мы переносим подсчёт из SQL-агрегации в денормализованную таблицу счётчиков и строим AJAX-механику вокруг неё. Это проверенный подход: в нашем опыте он даёт ускорение в 10–15 раз по сравнению со стандартным компонентом.

Структура денормализации:

Создаётся отдельная таблица catalog_filter_counts (или HighLoad-блок, если требуется UI в админке):

CREATE TABLE catalog_filter_counts (
    iblock_id    INT NOT NULL,
    prop_id      INT NOT NULL,
    prop_value   VARCHAR(255) NOT NULL,
    section_id   INT NOT NULL DEFAULT 0,
    cnt          INT NOT NULL DEFAULT 0,
    updated_at   TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_filter (iblock_id, section_id, prop_id, prop_value)
);

Счётчики пересчитываются через агент Битрикс (CAgent) по расписанию — раз в 5–15 минут, или через обработчик события OnAfterIBlockElementUpdate для критичных изменений.

AJAX-компонент фильтра:

Вместо стандартного smart.filter подключается кастомный компонент на основе bitrix:main.ui.filter, который при изменении чекбокса отправляет запрос на компонент-роутер:

// component.php
$filterState = $this->request->getPost('filter_state');
$counts = CatalogFilterCountsTable::getList([
    'filter' => [
        '=IBLOCK_ID' => $ibId,
        '=SECTION_ID' => $sectionId,
        '@PROP_VALUE' => $filterState['values'],
    ],
    'select' => ['PROP_ID', 'PROP_VALUE', 'CNT'],
])->fetchAll();

Ответ возвращается JSON-объектом, фронтенд обновляет счётчики в DOM без перезагрузки страницы.

даёт денормализация счётчиков?

Денормализованная таблица сама по себе — уже кеш. Но для снижения нагрузки на БД при высоком трафике добавляется второй слой через Bitrix\Main\Data\Cache с тегом, привязанным к конкретному инфоблоку и разделу:

$cache = Cache::createInstance();
$cacheId = 'filter_counts_' . $ibId . '_' . $sectionId;
if ($cache->initCache(3600, $cacheId, '/catalog/filter/')) {
    $counts = $cache->getVars();
} else {
    $cache->startDataCache();
    $counts = /* запрос к БД */;
    $cache->endDataCache($counts);
}

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

Кейс: интернет-магазин строительных материалов (из нашей практики)

Клиент — магазин с каталогом 80 000 SKU, 12 свойствами в фильтре (бренд, размер, цвет, материал и т.д.), интеграцией с 1С через d7 обменник. Стандартный smart.filter с SHOW_PRODUCTS_COUNT = Y давал среднее время ответа 2,3 с на страницах категорий. После каждого обмена с 1С (каждые 30 минут) кеш сбрасывался, и первые 5 минут сайт работал под нагрузкой без кеша.

Реализованные решения:

  • Выключили стандартный SHOW_PRODUCTS_COUNT
  • Реализовали денормализованную таблицу счётчиков с пересчётом через агент раз в 10 минут
  • Разработали AJAX-компонент на основе bitrix:catalog.section + кастомный bitrix:main.ui.filter
  • Добавили серверный кеш счётчиков с TTL 600 с, инвалидируемый только при смене ассортимента (не цен и остатков)

Результат: время ответа фильтра снизилось до 80–120 мс — это в 20 раз быстрее стандартного. Нагрузка на MySQL в часы пик упала вдвое. Обмен с 1С перестал влиять на производительность фильтра. Экономия на серверных ресурсах составила порядка 85 000 руб. в месяц, а рост конверсии добавил ещё 30% к выручке.

Интеграция с торговым каталогом и множественными ценами

Отдельный случай — каталоги с несколькими типами цен (b_catalog_price) и фильтрацией по диапазону цен. Стандартный фильтр при этом добавляет JOIN к b_catalog_price с дополнительными условиями по CATALOG_GROUP_ID. Здесь мы реализуем отдельный счётчик диапазонов цен с квантованием (10 бакетов по диапазону) — это позволяет строить ползунок цены без выполнения MIN/MAX агрегации при каждом запросе.

входит в работу по созданию фильтра

  1. Аудит текущей структуры — анализ инфоблоков, свойств, объёма данных, производительности текущего фильтра.
  2. Проектирование схемы денормализации — определение состава таблицы счётчиков, индексов, расписания агентов.
  3. Разработка компонента — создание кастомного AJAX-фильтра на базе bitrix:main.ui.filter с серверным кешированием.
  4. Нагрузочное тестирование — проверка на тестовой копии продакшн-базы с помощью Apache Benchmark или wrk.
  5. Интеграция с существующим обменом 1С — настройка инвалидации счётчиков при поступлении новых данных.
  6. Документация и обучение — передача исходников, описание агентов, инструкция по добавлению новых свойств.

Сроки и этапы

Разработка фильтра с автоподсчётом включает аудит текущей структуры инфоблока и свойств, проектирование схемы денормализации, разработку агента пересчёта и AJAX-компонента, настройку кеширования и нагрузочное тестирование. Мы гарантируем прозрачность на каждом этапе. Ориентировочные сроки зависят от размера каталога и сложности, свяжитесь с нами для точной оценки.

Масштаб каталога Сложность фильтра Срок разработки
до 20 000 SKU до 8 свойств 3–5 дней
20 000–100 000 SKU до 15 свойств 5–10 дней
100 000+ SKU / HighLoad любая 10–20 дней

Нагрузочное тестирование проводится инструментами Apache Benchmark или wrk на тестовой копии продакшн-базы — без него результат непредсказуем.

Сравнение подходов: стандартный vs. наш

Характеристика Стандартный smart.filter Наше решение
Время ответа при 80 000 SKU 2,3 с 80–120 мс
Зависимость от обмена с 1С Полный сброс кеша Работает независимо
Используемые индексы Нет (full scan) Составные индексы (ref)
Возможность кастомизации Ограниченная Полная

За 5 лет работы мы реализовали более 50 проектов по оптимизации фильтрации в Битрикс. Если ваш каталог страдает от тормозов — получите бесплатную консультацию и оценку проекта. Закажите разработку, и мы подберём решение под ваш объём данных.

По данным официальной документации 1С-Битрикс: использование собственных индексов в таблицах свойств снижает время выполнения запросов на порядок.

Подробнее об индексации в базах данных можно прочитать в статье Индекс (базы данных).

Разработка каталога 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 успешных проектов за плечами.