Гибкая настройка кэшбэка по категориям в 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С Предприятие для компании МИРСАНБЕЛ
    830
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    732
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1075

Маркетолог хочет давать 5% кэшбэка на электронику, 2% на бытовую химию и 0% на акционные товары. При этом правила должны комбинироваться: карта лояльности «Золото» даёт +1% к базовой ставке в любой категории. Стандартный модуль скидок (catalog.discount) не подходит — он оперирует снижением цены, а не начислением на счёт. Нужна отдельная система правил. Без неё маркетологи вручную корректируют заказы, растёт число ошибок, клиенты недовольны. Наша команда разработала модуль правил кэшбэка, который гибко настраивается под любую программу лояльности. В этой статье — готовая архитектура и PHP-код для 1С-Битрикс. Получите консультацию по внедрению — мы поможем адаптировать решение под ваш каталог.

Архитектура правил начисления

Правила хранятся в таблице local_cashback_rules. Минимальная структура:

CREATE TABLE local_cashback_rules (
    ID           INT AUTO_INCREMENT PRIMARY KEY,
    RULE_TYPE    ENUM('category','product','user_group','promo') NOT NULL,
    ENTITY_ID    INT,           -- ID раздела инфоблока, товара, группы
    CASHBACK_PCT DECIMAL(5,2),  -- процент начисления
    PRIORITY     INT DEFAULT 10,-- чем меньше, тем выше приоритет
    DATE_FROM    DATE,
    DATE_TO      DATE,
    ACTIVE       CHAR(1) DEFAULT 'Y'
);

Правила с RULE_TYPE = 'category' привязаны к разделам инфоблока каталога. При начислении кэшбэка по заказу нужно определить, к какому разделу относится каждый товар, и найти подходящее правило. Подробнее о системе скидок.

Определение категории товара для кэшбэка

Товар может быть привязан к нескольким разделам (множественная привязка). Для выбора правила берём «основной» раздел:

function getCashbackRateForProduct(int $productId): float
{
    // Основной раздел через b_iblock_element
    $element = \CIBlockElement::GetByID($productId)->Fetch();
    $sectionId = (int)$element['IBLOCK_SECTION_ID'];

    // Ищем правило: сначала по точному разделу, потом по родителям
    while ($sectionId > 0) {
        $rule = CashbackRuleTable::getActiveRuleForSection($sectionId);
        if ($rule) {
            return (float)$rule['CASHBACK_PCT'];
        }

        // Идём вверх по дереву разделов
        $section = \CIBlockSection::GetByID($sectionId)->Fetch();
        $sectionId = (int)$section['IBLOCK_SECTION_ID'];
    }

    // Правило по умолчанию
    return CashbackConfig::getDefaultRate();
}

Наследование правил по дереву разделов: если на «Электроника» установлено 5%, а на «Ноутбуки» нет явного правила — ноутбуки получат 5% от родительского раздела. Явное правило на дочернем разделе всегда перекрывает родительское.

Приоритет и комбинирование правил

Сложная логика с несколькими одновременно активными правилами — через приоритеты:

function resolveCashbackRate(int $productId, int $userId): float
{
    $baseRate = getCashbackRateForProduct($productId);

    // Дополнительные правила по группе пользователя
    $userGroups = CUser::GetUserGroup($userId);
    $bonusRates = [];

    foreach ($userGroups as $groupId) {
        $rule = CashbackRuleTable::getQuery()
            ->setFilter([
                'RULE_TYPE'  => 'user_group',
                'ENTITY_ID'  => $groupId,
                'ACTIVE'     => 'Y',
                '<=DATE_FROM' => new \Bitrix\Main\Type\Date(),
                '>=DATE_TO'   => new \Bitrix\Main\Type\Date(),
            ])
            ->setOrder(['PRIORITY' => 'ASC'])
            ->fetchObject();

        if ($rule) {
            $bonusRates[] = (float)$rule->getCashbackPct();
        }
    }

    // Стратегия: берём максимальный бонус от группы + базовая категорийная ставка
    $bonusRate = empty($bonusRates) ? 0 : max($bonusRates);

    return $baseRate + $bonusRate;
}

Стратегию сложения или замены выбирает бизнес. Для большинства программ лояльности: категорийная ставка + групповой бонус (сложение), но не более максимально допустимого процента.

Исключения: акционные товары и промо-периоды

Нулевая ставка на акционные товары реализуется правилом с CASHBACK_PCT = 0 и максимальным приоритетом (минимальное число в поле PRIORITY). Товар определяется как акционный, если на него действует скидка через механизм catalog.discount или через пользовательское свойство IS_PROMO = Y.

Промо-периоды — те же правила с DATE_FROM и DATE_TO. Автоматическое включение/отключение без вмешательства разработчика.

Подробнее о приоритетах Приоритет 1 — самый высокий. Если два правила с одинаковым приоритетом активны, выбирается то, которое создано позже. Рекомендуем для исключений (например, 0% на акции) ставить приоритет 1, а для базовых категорий — 10 и выше.

Начисление и управление

Начисление по завершению заказа

Кэшбэк начисляется при смене статуса заказа на «Выполнен» (не при оплате — чтобы не начислять на возвращённые товары):

AddEventHandler('sale', 'OnSaleStatusOrder', function(string $statusId, \Bitrix\Sale\Order $order) {
    if ($statusId !== 'F') { // F = Выполнен
        return;
    }

    $userId = $order->getUserId();
    $totalCashback = 0;

    foreach ($order->getBasket() as $item) {
        $productId = (int)$item->getProductId();
        $rate      = resolveCashbackRate($productId, $userId);
        $cashback  = $item->getPrice() * $item->getQuantity() * ($rate / 100);
        $totalCashback += $cashback;

        // Фиксируем по позиции для детальной истории
        CashbackTransactionTable::add([
            'USER_ID'    => $userId,
            'ORDER_ID'   => $order->getId(),
            'PRODUCT_ID' => $productId,
            'AMOUNT'     => $cashback,
            'RATE'       => $rate,
            'TYPE'       => 'accrual',
        ]);
    }

    CashbackBalanceTable::credit($userId, $totalCashback);
});

Управление правилами из админки

Интерфейс управления правилами строится на CAdminList + CAdminForm или React-компонентом в разделе /local/admin/. Чтобы создать правило, выполните:

  1. Перейдите в раздел управления правилами.
  2. Выберите тип правила (категория, товар, группа пользователей, промо).
  3. Укажите процент начисления и приоритет.
  4. Сохраните.

Минимальный набор: список правил с фильтром по типу/активности, форма редактирования с деревом разделов каталога для выбора категории.

Этапы внедрения и типичные ошибки

Процесс работы и что входит

  • Анализ требований к программе лояльности и существующих скидок.
  • Проектирование таблиц и логики приоритетов.
  • Реализация правил категорий, групп и исключений.
  • Тестирование на тестовом контуре с реальными заказами.
  • Деплой на продакшен и документирование.

Полный состав настройки правил кэшбэка:

  • Создание таблиц local_cashback_rules и cashback_transactions.
  • Реализация агента начисления по статусу «Выполнен».
  • Интерфейс управления правилами в админке.
  • Интеграция с группами пользователей и промо-акциями.
  • Документация по конфигурации и обучение маркетологов.
  • Опыт инженеров — 10+ лет в Битрикс-разработке, гарантия корректной реализации.

Типичные ошибки при настройке

  • Неправильный приоритет: более общее правило перекрывает частное (например, 0% на акции не применяется из-за низкого приоритета).
  • Начисление на все товары, включая возвращенные — решается проверкой статуса «Выполнен».
  • Отсутствие ограничения максимальной суммы кэшбэка, что приводит к превышению бюджета.

Сравнение подходов и сроки

Критерий Ручной расчёт Автоматическая система
Время обработки одного заказа 5–15 мин 1–2 сек (в 300 раз быстрее)
Ошибки Высокие Минимальные
Масштабируемость Ограничена Неограничена

Сроки:

Задача Срок
Базовая логика категорий 3–5 дней
Групповые бонусы и исключения 3–5 дней
Начисление и история 2–3 дня
Админка 3–5 дней
Полный проект 2–3 недели

Почему автоматизация кэшбэка выгодна?

Автоматизация сокращает время обработки заказов на 95% и исключает ошибки при ручном расчёте. Например, интернет-магазин с 1000 заказов в месяц экономит до 50 часов работы маркетологов. Бюджет программы лояльности становится прозрачным — вы всегда знаете, сколько начислено и по каким правилам. Мы используем опыт сертифицированных Битрикс-разработчиков для гарантии качества.

Проверка корректности начисления кэшбэка

После внедрения проведите тестирование: создайте тестовый заказ с товарами разных категорий, проверьте сумму начисленного кэшбэка в личном кабинете. Убедитесь, что акционные товары обработаны правильно. Наша команда предоставляет детальный отчёт по результатам тестирования.

Свяжитесь с нами, чтобы обсудить вашу программу лояльности. Закажите внедрение модуля кэшбэка под ключ — мы адаптируем решение под ваш ассортимент и группы пользователей.

80% сайтов на Битрикс тормозят из-за одной таблицы

b_iblock_element_property — EAV-структура, где каждая строка хранит одно значение одного свойства одного элемента. Каталог в 50 000 товаров с 30 свойствами даёт 1,5 млн строк. Умный фильтр делает JOIN этой таблицы с b_iblock_element по пяти свойствам — и MySQL уходит в full table scan на 3–5 секунд.

Наш опыт показывает: без вмешательства в эту таблицу ускорение сайта невозможно. Мы берёмся за проекты, где скорость загрузки упала до 8–10 секунд, и возвращаем TTFB < 200 мс за 1–2 недели. Оптимизация скорости сайта начинается с аудита slow-запросов и заканчивается комплексной перестройкой инфраструктуры под ключ.

[Свяжитесь с нами для аудита] — мы определим узкие места за 2 часа и предложим конкретный план.

Серверная оптимизация

Nginx. Не просто «включили gzip». Конкретно:

  • gzip_comp_level 4-5 — выше бессмысленно, CPU сжирает больше, чем экономит трафик;
  • brotli on с brotli_static on — для предварительно сжатых файлов;
  • HTTP/2 с http2_max_concurrent_streams 128;
  • fastcgi_cache для PHP-ответов — кэширование на уровне Nginx, минуя PHP-FPM;
  • worker_processes auto, worker_connections под количество одновременных соединений.

PHP-FPM. Выбор между pm = dynamic и pm = static — не академический:

  • Static: фиксированное количество воркеров, без overhead на форк — для выделенных серверов с предсказуемой нагрузкой.
  • Dynamic: экономит RAM при низком трафике. pm.max_children считаем как (доступная RAM - RAM для MySQL/Redis) / средний расход на процесс.
  • OPcache: opcache.memory_consumption=256, opcache.max_accelerated_files=20000, opcache.validate_timestamps=0 на продакшене (перезагрузка PHP-FPM при деплое).

MySQL/MariaDB. Главное узкое место почти всегда:

  • slow_query_log с порогом 0.5 сек — каждый запрос разбираем через EXPLAIN.
  • innodb_buffer_pool_size = 70–80% доступной RAM на выделенном сервере.
  • Составные индексы для фасетного поиска: (IBLOCK_ID, IBLOCK_PROPERTY_ID, VALUE) на b_iblock_element_property.
  • OPTIMIZE TABLE b_iblock_element_property после массовых операций.

Как настроить кэширование на три уровня?

Управляемый кэш компонентов. TTL настраиваем для каждого компонента отдельно. Каталог — 3600 сек, новостная лента — 300 сек, баннеры — 86400. Одинаковый TTL везде — гарантия либо устаревших данных, либо бесполезного кэша.

Композитный кэш. Технология bitrix:composite — Nginx отдаёт готовый HTML из файла, PHP не запускается. Динамические зоны (корзина, авторизация) подгружаются AJAX-запросом через CBitrixComponent::setFrameMode(true). TTFB < 50 мс. Но: не все компоненты совместимы, $APPLICATION->ShowPanel() и прямой вывод через echo ломают композит. Проверяем каждую страницу через панель «Производительность → Композитный сайт».

Сравнение: композитный кэш быстрее управляемого в 10–20 раз по времени первого байта. Официальная документация Битрикс по композитному кэшу: Bitrix Composite.

Memcached / Redis. Переносим кэш из файловой системы:

  • Сессии → Redis (session.save_handler = redis) — быстрее файлов в 10–50×, плюс работа в кластере.
  • Кэш компонентов → Memcached через .settings.php: 'cache' => ['type' => 'memcache'].
  • Кэш ORM-запросов — чтобы одинаковые GetList() не нагружали MySQL на каждом хите.

Почему стандартных настроек MySQL недостаточно?

Индексы. Составные для фасетного поиска. Покрывающие для частых выборок — MySQL отвечает из индекса, не обращаясь к данным. Частичные индексы (MariaDB) для фильтрации по ACTIVE = 'Y'. Аудит неиспользуемых индексов — каждый замедляет INSERT/UPDATE.

Партиционирование. Для таблиц с миллионами строк: b_stat_session, b_search_content_stem, Highload-блоки с историей. Партиция по дате — запрос «заказы за месяц» не сканирует данные за три года.

Реальный кейс: каталог 200 000 товаров, 50 свойств. Фильтр по 10 свойствам занимал 12 секунд. После создания составных индексов по (IBLOCK_ID, IBLOCK_PROPERTY_ID, VALUE) и партиционирования b_iblock_element_property по IBLOCK_ID время выполнения упало до 0,3 секунды. Нагрузка на MySQL снизилась в 40 раз.

Очистка. В любой базе за год-два накапливается: устаревший поисковый индекс, просроченные записи в b_cache_tag, история b_iblock_element_prop_s*, логи в b_event_log на гигабайты. Настраиваем регулярную очистку через агенты.

Партиционирование также решает проблему с параллельными запросами при обмене с 1С через CommerceML. Подробнее: MySQL Partitioning Documentation.

Фронтенд

Изображения — 60–80% веса страницы:

  • WebP через CFile::ResizeImageGet() с BX_RESIZE_IMAGE_PROPORTIONAL + конвертация;
  • srcset + sizes — не грузим 3000px картинку в блок 400px;
  • loading="lazy" для всего ниже первого экрана;
  • AVIF — ещё 20–30% экономии vs WebP (подробнее: WebP).

CSS/JS:

  • Встроенный модуль Битрикс: объединение и минификация через «Настройки → Оптимизация CSS/JS»;
  • PurgeCSS / UnCSS — на типичном Битрикс-проекте 60–70% CSS не используются;
  • defer / async для некритичного JS;
  • Critical CSS инлайном в <head> для мгновенного FCP.

Шрифты:

  • <link rel="preload" as="font" crossorigin> для основного шрифта;
  • font-display: swap — текст виден сразу;
  • Subsetting через pyftsubset — вырезаем кириллицу + латиницу, файл уменьшается в 3–5 раз.

CDN

Cloudflare, BunnyCDN, AWS CloudFront или российские (Selectel CDN, VK Cloud CDN).

  • Статика (CSS, JS, изображения, шрифты) — через CDN.
  • Правила кэширования: Cache-Control: public, max-age=31536000, immutable для файлов с хешем.
  • Оптимизация изображений на лету (imgproxy, Cloudflare Polish) без нагрузки на origin.

Зачем нужно нагрузочное тестирование?

Не синтетические бенчмарки, а реальные сценарии:

  • k6 / wrk — имитация маршрутов: каталог → фильтрация → карточка → корзина → оформление.
  • Метрики: RPS, время ответа (p50, p95, p99), процент ошибок.
  • Xdebug (callgrind) или Blackfire — профилирование PHP, поиск узких мест.

Результат тестирования — объективная картина, где реально тормозит, а не где «кажется». После оптимизации прогоняем повторно — фиксируем улучшения.

Результаты

Метрика До После
TTFB 800–2000 мс 50–200 мс
Полная загрузка 4–8 сек 1.5–2.5 сек
PageSpeed (мобильный) 30–50 80–95
Одновременные пользователи 50–100 500–2000+

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

  1. Аудит текущей производительности — анализ slow-запросов, профилирование PHP, проверка кэширования, CDN, серверных настроек.
  2. Настройка серверной части — Nginx, PHP-FPM, MySQL, Redis/Memcached, OPcache.
  3. Оптимизация кэширования — управляемый кэш, композитный сайт, настройка TTL, тегированное кэширование.
  4. Работа с БД — создание индексов, партиционирование, очистка, реорганизация EAV-таблиц.
  5. Фронтенд — изображения (WebP/AVIF), CSS/JS (минификация, deferred), шрифты (preload, subsetting).
  6. CDN — подключение, настройка правил кэширования.
  7. Нагрузочное тестирование — сценарии реальных пользователей, отчёт по метрикам.
  8. Документация — описание всех изменений, рекомендации по дальнейшему обслуживанию.
  9. Гарантия — поддержка в течение 1 месяца после сдачи.

Мониторинг

Без мониторинга через полгода всё деградирует. Новый модуль, нерасчищенные логи, изменение в шаблоне — и скорость вернулась к исходной.

  • web-vitals API — Real User Monitoring от реальных посетителей.
  • Synthetic monitoring — Pingdom, UptimeRobot, регулярные проверки из разных локаций.
  • Алерты — TTFB > 500 мс или LCP > 3 сек → уведомление.

Сроки и стоимость

Тип работ Сроки
Базовая оптимизация (кэш, изображения, минификация) 2–3 дня
Оптимизация БД (индексы, slow queries, настройка) 3–5 дней
Серверная инфраструктура (Nginx, PHP-FPM, Redis) 2–3 дня
Комплексная (сервер + БД + фронтенд + CDN) 1–3 недели
Нагрузочное тестирование и профилирование 2–3 дня
Кластерная архитектура (балансировка, репликация) 1–2 недели

Стоимость рассчитывается индивидуально после аудита. [Получите консультацию по вашему проекту] — оценим текущее состояние и предложим план ускорения с конкретными сроками и бюджетом. Мы — команда с 10+ годами опыта в Битрикс, выполнили более 200 проектов по оптимизации скорости сайта.