Разработка системы подписок (subscription) на 1С-Битрикс

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

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

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

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

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

На Битрикс нет встроенного механизма регулярных платежей. Каждый проект подписок требует кастомной разработки — от проектирования таблиц до интеграции с платёжными шлюзами. За 5+ лет мы реализовали более 30 подписочных проектов: от доступа к закрытому контенту до автоматической доставки товаров. Например, для интернет-магазина косметики построили систему ежемесячных подписок на наборы. Она обрабатывает 5 000 активных подписок с автосписанием через ЮKassa, успешность списаний — 95%+. Подписка — бизнес-модель, при которой клиент регулярно платит за продукт или услугу. Если вы столкнулись с нехваткой функционала — вы не одни. Типовые решения не дают гибкости: нужно хранить статусы, управлять периодами, обрабатывать отмены. Мы предлагаем готовую архитектуру на базе ORM Битрикс, которая закрывает эти задачи.

Какие типы подписок бывают на Битрикс?

Прежде чем проектировать, важно понять бизнес-модель. Выделяют три основных типа:

Тип подписки Описание Техническая реализация
Доступ к контенту Платный раздел, закрытые материалы Группы пользователей + ограничение доступа
Товарная подписка Регулярная доставка товаров Автоматическое создание заказов
Сервисная подписка SaaS, лицензия, техподдержка Статус аккаунта + автопродление

Все три типа имеют общее: периодическое списание денег и управление статусом доступа.

Архитектура хранения данных и агенты

Ядро системы — таблица подписок. Создаётся через ORM Битрикс (наследование от \Bitrix\Main\ORM\Data\DataManager). Новая архитектура на ORM в 1.5 раза быстрее в разработке по сравнению с прямыми SQL-запросами.

class SubscriptionTable extends DataManager
{
    public static function getTableName(): string
    {
        return 'b_local_subscription';
    }

    public static function getMap(): array
    {
        return [
            new IntegerField('ID', ['primary' => true, 'autocomplete' => true]),
            new IntegerField('USER_ID', ['required' => true]),
            new IntegerField('PLAN_ID', ['required' => true]),
            new EnumField('STATUS', ['values' => ['TRIAL', 'ACTIVE', 'PAST_DUE', 'CANCELLED', 'EXPIRED']]),
            new DatetimeField('CURRENT_PERIOD_START'),
            new DatetimeField('CURRENT_PERIOD_END'),
            new DatetimeField('TRIAL_END'),
            new StringField('PAYMENT_TOKEN'),
            new IntegerField('PAY_SYSTEM_ID'),
            new StringField('CANCEL_REASON'),
            new DatetimeField('CANCELLED_AT'),
            new DatetimeField('CREATED_AT'),
        ];
    }
}

class SubscriptionPlanTable extends DataManager
{
    // ID, NAME, PRICE, CURRENCY, PERIOD_DAYS, TRIAL_DAYS,
    // IBLOCK_SECTION_IDS, FEATURES (JSON)
}

Для обработки подписок каждый день запускается cron-скрипт — агент. Он находит подписки с истекшим периодом и пытается списать средства:

$expiring = SubscriptionTable::getList([
    'filter' => [
        'STATUS' => ['ACTIVE', 'PAST_DUE'],
        '<=CURRENT_PERIOD_END' => new DateTime(),
    ]
])->fetchAll();

foreach ($expiring as $sub) {
    try {
        $result = chargeSubscription($sub);
        if ($result->isSuccess()) {
            SubscriptionTable::update($sub['ID'], [
                'STATUS' => 'ACTIVE',
                'CURRENT_PERIOD_START' => new DateTime(),
                'CURRENT_PERIOD_END' => (new DateTime())->modify('+' . $planPeriodDays . ' days'),
            ]);
        } else {
            handlePaymentFailure($sub);
        }
    } catch (\Exception $e) {
        logError($e, $sub);
    }
}

Как настроить рекуррентные платежи?

Самая сложная часть — автоматическое списание. Мы подключаем ЮKassa или CloudPayments — обе поддерживают сохранение карты и повторные платежи через API. Для выбора сравните характеристики:

Параметр ЮKassa CloudPayments
Простота интеграции Высокая Средняя
Гибкость настройки ошибок Базовая Расширенная
Комиссия за успешный платёж 2.5-3.5% 2.3-3.2%

Процесс:

  1. Первый платёж — обычная оплата, получаем payment_method_id.
  2. Сохраняем токен в SubscriptionTable.PAYMENT_TOKEN.
  3. При наступлении CURRENT_PERIOD_END вызываем API с токеном.
$payment = new \YooKassa\Client();
$payment->setAuth($shopId, $secretKey);
$response = $payment->createPayment([
    'amount' => ['value' => $plan->getPrice(), 'currency' => 'RUB'],
    'payment_method_id' => $subscription->getPaymentToken(),
    'capture' => true,
    'description' => 'Подписка ' . $plan->getName() . ' #' . $subscription->getId(),
]);
Подробнее об обработке ошибок списания

Дополнительно реализуем обработку неуспешных списаний с эскалацией: после 3 неудачных попыток подписка переводится в PAST_DUE, клиенту отправляется уведомление. Это снижает риск неожиданной блокировки.

Как управлять доступом по подписке?

Для подписок типа «доступ к контенту» используем группы пользователей Битрикс. Каждому плану — отдельная группа. При активации добавляем пользователя, при истечении удаляем. Права на инфоблоки настраиваются через права групп. Для товарных подписок — автоматическое создание заказов через корзину. Решение масштабируется до 10 000 активных подписок без просадки производительности.

CUser::SetUserGroup($userId, array_merge(
    CUser::GetUserGroup($userId),
    [$plan->getGroupId()]
));

Управление подписками: личный кабинет и уведомления

Минимальный функционал страницы /personal/subscription/:

  • Текущий план и статус.
  • Дата следующего списания и сумма.
  • История платежей.
  • Кнопка «Отменить» (с опциональным вопросом о причине).
  • Смена плана (апгрейд/даунгрейд).
  • Обновление платёжных данных.

При отмене подписки доступ сохраняется до конца оплаченного периода — клиент получает то, за что заплатил. После истечения периода он удаляется из группы доступа. Статус меняется на CANCELLED, затем EXPIRED.

Обязательные почтовые события:

  • SUBSCRIPTION_CREATED — подтверждение подписки.
  • SUBSCRIPTION_PAYMENT_SUCCESS — успешное списание.
  • SUBSCRIPTION_PAYMENT_FAILED — ошибка списания.
  • SUBSCRIPTION_TRIAL_ENDING — за 1-3 дня до конца трайла.
  • SUBSCRIPTION_CANCELLED — подтверждение отмены.
  • SUBSCRIPTION_EXPIRED — доступ закрыт.

Триальный период

При создании подписки с триалом:

$trialEnd = (new DateTime())->modify('+' . $plan->getTrialDays() . ' days');
SubscriptionTable::add([
    'USER_ID' => $userId,
    'PLAN_ID' => $planId,
    'STATUS' => 'TRIAL',
    'TRIAL_END' => $trialEnd,
    'CURRENT_PERIOD_END' => $trialEnd,
]);

Агент за 1 день до окончания трайла уведомляет пользователя. В день окончания — попытка первого списания. Если карта не привязана — подписка переводится в EXPIRED.

Что входит в разработку системы подписок

  • Проектирование архитектуры БД и бизнес-логики.
  • Реализация ORM-сущностей и агентов.
  • Интеграция с платёжной системой (ЮKassa / CloudPayments).
  • Настройка прав доступа и групп пользователей.
  • Разработка личного кабинета (/personal/subscription/).
  • Конфигурация почтовых событий.
  • Документация и обучение администраторов.
  • Пост-релизная поддержка 30 дней.

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

Вариант Состав Срок
Без рекуррента Подписка с ручной оплатой, управление доступом 5-7 дней
С рекуррентными платежами Автосписание через ЮKassa или CloudPayments 10-14 дней
Полная платформа Несколько планов, трайл, ЛК, аналитика 15-20 дней

Стоимость рассчитывается индивидуально — зависит от сложности бизнес-логики и количества интеграций. Оставьте заявку — мы оценим ваш проект за 1 рабочий день.

Почему стоит работать с нами

  • Использование готового модуля сокращает время разработки на 40% по сравнению с типовыми решениями.
  • Глубокое понимание ограничений Битрикс и способов их обхода.
  • Более 30 подписочных проектов в портфолио.

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

Разработка и настройка модулей 1С-Битрикс

Главная ловушка Битрикса — init.php. Сунул туда обработчик OnBeforeIBlockElementUpdate, потом ещё один — через год файл на 2000 строк, и при каждом хите весь этот ком выполняется. Мы переносим бизнес-логику в полноценные модули с D7 ORM, собственными таблицами и административным интерфейсом. Модуль можно отключить, перенести на другой проект, покрыть тестами — с init.php ничего из этого не получится. Опыт команды — 10+ лет в Битрикс, сертифицированные специалисты, гарантия на код 6 месяцев. Закажите консультацию — расскажем, как перевести legacy-код в модульную архитектуру.

Почему init.php — худшее место для бизнес-логики?

Init.php не поддерживает автозагрузку классов, не имеет изолированного пространства имён, не поддаётся модульному тестированию и не отключается без правки самого файла. Каждый обработчик, написанный там, срабатывает на каждом запросе, даже если он не нужен. В модуле вы регистрируете обработчика через EventManager, и он выполняется только при наступлении события. Разница в производительности — до 3 раз при 10+ обработчиках.

Стандартные модули: типовые проблемы и решения

Информационные блоки. Архитектура ИБ — первое, что мы ревьюим на любом проекте. Классическая ошибка: один инфоблок каталога с 80 свойствами, из которых 30 — множественные. Таблица b_iblock_element_property раздувается до миллионов строк, CIBlockElement::GetList на фильтрации по трём свойствам уходит в полное сканирование. Переносим справочники в Highload-блоки, убираем множественные свойства где можно, проектируем структуру с прицелом на то, что каталог вырастет в 5 раз.

Интернет-магазин (sale). Бизнес-правила корзины — отдельная история. Настраиваем приоритеты скидок, чтобы две акции не дали 60% вместо 30%, подключаем платёжные обработчики, прописываем кастомную валидацию через OnSaleOrderBeforeSaved.

Поиск. Встроенный модуль search с морфологией работает до 10–15 тысяч элементов. Дальше — Elasticsearch. Настраиваем через API модуля поиска Битрикс, индексируем через CSearchFullText или кастомные индексаторы.

Highload-блоки для справочников, логов, пользовательских данных — вместо раздутых ИБ. Прямые запросы через Bitrix\Highloadblock\HighloadBlockTable, собственные таблицы вместо EAV-структуры стандартных инфоблоков. Миллион записей — без деградации.

Почтовые события. Настройка — не только шаблоны в b_event_message. Главное — SPF, DKIM, DMARC на DNS, иначе транзакционные письма летят в спам. Проверяем доставляемость, настраиваем bounce-обработку.

Проектирование инфоблоков для производительности

Используем Highload-блоки для справочных данных (цвета, размеры, производители), которые не участвуют в сложных выборках. Для торговых предложений — отдельный инфоблок с привязкой через IBLOCK_ELEMENT_PROPERTY. Включаем INDEX_PROPERTY для часто фильтруемых свойств. Кэширование тегированное: при изменении элемента сбрасывается только связанный кеш. Highload-блоки обрабатывают до 10 раз быстрее, чем инфоблоки с множественными свойствами, на объёмах от 100 000 записей.

Разработка кастомных модулей

Каждый модуль — по структуре /local/modules/vendor.modulename/:

  • install/index.php — класс установки, создание таблиц через $DB->RunSQLBatch()
  • lib/ — классы D7 ORM, наследники Bitrix\Main\ORM\Data\DataManager
  • admin/ — административные страницы через CAdminList, CAdminForm
  • include.php — автозагрузка, регистрация обработчиков через EventManager::getInstance()->registerEventHandler()
  • REST API endpoints через \Bitrix\Rest\RestManager

Модуль регистрируется в системе, появляется в списке «Установленные решения», имеет свои настройки в /bitrix/admin/settings.php?mid=vendor.modulename. Его можно включать, отключать, обновлять через UpdateSystem или свой механизм миграций.

Примеры реализованных задач:

  • Управление акциями — визуальный конструктор условий через CAdminCalendar, таймеры через агенты (CAgent::AddAgent), аналитика эффективности в связке с модулем sale
  • Калькулятор стоимости — React-виджет на фронте, REST API в модуле, формулы хранятся в Highload-блоке
  • Система бронирования — real-time календарь, блокировка через $DB->StartTransaction() / $DB->Commit() при одновременных запросах, синхронизация с channel manager через webhook

Компоненты и композитный кэш

Кастомизация компонентов — через result_modifier.php и component_epilog.php, не через правку template.php стандартного шаблона. Так ядро обновляется безболезненно.

Композитный кэш (технология «Композитный сайт») — сервер отдаёт готовый HTML, минуя PHP-роутинг. Динамические зоны (корзина, авторизация) подгружаются через CBitrixComponent::setFrameMode(true) и AJAX. TTFB падает до 30–50 мс. Но есть нюансы: не все компоненты совместимы, $APPLICATION->ShowPanel() ломает композит, нужна аккуратная разметка <div id="bx-composite-...">.

Маркетплейс: аудит перед установкой

Перед установкой модуля с маркетплейса — обязательный аудит. Проверяем: SQL-запросы без подготовленных выражений (привет, SQL-инъекции), прямое обращение к $_REQUEST без фильтрации, использование устаревшего API старого ядра вместо D7, конфликты с модулем композитного кэширования. Модуль без обновлений больше года и с парой десятков установок — скорее всего, проблема на ближайшем обновлении PHP. Типичный случай: модуль вызывает CIBlockElement::GetList с несброшенным кешем — сайт падает при 5000 элементов.

Миграция на D7

При обновлении PHP или переходе на новую редакцию — рефакторинг устаревших вызовов:

  • CIBlockElement::GetList()Bitrix\Iblock\Elements\ElementTable::getList()
  • CSaleOrder::GetList()Bitrix\Sale\Order::getList()
  • CModule::IncludeModule()Bitrix\Main\Loader::includeModule() Тестирование на staging, откат через git при проблемах.

Согласно официальной документации 1С-Битрикс, D7 ORM является рекомендуемым средством для работы с данными, обеспечивая безопасность типов и автогенерацию запросов.

Сравнение подходов: Init.php vs Модуль

Критерий Init.php Модуль с D7 ORM
Производительность Выполняется на каждом хите Выполняется только при событии
Тестируемость Нет автозагрузки, тесты невозможны Полная поддержка PHPUnit
Поддерживаемость Кодовая база растёт бесконтрольно Изолированная структура, версионирование
Миграции Нет Собственные таблицы, управление через install
Кэширование Не поддерживает автоинвалидацию Тегированное кэширование, сброс по событию

Стоимость и состав разработки модулей

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

  • Техническое задание и архитектурная схема
  • Код с соблюдением PSR-4 и код-стайла Битрикс
  • Unit-тесты (PHPUnit) на бизнес-логику
  • Интеграционные тесты на события и REST API
  • Документация по установке, настройке и API
  • Передача доступов к репозиторию и документации
  • Обучение администраторов работе с модулем
  • Гарантийная поддержка 6 месяцев

Ориентировочные сроки и сложность:

Сложность Примеры Сроки
Простой Виджет обратного звонка, баннерная система, простой калькулятор 3–5 дней
Средний Система бронирования, конфигуратор товаров, модуль отзывов с модерацией 1–2 недели
Сложный Мультирегиональность, кастомная программа лояльности, интеграция с ERP 2–4 недели
Enterprise Маркетплейс-платформа, сложные бизнес-процессы с множеством ролей 1–3 месяца

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

Тестирование модулей

Unit-тесты через PHPUnit покрывают бизнес-логику: расчёт скидок, валидацию, формирование документов. Моки для Bitrix\Main\Application::getConnection() позволяют тестам не зависеть от БД. Интеграционные тесты проверяют обработчики событий на реальной базе — OnAfterIBlockElementAdd, OnSaleOrderSaved и другие. REST API endpoints тестируем через curl или PHPUnit HTTP-клиент. Критично для модулей, работающих с b_sale_order, b_catalog_price — где ошибка стоит денег.

Совместимость проверяется на PHP 7.4, 8.0, 8.1, 8.2 и редакциях: Стандарт, Малый бизнес, Бизнес. Проверяем конфликты с популярными модулями маркетплейса — они любят перехватывать те же события. Нагрузочное тестирование: замеры на 10K, 100K, 1M записей, профилирование через Xdebug на предмет утечек памяти и N+1 запросов.

Примеры из практики

Модуль акций для сети электроники. Штатные скидки модуля sale не покрывали сценарии «2+1», подарок при покупке от суммы, комбинированные условия. Собрали визуальный конструктор: маркетолог создаёт правила через drag-and-drop, без тикетов в разработку. Календарь акций, автодеактивация через агенты, аналитика в привязке к b_sale_order — конверсия, средний чек, количество применений. Время запуска новой акции упало с двух дней до получаса.

Калькулятор для строителей. Параметры (площадь, материалы, этажность) → формула → предварительная смета → заявка в CRM через CRest::call('crm.lead.add'). Региональные коэффициенты и сезонные наценки — из Highload-блока, цены материалов — из обмена с 1С. Количество целевых заявок выросло на треть: клиенты видят разбивку по статьям до звонка менеджеру.

Бронирование для сети отелей. Real-time доступность через AJAX-запросы к кастомной таблице vendor_booking_slots, расчёт тарифов по сезону, синхронизация с Booking.com через channel manager API. Блокировка номера при одновременном бронировании — через SELECT ... FOR UPDATE в транзакции. Таймзоны обрабатываются через \DateTimeZone — гость из Владивостока и менеджер из Москвы видят одну картину.

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