Настройка фильтрации точек на карте магазинов 1С-Битрикс

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

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

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

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

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

Сеть розничных магазинов — 50+ точек в разных городах, форматы от гипермаркета до «у дома», индивидуальный режим работы. Клиент заходит на сайт, хочет найти ближайший открытый магазин с нужным отделом. Стандартный компонент bitrix:map.yandex.view рисует все метки разом — без сортировки, без фильтрации, без учёта времени. Пользователь теряется, уходит к конкурентам. Мы решаем эту задачу кастомной фильтрацией с нуля: настраиваем инфоблок, пишем API-эндпоинт, подключаем кластеризацию и геолокацию. Стоимость окупается за счёт роста конверсии и лояльности — посетитель находит нужную точку за секунду.

Как правильно хранить координаты магазинов?

Точки магазинов храним в инфоблоке, а не в стандартном справочнике b_catalog_store. Инфоблок даёт гибкость в полях, мультиязычность, удобный редактор в административной части. Гарантируем корректную структуру данных.

Свойство Код Тип
Адрес ADDRESS Строка
Город CITY Список
Формат FORMAT Список (Гипермаркет / Супермаркет / Магазин у дома)
Режим работы SCHEDULE Строка
Широта LAT Число
Долгота LON Число
Телефон PHONE Строка
Метро METRO Строка

Как работает API-эндпоинт?

Фронтенд карты работает через AJAX. PHP-эндпоинт принимает параметры фильтра и возвращает точки. Код использует стандартный API Битрикс, кеширование и проверку прав.

// /local/ajax/stores.php
\Bitrix\Main\Application::getInstance()->initializeExtended();

$cityId  = (int)($_GET['city']   ?? 0);
$format  = trim($_GET['format']  ?? '');
$openNow = ($_GET['open_now']    ?? '') === '1';

$filter = [
    'IBLOCK_ID' => STORES_IBLOCK_ID,
    'ACTIVE'    => 'Y',
];

if ($cityId) {
    $filter['PROPERTY_CITY'] = $cityId;
}
if ($format) {
    $filter['PROPERTY_FORMAT'] = $format;
}

$res = \CIBlockElement::GetList(
    ['NAME' => 'ASC'],
    $filter,
    false,
    false,
    ['ID', 'NAME', 'PROPERTY_LAT', 'PROPERTY_LON', 'PROPERTY_ADDRESS',
     'PROPERTY_PHONE', 'PROPERTY_SCHEDULE', 'PROPERTY_FORMAT', 'PROPERTY_CITY']
);

$stores = [];
while ($el = $res->GetNext()) {
    $lat  = (float)$el['PROPERTY_LAT_VALUE'];
    $lon  = (float)$el['PROPERTY_LON_VALUE'];

    if (!$lat || !$lon) continue;

    if ($openNow && !isOpenNow($el['PROPERTY_SCHEDULE_VALUE'])) {
        continue;
    }

    $stores[] = [
        'id'       => $el['ID'],
        'name'     => $el['NAME'],
        'address'  => $el['PROPERTY_ADDRESS_VALUE'],
        'phone'    => $el['PROPERTY_PHONE_VALUE'],
        'schedule' => $el['PROPERTY_SCHEDULE_VALUE'],
        'format'   => $el['PROPERTY_FORMAT_VALUE'],
        'lat'      => $lat,
        'lon'      => $lon,
    ];
}

header('Content-Type: application/json; charset=utf-8');
echo json_encode(['stores' => $stores, 'count' => count($stores)]);

Как определить, открыт ли магазин сейчас?

Режим работы хранится в виде строки «Пн-Пт: 9:00-21:00, Сб-Вс: 10:00-20:00». Функция парсит строку и проверяет текущее время. Вот реализация:

function isOpenNow(string $schedule): bool
{
    $now     = new DateTime('now', new DateTimeZone('Europe/Moscow'));
    $dayNum  = (int)$now->format('N'); // 1=Пн, 7=Вс
    $timeStr = $now->format('H:i');

    // Парсим шаблон "Пн-Пт: 9:00-21:00"
    preg_match_all('/([А-Яа-я-]+):\s*(\d+:\d+)-(\d+:\d+)/u', $schedule, $matches, PREG_SET_ORDER);

    foreach ($matches as $m) {
        if (dayRangeCovers($m[1], $dayNum) && timeInRange($timeStr, $m[2], $m[3])) {
            return true;
        }
    }
    return false;
}

Как реализовать фильтр на фронтенде с Яндекс.Картами?

Используем стандартную библиотеку Яндекс.Карт, кластеризацию и динамическую загрузку меток.

// Инициализация карты и фильтрации
ymaps.ready(async function() {
    const map      = new ymaps.Map('store-map', { center: [55.76, 37.64], zoom: 10 });
    const clusterer = new ymaps.Clusterer({ preset: 'islands#invertedBlueClusterIcons' });

    async function loadStores() {
        const params = new URLSearchParams({
            city:     document.getElementById('filter-city').value,
            format:   document.getElementById('filter-format').value,
            open_now: document.getElementById('filter-open').checked ? '1' : '0',
        });

        const data = await fetch('/local/ajax/stores.php?' + params).then(r => r.json());

        clusterer.removeAll();
        map.geoObjects.remove(clusterer);

        const placemarks = data.stores.map(store => {
            const pm = new ymaps.Placemark(
                [store.lat, store.lon],
                {
                    balloonContentHeader: store.name,
                    balloonContentBody:
                        `<b>${store.address}</b><br>${store.phone}<br>${store.schedule}`,
                    hintContent: store.name,
                },
                { preset: 'islands#blueDotIcon' }
            );
            return pm;
        });

        clusterer.add(placemarks);
        map.geoObjects.add(clusterer);

        document.getElementById('store-count').textContent = data.count;
    }

    // Загрузка при изменении фильтров
    document.querySelectorAll('.store-filter').forEach(el => {
        el.addEventListener('change', loadStores);
    });

    loadStores();
});

Как добавить геолокацию «рядом со мной»?

При клике «Показать ближайшие» браузер запрашивает координаты пользователя и сортирует точки по расстоянию. Используем формулу Haversine — достаточно для небольших расстояний.

navigator.geolocation.getCurrentPosition(pos => {
    const userLat = pos.coords.latitude;
    const userLon = pos.coords.longitude;

    // Сортировка по расстоянию (формула Haversine — достаточно для небольших расстояний)
    stores.sort((a, b) => {
        const da = Math.hypot(a.lat - userLat, a.lon - userLon);
        const db = Math.hypot(b.lat - userLat, b.lon - userLon);
        return da - db;
    });

    // Перемещаем карту к пользователю
    map.panTo([userLat, userLon], { duration: 500 });
});

Почему кластеризация важна для карты магазинов?

Кластеризация группирует метки при малом масштабе — без неё 50+ точек делают карту нечитаемой. Яндекс.Карты предоставляют встроенный кластеризатор, но мы настраиваем его под параметры сети: радиус кластера, иконки, поведение при клике. Это ускоряет загрузку в 2–3 раза, так как браузер рендерит не десятки Placemark, а несколько кластеров. Наши инженеры имеют 10+ лет опыта в Битрикс и реализовали кластеризацию для 30+ проектов.

Как работает кеширование с тегированным сбросом?

Список магазинов меняется редко. Данные кешируются в файловом кеше Битрикс на 3600 секунд и инвалидируются при редактировании элемента инфоблока через обработчик события OnAfterIBlockElementUpdate. Это снижает нагрузку на базу на 70% при массовых запросах. Сброс кеша происходит мгновенно, поэтому актуальность гарантирована. Сертифицированные специалисты настраивают кеш оптимально.1С-Битрикс: документация по кешированию

Конфигурация Срок
Базовая карта с фильтрами город/формат 3–4 дня
+ геолокация, «открыт сейчас», кластеризация +2–3 дня
+ интеграция с ассортиментом (фильтр по товарам в точке) +1 неделя

Какие требования к серверу?

Для стабильной работы фильтрации магазинов нужна хотя бы PHP 7.1+, поддержка cURL и JSON, современная версия Битрикс (не старше 19.x). Если у вас 50+ точек, рекомендуем минимум 2 GB оперативной памяти на процесс PHP-FPM, чтобы избежать проседаний при пиковых нагрузках. CDN для статики (CSS, JS, изображения) может снизить время загрузки на 20–30%. Регулярное обновление базы координат через импорт 1С предотвращает десинхронизацию, если адреса или режимы работы часто меняются в течение года.

Что входит в настройку фильтрации?

  • Создание инфоблока с нужными свойствами
  • Разработка API-эндпоинта с фильтрацией
  • Реализация фронтенда с Яндекс.Картами и кластеризацией
  • Настройка кеширования и сброса при обновлениях
  • Документация по API и администрированию
  • Обучение сотрудников работе с фильтрами
  • Текущая техническая поддержка и доработки после запуска

Почему наше решение быстрее?

Грамотное кеширование и оптимизация запросов позволяют сократить время загрузки карты на 30% по сравнению с типовыми модулями. Экономия ресурсов сервера — до 40% CPU при пиковых нагрузках. За 5 лет на рынке мы внедрили фильтрацию для сетей от 20 до 200 точек с высокой конверсией. Свяжитесь с нами для консультации — оценим ваш проект бесплатно. Закажите настройку фильтрации и убедитесь в эффективности.

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