Розробка іпотечного калькулятора на 1С-Бітрікс
Іпотечний калькулятор — один з найтехнічно насичених фінансових інструментів на сайті. На відміну від простого множення «площа × ціна», тут працюють формули ануїтетних платежів, урахування першого внеску, страховка, диференційований проти ануїтетного типу погашення. При цьому користувач очікує миттєвої відповіді — будь-яка затримка сприймається як помилка сайту.
Математика: ануїтетний платіж
Ануїтетний платіж — однакова сума щомісяця. Формула:
P = S × r / (1 - (1 + r)^(-n))
Де:
-
P— щомісячний платіж -
S— сума кредиту (вартість − перший внесок) -
r— місячна процентна ставка (річна ÷ 12 ÷ 100) -
n— кількість місяців
Реалізація на PHP:
namespace MyProject\Services;
class MortgageCalculator
{
public static function calculate(
float $propertyPrice,
float $downPayment,
float $annualRate,
int $termYears
): array {
$loanAmount = $propertyPrice - $downPayment;
$termMonths = $termYears * 12;
$monthlyRate = $annualRate / 12 / 100;
if ($monthlyRate == 0) {
// Безвідсоткова розстрочка (рідко, але буває)
$monthlyPayment = $loanAmount / $termMonths;
} else {
$monthlyPayment = $loanAmount
* $monthlyRate
* pow(1 + $monthlyRate, $termMonths)
/ (pow(1 + $monthlyRate, $termMonths) - 1);
}
$totalPayment = $monthlyPayment * $termMonths;
$totalInterest = $totalPayment - $loanAmount;
$overpaymentPct = ($totalInterest / $loanAmount) * 100;
return [
'loan_amount' => round($loanAmount, 2),
'monthly_payment' => round($monthlyPayment, 2),
'total_payment' => round($totalPayment, 2),
'total_interest' => round($totalInterest, 2),
'overpayment_pct' => round($overpaymentPct, 1),
'down_payment_pct' => round(($downPayment / $propertyPrice) * 100, 1),
];
}
public static function buildPaymentSchedule(
float $loanAmount,
float $annualRate,
int $termMonths
): array {
$schedule = [];
$monthlyRate = $annualRate / 12 / 100;
$monthlyPayment = $loanAmount
* $monthlyRate
* pow(1 + $monthlyRate, $termMonths)
/ (pow(1 + $monthlyRate, $termMonths) - 1);
$balance = $loanAmount;
for ($month = 1; $month <= $termMonths; $month++) {
$interestPayment = $balance * $monthlyRate;
$principalPayment = $monthlyPayment - $interestPayment;
$balance -= $principalPayment;
$schedule[] = [
'month' => $month,
'payment' => round($monthlyPayment, 2),
'principal' => round($principalPayment, 2),
'interest' => round($interestPayment, 2),
'balance' => round(max($balance, 0), 2),
];
}
return $schedule;
}
}
Графік платежів: таблиця та діаграма
Повний графік погашення — конкурентна перевага. Користувач бачить, як зменшується основний борг, скільки йде на відсотки в різні періоди. Для візуалізації використовуються Chart.js або ApexCharts — легкі бібліотеки без зайвих залежностей.
// Дані для діаграми надходять з сервера через AJAX
async function updateChart(params) {
const response = await fetch('/ajax/mortgage/schedule/', {
method: 'POST',
body: new URLSearchParams({ ...params, sessid: BX.bitrix_sessid() }),
});
const data = await response.json();
if (!data.success) return;
// Групуємо по роках для діаграми
const years = [];
const principalByYear = [];
const interestByYear = [];
data.schedule.forEach((month, i) => {
const yearIndex = Math.floor(i / 12);
if (!years[yearIndex]) {
years[yearIndex] = `Рік ${yearIndex + 1}`;
principalByYear[yearIndex] = 0;
interestByYear[yearIndex] = 0;
}
principalByYear[yearIndex] += month.principal;
interestByYear[yearIndex] += month.interest;
});
renderStackedBarChart(years, principalByYear, interestByYear);
}
Урахування страховки
Банки вимагають страховку. Калькулятор повинен показувати реальну вартість:
- Страхування майна — 0.1–0.5% від вартості нерухомості на рік
- Страхування життя та здоров'я — 0.3–1.5% від суми боргу (опціонально, але знижує ставку)
- Страхування титулу — актуально для вторинного ринку
$annualInsurance = $loanAmount * ($insuranceRate / 100);
$monthlyInsurance = $annualInsurance / 12;
$totalMonthlyPayment = $monthlyPayment + $monthlyInsurance;
Порівняння банків
Для агрегаторів і сайтів забудовників — таблиця порівняння пропозицій кількох банків. Дані зберігаються в HL-блоці й оновлюються менеджером:
| Банк | Ставка | Перший внесок | Термін |
|---|---|---|---|
| Банк А | 8.5% | від 15% | до 30 років |
| Банк Б | 7.9% | від 20% | до 25 років |
| Банк В | 9.1% | від 10% | до 30 років |
Інтеграція з формою заявки
Результат розрахунку передається у форму заявки як приховані поля — менеджер бачить, що клієнт розглядав:
document.getElementById('submit-btn').addEventListener('click', () => {
document.getElementById('hidden-loan-amount').value = currentResult.loan_amount;
document.getElementById('hidden-monthly-pay').value = currentResult.monthly_payment;
document.getElementById('hidden-annual-rate').value = currentParams.annualRate;
document.getElementById('hidden-term-years').value = currentParams.termYears;
});
Терміни
| Завдання | Термін |
|---|---|
| Базовий калькулятор (ануїтет, основні поля, форма заявки) | 5–8 днів |
| Калькулятор з графіком платежів, діаграмою, урахуванням страховки | 2–3 тижні |
| Повноцінний іпотечний агрегатор з кількома банками, збереженням розрахунків | 4–6 тижнів |
Іпотечний калькулятор працює, коли математика правильна, а UX не лякає. Клієнт повинен отримати відповідь за 2–3 секунди взаємодії з формою — це критерій успішного інструменту.







