Подписка в 1С-Битрикс — это товар с периодическим продлением: система сама создаёт новый заказ по расписанию и списывает оплату с внутреннего счёта покупателя. Разбираем, как это устроено на уровне модулей, агентов и таблиц, и что делать, когда продление не срабатывает.
Что такое подписка и продление в Битрикс
В 1С-Битрикс механизм подписки живёт на стыке двух модулей: catalog (Торговый каталог) описывает сам товар как «доступный по подписке», а sale (Интернет-магазин) отвечает за рекуррентные заказы и списание средств. Технически подписка — это связка исходного заказа с рекуррентной записью, по которой агент периодически формирует новый заказ-копию.
Не путайте это с модулем subscribe — тот отвечает за почтовые рассылки и «подписку на новинки», а не за платное продление доступа. Здесь речь именно о коммерческой подписке: доступ к сервису, цифровой продукт, регулярная поставка расходников.
Настройка товара, доступного по подписке
Флаг подписки задаётся в карточке товара торгового каталога. В админке откройте элемент инфоблока каталога и найдите блок «Параметры для товаров, доступных по подписке». Ключевые поля:
Товар доступен для покупки по подписке— включает рекуррентную логику для этой позиции (полеSUBSCRIBEв таблицеb_catalog_product);- Тип периода — день, неделя, месяц, квартал, полугодие или год;
- Длина периода — множитель к типу (например, «3 месяца»);
- Пробный период — товар, который выдаётся один раз перед стартом основного цикла оплаты.
Важно понимать: подписка работает с простыми товарами и SKU торгового каталога. Для инфоблоков без включённого модуля catalog этих полей не будет — сначала товар нужно «привязать» к каталогу через привязку типа информационного блока к торговому каталогу.
Как работает автопродление: агент и рекуррентные записи
Двигатель продления — агент CSaleRecurring::AutoPay(); из модуля sale. Он запускается по расписанию агентов (или по крону, если агенты вынесены в cron), просматривает рекуррентные записи и для тех, у кого подошёл срок, формирует новый заказ.
Связь заказа с подпиской хранится в таблице b_sale_order_recurring: там лежат дата следующего продления (NEXT_EXEC), тип и длина периода, признак отмены (CANCELED) и ссылка на исходный заказ. Работать с этими данными программно удобнее через методы класса CSaleRecurring — GetList, Update, Cancel.
| Что задаёт | Где хранится |
|---|---|
| Товар по подписке | b_catalog_product.SUBSCRIBE |
| Дата продления, период | b_sale_order_recurring |
| Запуск продления | агент CSaleRecurring::AutoPay() |
Оплата продления через внутренний счёт покупателя
Ключевая деталь классической схемы Битрикс: автопродление оплачивается с внутреннего счёта покупателя, а не прямым списанием с банковской карты. Средства на счёте хранятся в таблице b_sale_user_account, а операции проводятся через CSaleUserAccount.
Логика такая: покупатель заранее пополняет внутренний счёт (картой, через платёжную систему), а агент при продлении списывает нужную сумму со счёта и оплачивает свежесозданный заказ. Каждое такое списание фиксируется отдельной транзакцией в b_sale_user_transact.
- Агент формирует новый заказ по рекуррентной записи;
- система проверяет баланс внутреннего счёта;
- при достаточном балансе сумма списывается, заказ помечается оплаченным;
- при нехватке средств продление не проходит — заказ остаётся неоплаченным.
Если вы хотите продлевать напрямую с карты без промежуточного счёта, потребуется рекуррентная интеграция с платёжной системой (сохранение токена карты и повторное списание) — это уже кастомная доработка обработчика оплаты.
Управление подписками в личном кабинете
Покупателю подписки показываются в личном кабинете компонентом bitrix:sale.recurring.orders. Он выводит список активных рекуррентных заказов и позволяет пользователю отменить продление или инициировать досрочное продление.
Разместить компонент можно на отдельной странице кабинета, например /personal/subscribe/, и добавить ссылку в меню личного раздела. Обратите внимание на параметры:
PATH_TO_BASKETиPATH_TO_ORDER— куда ведут ссылки на корзину и оформление;- шаблон компонента — его почти всегда кастомизируют под дизайн магазина копированием в
/local/templates/; - привязка к текущему авторизованному пользователю — компонент показывает подписки только владельца.
Частые ошибки продления и диагностика
Когда подписки «молча не продлеваются», причина почти всегда в одном из узких мест. Проверяйте по порядку:
- Агенты не запускаются. Смотрите
Настройки → Настройки продукта → Агенты: уCSaleRecurring::AutoPay()должна обновляться дата последнего запуска. Если агенты на кроне — проверьте задачу вcrontabи вызов/bitrix/php_interface/cron_events.php. - Пустой внутренний счёт. Продление не пройдёт при недостатке средств — настройте уведомление о предстоящем списании заранее.
- Нет актуальной цены или отключён товар. Деактивированный или снятый с публикации товар ломает пересчёт корзины при продлении.
- Отменённая запись. Поле
CANCELED='Y'вb_sale_order_recurringисключает подписку из обработки.
Полезно логировать результат работы агента и настроить почтовое событие на неуспешное продление, чтобы менеджер видел проблему раньше клиента. Для разбора конкретного случая смотрите связку: рекуррентная запись → сформированный заказ → транзакции по счёту.
Итог
Продление подписки в 1С-Битрикс — это цепочка из товара с флагом SUBSCRIBE, рекуррентной записи в b_sale_order_recurring, агента CSaleRecurring::AutoPay() и списания с внутреннего счёта покупателя. Собрать её из коробки реально, но надёжность держится на мелочах: корректный запуск агентов, контроль баланса счёта, актуальные цены и понятный личный кабинет.
Мы в B2Bsite настраиваем подписочные сценарии под задачу магазина: от классической схемы с внутренним счётом до рекуррентного списания напрямую с карты через доработку платёжного обработчика, с уведомлениями и мониторингом продлений. Если подписки — часть вашей бизнес-модели, поможем сделать их предсказуемыми и без потерь платежей.
Частые вопросы
Чем подписка в модуле sale отличается от модуля subscribe?
Модуль subscribe — это почтовые рассылки и подписка на новинки, без оплаты. Коммерческая подписка с продлением работает через модули catalog и sale и порождает платные рекуррентные заказы.
Какой агент отвечает за автопродление?
Агент CSaleRecurring::AutoPay() из модуля Интернет-магазин. Он по расписанию просматривает рекуррентные записи и формирует новые заказы для тех подписок, у которых подошёл срок продления.
Откуда списываются деньги при автопродлении?
В классической схеме — с внутреннего счёта покупателя (таблица b_sale_user_account). Покупатель заранее пополняет счёт, а агент списывает сумму при каждом продлении, фиксируя транзакцию.
Можно ли продлевать подписку напрямую с банковской карты?
Штатно Битрикс завязан на внутренний счёт. Рекуррентное списание с карты без промежуточного счёта требует доработки платёжного обработчика с сохранением токена карты и повторными списаниями.
Где покупатель управляет своими подписками?
В личном кабинете через компонент bitrix:sale.recurring.orders. Там видны активные рекуррентные заказы, дата следующего продления, и есть возможность отменить подписку.
Почему подписки перестали продлеваться?
Чаще всего не запускаются агенты, на внутреннем счёте нет средств, у товара нет актуальной цены или он деактивирован, либо рекуррентная запись помечена как отменённая (CANCELED='Y').
Как задать периодичность продления?
В карточке товара каталога, в блоке параметров подписки: указываете тип периода (день, неделя, месяц, квартал, год) и его длину. Эти значения попадают в рекуррентную запись заказа.
Нужно ли переводить агенты на крон для подписок?
Да, желательно. На агентах «по хиту» продление сработает только при заходе посетителя, что на низкотрафиковом магазине приводит к просрочкам. Крон с фиксированным интервалом надёжнее.
Поможем с настройкой и поддержкой 1С-Битрикс: Управление сайтом
Поможем с настройкой, доработкой и поддержкой 1С-Битрикс: Управление сайтом.