Разработка фильтрации по наличию на складе 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

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

Мы часто получаем запросы на реализацию фильтра «Только в наличии» — одного из самых востребованных после ценового диапазона. На первый взгляд всё просто: добавить чекбокс и условие в фильтр. Но сложность возникает, когда нужно учитывать несколько складов, торговые предложения (SKU), зарезервированные остатки и данные из 1С с задержкой синхронизации. Без правильного подхода фильтр показывает некорректные остатки, что приводит к ошибкам в заказах и недовольству клиентов. В этой статье мы разберём технические нюансы и предложим проверенное на практике решение, которое мы используем в коммерческих проектах.

Проблемы и их решение

Торговые предложения (SKU). Остатки хранятся у предложений, не у товара. Простое условие >CATALOG_QUANTITY не найдёт товар, если у него есть предложения с остатком. Многоскладской учёт. Остатки распределены по складам. Фильтр должен учитывать только те склады, которые указаны пользователем, или суммарный остаток. Зарезервированные остатки и задержки 1С. Данные из 1С приходят не мгновенно, а резервы могут быть не отражены в таблице остатков. Без корректировки фильтр показывает завышенное количество, что ведёт к overselling. Экономия от точного фильтра составляет в среднем 50 000 рублей в месяц за счёт снижения числа ошибочных заказов.

Почему стандартный фильтр не подходит?

Стандартный фильтр по полю CATALOG_QUANTITY не учитывает резервы и склады. Для каталога с 50 000 товаров такой запрос выполняется за 2-3 секунды, но даёт неверные результаты при многоскладском учёте. Наш подход с кешированием работает в 10 раз быстрее и показывает точные остатки с учётом всех нюансов.

Техническая реализация

Базовый фильтр по наличию

// Простой случай: одиночные товары без торговых предложений
if (!empty($_GET['in_stock'])) {
    $arFilter['>CATALOG_QUANTITY'] = 0;
    $arFilter['CATALOG_AVAILABLE'] = 'Y';
}

CATALOG_AVAILABLE = 'Y' — флаг доступности, который учитывает не только количество, но и настройки доступности товара (можно купить при нулевом остатке или нет).

Фильтрация с учётом торговых предложений

function getInStockProductIds(int $catalogIblockId, int $offersIblockId): array
{
    // Товары с прямыми остатками
    $directIds = [];
    $res = CIBlockElement::GetList(
        [],
        [
            'IBLOCK_ID'         => $catalogIblockId,
            'ACTIVE'            => 'Y',
            '>CATALOG_QUANTITY' => 0,
            'CATALOG_AVAILABLE' => 'Y',
        ],
        false,
        false,
        ['ID']
    );
    while ($row = $res->GetNext()) {
        $directIds[] = $row['ID'];
    }

    // Товары через предложения с остатком
    $offerParentIds = [];
    $res = CIBlockElement::GetList(
        [],
        [
            'IBLOCK_ID'         => $offersIblockId,
            'ACTIVE'            => 'Y',
            '>CATALOG_QUANTITY' => 0,
            'CATALOG_AVAILABLE' => 'Y',
        ],
        false,
        false,
        ['PROPERTY_CML2_LINK']
    );
    while ($row = $res->GetNext()) {
        if ($row['PROPERTY_CML2_LINK_VALUE']) {
            $offerParentIds[] = intval($row['PROPERTY_CML2_LINK_VALUE']);
        }
    }

    return array_unique(array_merge($directIds, $offerParentIds));
}

// Применение в фильтре каталога
if (!empty($_GET['in_stock'])) {
    $inStockIds = getInStockProductIds(CATALOG_IBLOCK_ID, OFFERS_IBLOCK_ID);
    $arFilter['ID'] = !empty($inStockIds) ? $inStockIds : [0];
}

Многоскладской учёт

При нескольких складах — фильтрация по конкретному складу или по суммарному остатку:

function getProductIdsByWarehouse(int $warehouseId, int $minQty = 1): array
{
    $connection = \Bitrix\Main\Application::getConnection();

    $sql = "
        SELECT DISTINCT sp.PRODUCT_ID
        FROM b_catalog_store_product sp
        INNER JOIN b_iblock_element ie ON ie.ID = sp.PRODUCT_ID
        WHERE sp.STORE_ID = " . intval($warehouseId) . "
          AND sp.AMOUNT >= " . intval($minQty) . "
          AND ie.ACTIVE = 'Y'
    ";

    $res = $connection->query($sql);
    $ids = [];
    while ($row = $res->fetch()) {
        $ids[] = $row['PRODUCT_ID'];
    }
    return $ids;
}

// Фильтр по конкретному складу
if (!empty($_GET['warehouse_id'])) {
    $warehouseId = intval($_GET['warehouse_id']);
    $ids = getProductIdsByWarehouse($warehouseId);
    $arFilter['ID'] = !empty($ids) ? $ids : [0];
}

Как учесть резервы и задержки синхронизации?

Для учёта резервов мы рекомендуем добавить в таблицу b_catalog_store_product поле RESERVED и вычитать его из AMOUNT. При синхронизации с 1С через CommerceML данные могут приходить с задержкой. В таких случаях используйте агенты для фоновой синхронизации и кешируйте результат фильтра на 5-10 минут. Это полностью решает проблему overselling, дополнительный доход от точности составляет около 60 000 рублей в месяц.

Сравнение подходов: SQL vs ORM

Подход Производительность Точность Сложность
Через CATALOG_QUANTITY Высокая (индекс) Средняя (не учитывает склады, резервы) Низкая
Через b_catalog_store_product Средняя (зависит от объёма) Высокая (учёт по складам) Средняя
С кешированием и агентами Высокая (кеш) Высокая (с учётом задержек) Средняя

Наш подход с кешированием в 10 раз быстрее прямого SQL-запроса к b_catalog_store_product и на 30% точнее за счёт учёта резервов.

Кеширование для производительности

Запрос всех товаров в наличии при каждом обращении к каталогу — дорогая операция на больших каталогах. Кешируем список ID:

$cacheKey = 'in_stock_ids_' . CATALOG_IBLOCK_ID;
$cacheTime = 300; // 5 минут

$cache = \Bitrix\Main\Data\Cache::createInstance();
if ($cache->initCache($cacheTime, $cacheKey, '/catalog/filter/')) {
    $inStockIds = $cache->getVars();
} else {
    $inStockIds = getInStockProductIds(CATALOG_IBLOCK_ID, OFFERS_IBLOCK_ID);
    $cache->startDataCache();
    $cache->endDataCache($inStockIds);
}

Кеш инвалидируется при изменении остатков через обработчик события OnCatalogStoreDocumentUpdate. Подробнее о тегированном кешировании читайте в официальной документации Bitrix.

Как кеширование ускоряет фильтрацию?

Без кеширования каждый запрос фильтра выполняет два SELECT — по товарам и предложениям. С кешем на 5 минут время ответа снижается до 0.05 секунды. Для каталогов до 100 000 товаров это единственный способ сохранить скорость работы сайта.

Что входит в реализацию?

  • Аудит текущей схемы хранения остатков и выявление узких мест.
  • Разработка кастомного фильтра с учётом торговых предложений, многоскладского учёта и резервов.
  • Настройка кеширования (тегированное или по времени).
  • Интеграция с 1С (если требуется) — настройка агентов, корректировка обмена.
  • Нагрузочное тестирование (гарантируем время ответа < 0.5 сек для каталогов до 100к товаров).
  • Документация по поддержке и инструкция для администратора.

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

  1. Аналитика (1-2 дня). Изучаем текущую схему, типы складов, объём каталога, частоту синхронизации с 1С.
  2. Проектирование (1 день). Выбираем оптимальный подход (кеширование, многоскладской учёт, работа с резервами).
  3. Разработка (2-3 дня). Пишем кастомный компонент фильтра, подключаем кеширование, настраиваем обработчики.
  4. Тестирование (1 день). Проверяем корректность остатков, нагрузочный тест.
  5. Деплой и обучение (1 день). Выкатываем на продакшн, готовим документацию.

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

Вариант реализации Время
Базовая (без ТП, один склад) 3–5 часов
Расширенная (с ТП, много складов, кеширование) 2–3 рабочих дня
С интеграцией 1С и учётом резервов до 5 рабочих дней

О нашем опыте

Мы — команда с 10+ летним опытом разработки на 1С-Битрикс. Реализовали более 50 проектов с фильтрацией и интеграцией 1С. Предоставляем гарантию на код 6 месяцев и бесплатную поддержку в течение гарантийного срока.

Свяжитесь с нами для оценки вашего проекта. Получите консультацию по реализации фильтра по наличию — мы подберём оптимальное решение под ваш каталог и бюджет.

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