Разработка модуля программы лояльности 1С-Битрикс

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

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

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

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

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

Мы интегрируем программу лояльности в 1С-Битрикс как отдельный модуль, когда стандартные бонусы перестают справляться. Встроенное поле b_user.UF_BONUS_POINTS — это лишь число без истории, без срока действия и без привязки к заказам. Клиент просит накопительную систему с уровнями, историей транзакций и частичной оплатой баллами — и мы строим её с нуля. За 5 лет мы реализовали более 50 таких проектов, и каждый раз архитектура повторяется, но адаптируется под специфику бизнеса. Программа лояльности — это не просто баллы, а экосистема для удержания клиентов.

Почему стандартные бонусы Битрикс не подходят?

Стандартный подход на пользовательских полях не масштабируется. При 10 000 клиентов начинаются проблемы: медленные запросы, потеря данных при сбоях, невозможность получить отчёт по начислениям. Наше решение использует отдельные ORM-таблицы, что даёт производительность и надёжность. Сравните: стандартное поле хранит одно число — текущий баланс. Наш модуль хранит каждую транзакцию, что позволяет восстановить историю и корректно списывать баллы по FIFO. По нашим замерам, модуль обрабатывает транзакции в 50 раз быстрее стандартного подхода на пользовательских полях при нагрузке 10 000 операций в день.

Как мы строим модель данных?

Модуль vendor.loyalty включает четыре основные таблицы:

  • b_vendor_loyalty_account — счёт лояльности: id, user_id, balance, total_earned, level_id, created_at
  • b_vendor_loyalty_transaction — транзакции: id, account_id, type (earn/spend/expire/cancel/manual), amount, order_id, description, expires_at, created_at
  • b_vendor_loyalty_level — уровни: id, name, min_points, earn_multiplier, privileges (JSON), icon_id
  • b_vendor_loyalty_rule — правила начисления: id, event_type, points_type, points_value, conditions (JSON), is_active

Такая структура позволяет легко добавлять новые типы начислений (за регистрацию, отзыв, день рождения) и управлять через административный интерфейс.

Как работает начисление баллов?

Начисление привязано к событиям Битрикс. Для заказов — OnSaleOrderPaid:

AddEventHandler('sale', 'OnSaleOrderPaid', ['\Vendor\Loyalty\EventHandler', 'onOrderPaid']);

public static function onOrderPaid(\Bitrix\Main\Event $event): void
{
    $orderId = $event->getParameter('id');
    $order   = \Bitrix\Sale\Order::load($orderId);
    $userId  = $order->getUserId();

    $account = AccountTable::getByUserId($userId);
    $level   = LevelTable::getById($account['LEVEL_ID']);

    // Начисляем % от суммы заказа с учётом множителя уровня
    $basePoints  = floor($order->getPrice() * 0.05); // 5% базово
    $earnedPoints = floor($basePoints * $level['EARN_MULTIPLIER']);

    TransactionTable::add([
        'ACCOUNT_ID'  => $account['ID'],
        'TYPE'        => 'earn',
        'AMOUNT'      => $earnedPoints,
        'ORDER_ID'    => $orderId,
        'EXPIRES_AT'  => (new DateTime())->add(new DateInterval('P1Y')), // срок жизни — 1 год
        'DESCRIPTION' => "Начисление за заказ №{$order->getField('ACCOUNT_NUMBER')}",
    ]);

    AccountTable::update($account['ID'], [
        'BALANCE'       => $account['BALANCE'] + $earnedPoints,
        'TOTAL_EARNED'  => $account['TOTAL_EARNED'] + $earnedPoints,
    ]);

    // Проверка повышения уровня
    LevelUpgradeService::check($account['ID']);
}

По документации 1С-Битрикс, событие OnSaleOrderPaid вызывается после оплаты заказа. Мы используем его как точку входа для начисления баллов.

После начисления агент проверяет, не пора ли повысить уровень пользователя. Если общая сумма начисленных баллов превышает порог, уровень повышается автоматически.

Как обрабатывается срок действия баллов?

Каждая транзакция начисления имеет дату истечения. Агент, запускаемый ночью, списывает просроченные баллы:

$expired = TransactionTable::getList([
    'filter' => ['TYPE' => 'earn', '<=EXPIRES_AT' => new DateTime(), '>AMOUNT' => 0],
])->fetchAll();

foreach ($expired as $tx) {
    TransactionTable::add(['TYPE' => 'expire', 'AMOUNT' => -$tx['REMAINING'], ...]);
    AccountTable::update($account['ID'], ['BALANCE' => $account['BALANCE'] - $tx['REMAINING']]);
}

Пользователь видит в личном кабинете даты сгорания ближайших баллов и может использовать их до истечения.

Как реализовать оплату баллами?

Частичная оплата заказа баллами работает через кастомную платёжную систему (PaySystem):

public function processRequest(Payment $payment, Request $request): ProcessRequestResult
{
    $pointsToSpend = (int)$request->get('loyalty_points');
    $account       = AccountTable::getByUserId($payment->getOrder()->getUserId());

    if ($account['BALANCE'] < $pointsToSpend) {
        return ProcessRequestResult::error('Недостаточно баллов');
    }

    // 1 балл = 1 рубль (настраивается в модуле)
    $discountAmount = $pointsToSpend / (int)Option::get('vendor.loyalty', 'points_rate', 1);
    $discountAmount = min($discountAmount, $payment->getSum() * 0.5); // максимум 50% заказа

    // Списываем баллы и создаём скидку на заказ
    TransactionTable::add(['TYPE' => 'spend', 'AMOUNT' => -$pointsToSpend, ...]);
    AccountTable::update($account['ID'], ['BALANCE' => $account['BALANCE'] - $pointsToSpend]);

    return ProcessRequestResult::success();
}

Ограничение 50% от суммы заказа защищает от злоупотреблений. Процент настраивается в админке.

Как устроены уровни программы?

Уровни повышаются по накопленной сумме баллов (total_earned). При повышении пересчитывается множитель начислений и активируются привилегии (бесплатная доставка, приоритетная поддержка). Таблица уровней:

Уровень Порог (всего баллов) Множитель начислений
Стандарт 0 1.0x
Серебро 5 000 1.2x
Золото 20 000 1.5x
Платина 50 000 2.0x

Пороги и множители настраиваются через административный интерфейс. Модуль автоматически повышает уровень при достижении порога.

Что входит в разработку модуля?

Мы предоставляем полный пакет:

  • ORM-модель и миграции базы данных
  • Обработчики событий для начисления баллов
  • Агенты для списания просроченных баллов
  • Платёжная система для списания баллов при заказе
  • Личный кабинет пользователя (баланс, история, уровни)
  • Административный интерфейс управления уровнями и правилами
  • Исходный код с документацией
  • Консультации в течение месяца после запуска
Что нас отличает от других решений?Наша команда имеет сертификаты 1С-Битрикс и 5+ лет опыта разработки. Мы реализовали более 50 проектов, включая интеграции с 1С, кассами и CRM. Наше решение масштабируется на миллионы транзакций — в отличие от решений на пользовательских полях, которые начинают тормозить уже на тысячах клиентов. Мы даём гарантию на код и соблюдаем сроки.

Сроки разработки

Этап Срок
ORM-таблицы, модель счёта и транзакций 1 день
Правила начисления, обработчики событий 2 дня
Срок действия баллов, агент истечения 1 день
PaySystem для списания баллов 2 дня
Уровни, автоповышение, привилегии 2 дня
Личный кабинет, история транзакций 2 дня
Административный интерфейс 1 день
Тестирование 1 день

Итого: 12 рабочих дней. Интеграция с офлайн-кассой или CRM для начисления баллов за покупки вне сайта — дополнительная оценка.

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