Разработка ипотечного калькулятора на 1С-Битрикс
Ипотечный калькулятор — один из самых технически насыщенных финансовых инструментов на сайте. В отличие от простого умножения «площадь × цена», здесь работают формулы аннуитетных платежей, учёт первоначального взноса, страховка, дифференцированный vs аннуитетный тип погашения. При этом пользователь ждёт мгновенного ответа — любая задержка воспринимается как ошибка сайта.
Математика: аннуитетный платёж
Аннуитетный платёж — одинаковая сумма каждый месяц. Формула:
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 секунды взаимодействия с формой — это критерий успешного инструмента.







