Разработка кредитного калькулятора на 1С-Битрикс
Кредитный калькулятор решает задачу проще, чем ипотечный: нет первоначального взноса, нет страховки имущества, но есть своя специфика — типы кредитных продуктов (потребительский, автокредит, кредит наличными), комиссии банков, досрочное погашение. Для бизнеса калькулятор особенно важен: помогает клиенту понять доступность покупки и снимает главное возражение «это дорого».
Виды кредитных продуктов в калькуляторе
| Тип | Особенности расчёта |
|---|---|
| Потребительский кредит | Аннуитет или дифференцированный, диапазон ставок по сумме/сроку |
| Автокредит | Каско обязательно, возможен trade-in как первый взнос |
| Кредит наличными | Минимум документов, ставка выше |
| POS-кредит (в магазине) | Часто 0% от банка, но с комиссией магазина |
| Целевой кредит | Ставка зависит от категории товара |
Формулы расчёта
Аннуитетный платёж (одинаковые платежи, стандарт для большинства кредитов):
function calcAnnuity(amount, annualRate, termMonths) {
if (annualRate === 0) {
return amount / termMonths;
}
const r = annualRate / 12 / 100;
return amount * r * Math.pow(1 + r, termMonths) / (Math.pow(1 + r, termMonths) - 1);
}
Дифференцированный платёж (убывающий — первые платежи выше, переплата меньше):
function calcDifferentiated(amount, annualRate, termMonths, monthNumber) {
const r = annualRate / 12 / 100;
const principalPart = amount / termMonths;
const remainingDebt = amount - principalPart * (monthNumber - 1);
const interestPart = remainingDebt * r;
return {
payment: principalPart + interestPart,
principal: principalPart,
interest: interestPart,
};
}
Серверная реализация на PHP
Расчёт на сервере нужен для валидации и передачи данных в CRM:
namespace MyProject\Services;
class CreditCalculator
{
public static function calculate(
float $amount,
float $annualRate,
int $termMonths,
string $type = 'annuity',
float $commissionPercent = 0
): array {
$commission = $amount * ($commissionPercent / 100);
if ($type === 'annuity') {
$monthlyRate = $annualRate / 12 / 100;
if ($monthlyRate > 0) {
$payment = $amount * $monthlyRate
* pow(1 + $monthlyRate, $termMonths)
/ (pow(1 + $monthlyRate, $termMonths) - 1);
} else {
$payment = $amount / $termMonths;
}
$totalPayment = $payment * $termMonths;
$totalInterest = $totalPayment - $amount;
} else {
// Дифференцированный — берём сумму всех платежей
$totalPayment = 0;
$totalInterest = 0;
$monthlyRate = $annualRate / 12 / 100;
$principalPart = $amount / $termMonths;
$remaining = $amount;
$maxPayment = 0;
for ($m = 1; $m <= $termMonths; $m++) {
$interestPart = $remaining * $monthlyRate;
$monthPayment = $principalPart + $interestPart;
$totalPayment += $monthPayment;
$totalInterest += $interestPart;
$remaining -= $principalPart;
$maxPayment = max($maxPayment, $monthPayment);
}
$payment = $maxPayment; // первый (максимальный) платёж
}
return [
'amount' => $amount,
'first_payment' => round($payment, 2),
'total_payment' => round($totalPayment + $commission, 2),
'total_interest' => round($totalInterest, 2),
'commission' => round($commission, 2),
'overpayment' => round($totalInterest + $commission, 2),
'effective_rate' => self::calcEffectiveRate($amount, $payment, $termMonths),
];
}
private static function calcEffectiveRate(float $amount, float $payment, int $termMonths): float
{
// Приближение через итерацию (ПСК — полная стоимость кредита)
$rate = 0.01;
for ($i = 0; $i < 1000; $i++) {
$pv = $payment * (1 - pow(1 + $rate, -$termMonths)) / $rate;
if (abs($pv - $amount) < 0.01) break;
$rate += ($pv > $amount) ? 0.00001 : -0.00001;
}
return round($rate * 12 * 100, 2);
}
}
Настройка условий через административный интерфейс
Условия кредитования хранятся в HL-блоке CreditConditions:
| Поле | Тип | Описание |
|---|---|---|
UF_BANK_NAME |
String | Название банка / продукта |
UF_AMOUNT_FROM |
Float | Минимальная сумма |
UF_AMOUNT_TO |
Float | Максимальная сумма |
UF_TERM_FROM |
Int | Минимальный срок (мес.) |
UF_TERM_TO |
Int | Максимальный срок (мес.) |
UF_RATE |
Float | Процентная ставка |
UF_COMMISSION |
Float | Комиссия (%) |
UF_CALC_TYPE |
Enum | annuity / differentiated |
При вводе суммы и срока система автоматически находит подходящие условия и показывает варианты.
Досрочное погашение
Клиент спрашивает: «Если я погашу часть досрочно в третьем месяце, сколько сэкономлю?» — это отдельный расчёт:
public static function withEarlyRepayment(
float $loanAmount,
float $annualRate,
int $termMonths,
int $repaymentMonth,
float $repaymentAmount,
string $repaymentType = 'reduce_payment' // или 'reduce_term'
): array {
// До досрочного погашения
$schedule1 = self::buildSchedule($loanAmount, $annualRate, $termMonths);
// Остаток долга после N месяцев
$remainingDebt = $schedule1[$repaymentMonth - 1]['balance'] - $repaymentAmount;
if ($repaymentType === 'reduce_term') {
// Тот же платёж — срок уменьшается
$newTerm = self::calcTerm($remainingDebt, $annualRate, $schedule1[0]['payment']);
$schedule2 = self::buildSchedule($remainingDebt, $annualRate, $newTerm);
} else {
// Тот же срок — платёж уменьшается
$newTermMonths = $termMonths - $repaymentMonth;
$schedule2 = self::buildSchedule($remainingDebt, $annualRate, $newTermMonths);
}
return [
'original_total' => array_sum(array_column($schedule1, 'interest')),
'new_total_interest' => array_sum(array_column($schedule2, 'interest')),
'savings' => /* разница */,
];
}
Сроки
| Задача | Срок |
|---|---|
| Базовый калькулятор (аннуитет, форма заявки) | 4–7 дней |
| Полный калькулятор (оба типа платежей, несколько условий, ЭСК) | 2–3 недели |
| Калькулятор с досрочным погашением, сравнением предложений, историей | 3–5 недель |
Кредитный калькулятор снижает барьер входа: клиент видит конкретную цифру ежемесячного платежа и соотносит её со своими возможностями ещё до разговора с менеджером. Конверсия в заявку у посетителей, воспользовавшихся калькулятором, в среднем в 2–3 раза выше.







