Відвідувач сайту нерухомості застосовує 4–6 фільтрів, перемикається між списком і картою, зберігає об'єкти в обране. Якщо пошук гальмує, він іде на агрегатори. Наша розробка сайту нерухомості на 1С-Бітрікс з окремими інфоблоками та просторовим індексом вирішує це завдання в 3 рази швидше типових рішень. Це дає реальну економію — портал окупається за 6–8 місяців за рахунок конверсії (при середньому чеку).
Архітектура інфоблоків: як зберігати об'єкти нерухомості
При розробці сайту нерухомості на 1С-Бітрікс перше питання — один інфоблок на всі типи чи окремий під квартири, будинки, комерцію. Відповідь залежить від кількості унікальних властивостей.
Один інфоблок + розділи за типами працює, якщо властивості перетинаються на 70%+. Площа, ціна, адреса, координати, фотографії — спільні. Кількість кімнат — тільки для квартир, площа ділянки — тільки для будинків. Порожні властивості не займають місце в b_iblock_element_property (рядок не створюється, якщо значення null). Плюс: єдиний bitrix:catalog.smart_filter за всіма типами, єдина видача в пошуку, один шаблон списку.
Окремі інфоблоки виправдані, коли у комерційної нерухомості 15 властивостей, яких немає у житлової (клас приміщення, тип оренди, висота стель, вантажний ліфт, потужність електрики). Змішувати їх в одному інфоблоці — засмічувати фільтр. Мінус: агрегований пошук за всіма типами потребуватиме кастомний компонент з UNION-логікою або Elasticsearch.
Рекомендована структура для порталу на 10К+ об'єктів:
- Інфоблок «Житлова нерухомість» — розділи: Квартири, Будинки, Таунхауси
- Інфоблок «Комерційна нерухомість» — розділи: Офіси, Торгові, Склади
- Highload-блок «Житлові комплекси» — довідник ЖК з прив'язкою об'єктів через
PROPERTY_COMPLEX_ID - Highload-блок «Райони» — довідник з полігонами для пошуку по карті
- Highload-блок «Забудовники» — компанії з реквізитами та логотипами
Властивості об'єкта нерухомості — мінімум 30 полів. Критично важливі для фільтрації:
| Властивість | Тип | Індексація | | PRICE | N (число) | Фасетний індекс | | AREA | N | Фасетний індекс | | ROOMS | L (список) | Фасетний індекс | | FLOOR | N | Фасетний індекс | | FLOORS_TOTAL | N | Звичайний | | DISTRICT | S:Highload | Фасетний індекс | | COMPLEX_ID | S:Highload | Фасетний індекс | | COORDINATES | S (рядок, "lat,lng") | Ні | | DEAL_TYPE | L (продаж/оренда) | Фасетний індекс |
Координати зберігаються як рядок "55.7558,37.6173" — парсяться на фронті для відображення на карті. Зберігати в двох окремих властивостях (LATITUDE, LONGITUDE) не варто — немає сценарію, де потрібна фільтрація за однією координатою.
Як організувати фільтрацію на карті?
Розробка сайту нерухомості на 1С-Бітрікс потребує продуманої фільтрації на карті. Штатний bitrix:catalog.smart_filter покриває 60% завдань — чекбокси, списки, діапазони. Але для нерухомості потрібні речі, які він не вміє з коробки.
Повзунки діапазонів (range sliders) для ціни та площі. Smart filter віддає MIN_VALUE та MAX_VALUE для числових властивостей через масив $arResult['ITEMS']. На фронті будуємо два input + slider на базі noUiSlider або rc-slider. Значення передаються через GET-параметри ?arrFilter_P1_MIN=3000000&arrFilter_P1_MAX=8000000. Проблема: при кожній зміні повзунка — перезавантаження сторінки. Рішення — AJAX-підвантаження результатів через bitrix:catalog.section з параметром AJAX_MODE=Y та кастомним JavaScript, який перехоплює submit форми фільтру.
Фільтрація по карті — малювання області пошуку. Користувач малює полігон або коло на карті, система повертає об'єкти всередині області. Штатний smart filter цього не вміє. Реалізація:
- На фронті — Yandex.Maps API,
ymaps.GeoObjectзeditable: trueабоymaps.Polygonчерез інструмент малювання. Користувач малює область, JavaScript збирає масив координат вершин полігону. - AJAX-запит на бекенд з координатами полігону. На стороні PHP — алгоритм Ray Casting (point-in-polygon): для кожного об'єкта перевіряємо, чи потрапляють його координати всередину полігону. При 50К об'єктів повний перебір — 20-40ms, прийнятно. При 200К+ — потрібний просторовий індекс.
- Просторовий індекс на MySQL/MariaDB: колонка
POINTтипу GEOMETRY, індекс SPATIAL, запит черезST_Contains(polygon, point). Але Бітрікс не зберігає властивості інфоблоків як GEOMETRY. Рішення — додаткова таблицяproject_realty_geoз полямиELEMENT_ID,LOCATION POINT, SPATIAL INDEX. Синхронізація через обробник подіїOnAfterIBlockElementUpdate.
// Обробник синхронізації координат
EventManager::getInstance()->addEventHandler(
'iblock', 'OnAfterIBlockElementUpdate',
function ($arFields) {
if ($arFields['IBLOCK_ID'] !== REALTY_IBLOCK_ID) return;
GeoIndexService::updatePoint(
$arFields['ID'],
$arFields['PROPERTY_VALUES']['COORDINATES']
);
}
);
- Результат AJAX-запиту — масив
ELEMENT_ID, який передається в основнийCIBlockElement::GetListчерез фільтр['ID' => $geoFilteredIds]. Таким чином, просторова фільтрація комбінується з smart filter.
Кластеризація маркерів. При 5К+ маркерів на карті Yandex.Maps починає гальмувати. ymaps.Clusterer групує близькі маркери автоматично. Але при зумі на район з 200 об'єктами в одному будинку (ЖК) кластер розгортається в кашу. Рішення — кастомний ClusterPlacemark з підказкою «14 квартир у ЖК Сонячний» та посиланням на відфільтрований список.
AJAX-оновлення і карти, і списку синхронно. Користувач рухає повзунок ціни → оновлюється список → оновлюються маркери на карті. Користувач рухає карту → оновлюється список об'єктів у видимій області. Це потребує єдиного контролера стану на фронті. Архітектура: React/Vue-компонент (або vanilla JS з pub/sub), який тримає поточні фільтри + видиму область карти (bounding box) і при зміні будь-якого параметра робить один AJAX-запит. Відповідь містить і HTML списку, і JSON координат для маркерів.
// Псевдокод синхронізації карти та списку
function updateResults() {
const filters = collectFilters(); // smart filter values
const bounds = map.getBounds(); // [[lat1,lng1],[lat2,lng2]]
filters.geo_bounds = bounds;
fetch('/api/realty/search/', {
method: 'POST',
body: JSON.stringify(filters)
})
.then(r => r.json())
.then(data => {
renderList(data.html);
renderMarkers(data.markers); // [{id, lat, lng, price, title}]
});
}
map.events.add('boundschange', debounce(updateResults, 300));
filterForm.addEventListener('change', updateResults);
Чому важлива просторова індексація?
Без просторового індексу пошук по полігону на 50К об'єктів методом Ray Casting дає 20-40ms, що прийнятно. Але на 500К об'єктів час зростає до 400ms — користувач помітить затримку. SPATIAL індекс на колонці POINT скорочує запит до 5-10ms. Тому для великих порталів ми обов'язково створюємо окрему гео-таблицю, синхронізовану через подію OnAfterIBlockElementUpdate.
Згідно з документацією, фасетні індекси обов'язкові для каталогів з великою кількістю елементів — їх використання знижує час фільтрації до 50 разів.Документація 1С-Бітрікс
Картка об'єкта
Картка квартири — це 30+ полів, фотогалерея, відеотур, 3D-панорама, розташування на карті, інфраструктура поруч, іпотечний калькулятор. Все це — один виклик bitrix:news.detail з кастомним шаблоном.
Фотогалерея — множинна властивість типу «Файл». Вивід через Swiper.js з lazy-завантаженням. Прев'ю — CFile::ResizeImageGet() з параметром BX_RESIZE_IMAGE_PROPORTIONAL, 400x300. Повноекранний перегляд — оригінал до 1920px.
3D-панорама та відеотур. Панорама — iframe з Matterport, Kuula або власний viewer на Pannellum.js. Відеотур — YouTube/Vimeo embed. Обидва зберігаються як рядкові властивості з URL. У шаблоні — умовний рендер: якщо заповнено PROPERTY_PANORAMA_URL — показуємо вкладку «3D-тур».
Іпотечний калькулятор — чистий JavaScript, без звернення до сервера. Формула ануїтетного платежу, три повзунки (вартість, перший внесок, термін), результат — щомісячний платіж. Ставки підтягуються з Highload-блоку «Банки-партнери» при завантаженні сторінки.
Інтеграції із зовнішніми системами
XML-фіди для агрегаторів. ЦІАН, Avito, Yandex.Realty — у кожного свій формат XML. Загальна логіка: агент Бітрікса (CAgent) запускається раз на годину, вибирає активні об'єкти, формує XML, кладе в /upload/feeds/.
-
Yandex.Realty — формат
realty-feed, кореневий елемент<realty-feed>, всередині<offer>з обов'язковими полямиtype,category,location,price,area,image -
ЦІАН — формат
cian-feed, елемент<object>, своя система категорій (flatSale,flatRent,commercialSale), обов'язкові поля відрізняються від Yandex -
Avito — формат Avito Autoload, елемент
<Ad>, категоріяНерухомість, підкатегорія залежить від типу
Кожен фід — окремий клас-генератор, що наслідує абстрактний BaseFeedGenerator. Маппінг властивостей інфоблоку на поля XML — у конфігу, не в коді. Це дозволяє додати новий агрегатор без розробника.
Обсяг фіду: 10К об'єктів → XML ~15MB. Генерація — 30-60 секунд. При 50К+ об'єктів генерація може зайняти 5 хвилин — виносимо у фонове завдання або нарізаємо на частини.
CRM-інтеграція та агенти. Заявка з картки об'єкта → лід в Бітрікс24. REST API: crm.lead.add з полями TITLE, SOURCE_ID, UF_CRM_REALTY_ID (кастомне поле — ID об'єкта). Webhook або OAuth — залежить від того, один портал чи кілька.
Рієлтори — окремий інфоблок або Highload-блок. Кожен об'єкт прив'язаний до агента через PROPERTY_AGENT_ID. На сторінці агента — його об'єкти, контакти, рейтинг. Авторизований агент може редагувати свої об'єкти через bitrix:iblock.element.edit.form з обмеженням по CREATED_BY.
Користувацький функціонал: обране та порівняння
Обране для неавторизованих — cookie або localStorage. Масив ID об'єктів, максимум 50. На сервері — middleware в init.php, який при кожному запиті перевіряє cookie REALTY_FAVORITES та додає в $arResult ознаку IN_FAVORITES. Для авторизованих — Highload-блок UserFavorites з полями USER_ID, ELEMENT_ID, DATE_ADD.
Порівняння — аналогічно, але з виводом таблиці властивостей у два-три стовпці. Компонент читає ID з cookie/Highload, робить GetList по масиву ID, рендерить таблицю з горизонтальним скролом.
SEO для тисяч сторінок
Ручний ввід meta для кожної з 10К квартир — неможливо. Шаблони SEO через налаштування інфоблоку:
-
#ELEMENT_NAME#— назва об'єкта -
UF_DISTRICT— район, підставляється через обробникOnBeforeIBlockElementSeo - Формула:
Купити {тип} {кімнати}-кімн. у {район} — {ціна} ₽ | {сайт}
Мікророзмітка Schema.org RealEstateListing — в template.php картки об'єкта:
{
"@context": "https://schema.org",
"@type": "RealEstateListing",
"name": "2-кімн. квартира, 65 м², Центральний район",
"url": "https://site.ru/kvartiry/123/",
"datePosted": "2025-01-15",
"offers": {
"@type": "Offer",
"price": "8500000",
"priceCurrency": "RUB"
}
}
Canonical URL, hreflang для мультимовності, XML sitemap через модуль seo з розбивкою по інфоблоках — до 50К URL на файл.
Продуктивність на 50К+ об'єктів
Фасетні індекси — обов'язково. Без них bitrix:catalog.smart_filter на 50К елементів з 15 фільтрованими властивостями — 3-5 секунд. З фасетним індексом — 50-150ms. Перебудова через Bitrix\Iblock\PropertyIndex\Manager::buildIndex($iblockId), запускається по крону після масового оновлення.
Посторінкова навігація — bitrix:system.pagenavigation з lazy-scroll (підвантаження при прокрутці). LIMIT + OFFSET на великих вибірках деградує — при OFFSET 40000 MySQL все одно сканує 40К рядків. Альтернатива — курсорна пагінація по ID > $lastId, але штатні компоненти її не підтримують. Для перших 200 сторінок OFFSET прийнятний.
Етапи розробки
1. Аналітика, прототипування — 1-2 тижні: структура даних, карта фільтрів, прототипи Figma. 2. Дизайн — 2-3 тижні: UI картки, списку, карти, мобільна версія. 3. Розробка ядра — 4-6 тижнів: інфоблоки, фільтрація, карта, картка об'єкта. 4. Інтеграції — 2-3 тижні: XML-фіди, CRM, іпотечний калькулятор. 5. Тестування, оптимізація — 1-2 тижні: навантаження, SEO, кросбраузер. 6. Запуск — 3-5 днів: деплой, імпорт даних, моніторинг.| Масштаб | Терміни | | Сайт агентства, до 500 об'єктів | 6-10 тижнів | | Портал міста, 5-10К об'єктів, карта + фільтри | 10-16 тижнів | | Федеральний портал, 50К+ об'єктів, фіди, CRM | 14-24 тижні |
Що входить в розробку порталу нерухомості
- Проектування структури даних (інфоблоки, HL-блоки, просторовий індекс)
- Дизайн адаптивних сторінок (картка, список, карта)
- Розробка фільтрації з картою та режимом малювання області
- Інтеграція з агрегаторами (ЦІАН, Avito, Yandex.Realty) через XML-фіди
- Підключення іпотечного калькулятора
- Налаштування SEO-шаблонів та мікророзмітки
- Інтеграція з CRM (Бітрікс24, amoCRM)
- Навантажувальне тестування та оптимізація
- Навчання адміністраторів
- 3 місяці гарантійної підтримки після запуску
Терміни не включають наповнення контентом та налаштування рекламних кампаній — це паралельні процеси, які стартують на етапі тестування. Зв'яжіться з нами для оцінки вашого проекту — ми підготуємо детальне КП протягом дня. Отримайте консультацію та зрозумійте, як ваш майбутній портал буде приносити ліди.
Більше 10 років досвіду в розробці на Бітрікс та 50+ проектів нерухомості дозволяють нам гарантувати результат. Замовте розробку сайту нерухомості під ключ — отримайте портал, який приносить ліди. На одному з нещодавніх проектів економія на серверних ресурсах після впровадження просторового індексу склала понад 150 000 руб. на рік, а витрати на підтримку скоротилися на 20%.







