Настройка отображения условий рассрочки в карточке товара 1С-Битрикс
Рассрочка на странице товара — это расчёт ежемесячного платежа и отображение условий партнёра (банка или BNPL-сервиса) прямо в карточке. Реализуется через хранение параметров рассрочки и расчёт на фронтенде или сервере.
Откуда берутся условия рассрочки
Два основных сценария:
Сценарий 1 — фиксированные партнёры. У магазина договор с одним-двумя банками, условия известны заранее (процент, сроки, минимальная сумма). Данные хранятся в настройках сайта или отдельном инфоблоке.
Сценарий 2 — динамические условия через API. Банк/BNPL-партнёр предоставляет API, откуда запрашиваются актуальные условия для конкретной суммы. Пример: Тинькофф Рассрочка, Халва, Сплит.
Хранение условий партнёров в Битриксе
Для фиксированных условий создаёте HL-инфоблок InstallmentPlans:
| Поле | Тип | Описание |
|---|---|---|
UF_PARTNER |
Строка | Название партнёра |
UF_LOGO |
Файл | Логотип |
UF_MIN_AMOUNT |
Дробное | Минимальная сумма товара |
UF_MONTHS |
Строка | Доступные сроки (6,10,12,24) |
UF_RATE |
Дробное | Ставка (0 для беспроцентной) |
UF_ACTIVE |
Флаг | Активен ли план |
Расчёт ежемесячного платежа
Для беспроцентной рассрочки (rate = 0):
monthly = price / months
Для рассрочки с процентной ставкой (аннуитетный платёж):
monthly = price * (rate/12) / (1 - (1 + rate/12)^(-months))
PHP-реализация расчёта:
function calcInstallment(float $price, int $months, float $annualRate): float {
if ($annualRate <= 0) {
return $price / $months;
}
$r = $annualRate / 12 / 100;
return $price * $r / (1 - pow(1 + $r, -$months));
}
JavaScript для динамического пересчёта при смене срока:
function calcInstallment(price, months, annualRate) {
if (annualRate <= 0) return price / months;
const r = annualRate / 12 / 100;
return price * r / (1 - Math.pow(1 + r, -months));
}
document.querySelectorAll('.installment-months').forEach(btn => {
btn.addEventListener('click', () => {
const months = parseInt(btn.dataset.months);
const rate = parseFloat(btn.dataset.rate);
const price = parseFloat(document.querySelector('[data-price]').dataset.price);
const monthly = calcInstallment(price, months, rate);
document.querySelector('.monthly-payment').textContent =
monthly.toFixed(2).replace('.', ',') + ' руб./мес.';
});
});
Вывод блока в карточке товара
В шаблоне catalog.element добавляете блок после цены:
// Загружаем планы рассрочки, подходящие по сумме
$price = (float)$arResult['CATALOG_PRICE_1'];
$plans = \Local\Installment\InstallmentPlanTable::getList([
'filter' => [
'=UF_ACTIVE' => true,
'<=UF_MIN_AMOUNT' => $price,
],
'order' => ['UF_MIN_AMOUNT' => 'ASC'],
])->fetchAll();
HTML-блок условий — список партнёров с их логотипами и кнопками выбора срока. Каждый партнёр показывает минимальный ежемесячный платёж (по максимальному сроку).
Интеграция с API банка
Если партнёр предоставляет API расчёта (например, Тинькофф):
// Кэшируем ответ API на 10 минут, чтобы не дёргать при каждом открытии карточки
$cacheKey = 'installment_' . (int)$price;
$cache = \Bitrix\Main\Data\Cache::createInstance();
if ($cache->initCache(600, $cacheKey, '/installment/')) {
$data = $cache->getVars();
} else {
$data = \Local\Installment\TinkoffApiClient::getPlans($price);
$cache->startDataCache();
$cache->endDataCache($data);
}
На что обратить внимание
- Для товаров дешевле минимального порога партнёра блок рассрочки не показываете совсем
- Юридические тексты («рассрочка предоставляется банком-партнёром») выводите рядом с блоком
- При изменении цены через JS (выбор комплектации) пересчитывайте рассрочку тоже
| Этап | Время |
|---|---|
| Хранилище условий партнёров | 1–2 ч |
| Расчёт платежей (PHP + JS) | 2–3 ч |
| Блок в карточке товара | 3–4 ч |
| Интеграция с API банка (опционально) | 4–8 ч |







