Розробка кредитного калькулятора на 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 рази вища.







