Разработка сайта строительной компании на 1С-Битрикс
Сайт строительной компании — не визитка с телефоном и фотографией бульдозера. Генподрядчик работает одновременно в двух направлениях: частный заказчик ищет подрядчика на ремонт квартиры, а корпоративный — отправляет тендерную документацию на строительство склада. Оба сценария требуют разной подачи информации, разных форм обратной связи и разного уровня детализации. Битрикс позволяет закрыть обе задачи в рамках одного сайта, но архитектура данных должна учитывать эту двойственность с самого начала.
Каталог услуг: структура инфоблоков
Услуги строительной компании — это не плоский список. Есть иерархия: направление (жилое строительство, коммерческое, промышленное, ремонт и реконструкция) → конкретная услуга (строительство коттеджа, возведение каркасного здания, капитальный ремонт офиса). Каждая услуга имеет набор параметров, которые клиент хочет видеть до звонка.
Инфоблок SERVICES с разделами по категориям:
- Жилое строительство — коттеджи, таунхаусы, малоэтажные дома
- Коммерческое строительство — офисные здания, торговые центры, склады
- Промышленное строительство — производственные цеха, ангары
- Ремонт и реконструкция — капитальный ремонт, реставрация фасадов, перепланировка
Свойства элемента услуги:
| Свойство | Код | Тип | Назначение |
|---|---|---|---|
| Описание | DESCRIPTION | HTML | Развёрнутое описание услуги |
| Фотогалерея | PHOTO_GALLERY | F (файл, множ.) | Фото процесса и результатов |
| Типовые сроки | TYPICAL_TIMELINE | S (строка) | «от 3 до 8 месяцев» |
| Минимальная площадь | MIN_AREA | N (число) | Порог входа, м² |
| Материалы | MATERIALS | E (привязка к элементу) | Связь с инфоблоком материалов |
| Категория клиента | CLIENT_TYPE | L (список) | B2B / B2C / Оба |
| Иконка | ICON_SVG | S | Код SVG-иконки для каталога |
Свойство CLIENT_TYPE критично для фильтрации на фронте: частный клиент не хочет видеть «проектирование промышленных объектов», а тендерный менеджер — «ремонт ванной под ключ». Фильтрация через bitrix:catalog.smart_filter с параметром FILTER_NAME=arrServiceFilter и кастомным шаблоном, который показывает переключатель «Для дома / Для бизнеса» вместо стандартного чекбокса.
Портфолио выполненных проектов
Портфолио — отдельный инфоблок PORTFOLIO, не раздел в услугах. Причина: у проекта своя структура данных, которая не пересекается с услугой. Проект — это конкретный объект с адресом, заказчиком, сроками, площадью. Услуга — это описание возможности.
Свойства элемента портфолио:
| Свойство | Код | Тип |
|---|---|---|
| Фото «до» | PHOTO_BEFORE | F (файл, множ.) |
| Фото «после» | PHOTO_AFTER | F (файл, множ.) |
| Площадь объекта | OBJECT_AREA | N |
| Срок выполнения | EXECUTION_TIME | S |
| Использованные материалы | USED_MATERIALS | S (множ.) |
| Отзыв клиента | CLIENT_TESTIMONIAL | HTML |
| Привязка к услуге | SERVICE_LINK | E (привязка к инфоблоку SERVICES) |
| Координаты | COORDINATES | S ("lat,lng") |
| Год завершения | COMPLETION_YEAR | N |
Привязка SERVICE_LINK — ключевая связь. На странице услуги «Строительство коттеджей» автоматически подтягиваются проекты через CIBlockElement::GetList с фильтром ['PROPERTY_SERVICE_LINK' => $serviceId]. На карте портфолио — маркеры с кластеризацией через ymaps.Clusterer, при клике на маркер — всплывающее окно с фото «после», площадью и ссылкой на полную карточку проекта.
Фото «до/после» на карточке проекта реализуются через JavaScript-компонент сравнения: два изображения с ползунком. Техническая сторона — два <img> в контейнере с overflow: hidden, одно из которых обрезается по ширине через clip-path или абсолютным позиционированием. Обработчик mousedown/touchstart на разделителе перемещает границу обрезки.
Калькулятор стоимости: глубокое погружение
Калькулятор — самый конверсионный элемент сайта строительной компании. Посетитель не хочет звонить, чтобы узнать порядок цифр. Он хочет двигать ползунки и видеть, как меняется итог. Многошаговая форма с AJAX-расчётом на каждом этапе — правильный подход.
Архитектура калькулятора. Четыре шага:
- Тип работ — выбор из списка: новое строительство, капитальный ремонт, реконструкция, отделка
- Параметры объекта — площадь (ползунок + ручной ввод), этажность, тип фундамента (для нового строительства), текущее состояние (для ремонта)
- Материалы — выбор из предустановленных наборов: эконом, стандарт, премиум; или ручной выбор по категориям (стены, кровля, отделка)
- Результат — диапазон стоимости, примерные сроки, кнопка «Получить точную смету»
Хранение коэффициентов. Базовые ставки и коэффициенты хранятся в Highload-блоке CALC_RATES с полями:
| Поле | Тип | Пример |
|---|---|---|
| UF_WORK_TYPE | список | new_build, renovation, reconstruction |
| UF_MATERIAL_CLASS | список | economy, standard, premium |
| UF_BASE_RATE | число | 45000 (руб/м²) |
| UF_FLOOR_COEFF | число | 1.15 (множитель за 2+ этаж) |
| UF_FOUNDATION_COEFF | число | 1.20 (ленточный) / 1.35 (плита) |
| UF_REGION_COEFF | число | 1.0 (Минск) / 0.85 (регионы) |
Менеджер обновляет коэффициенты через административный интерфейс Highload-блока без участия разработчика. Новый тип работ — новая запись в блоке, калькулятор подхватывает автоматически.
Серверная часть. Кастомный компонент project:calc.estimate с AJAX-контроллером. Битрикс предоставляет механизм AJAX через Bitrix\Main\Engine\Controller:
namespace Project\Component;
use Bitrix\Main\Engine\Controller;
use Bitrix\Main\Engine\ActionFilter;
class CalcEstimateController extends Controller
{
public function configureActions(): array
{
return [
'calculate' => [
'prefilters' => [
new ActionFilter\HttpMethod([ActionFilter\HttpMethod::METHOD_POST]),
new ActionFilter\Csrf(),
],
],
];
}
public function calculateAction(
string $workType,
float $area,
int $floors,
string $materialClass,
string $foundation = ''
): array {
$rates = HighloadManager::getRow('CALC_RATES', [
'UF_WORK_TYPE' => $workType,
'UF_MATERIAL_CLASS' => $materialClass,
]);
if (!$rates) {
throw new ArgumentException('Unknown combination');
}
$base = $rates['UF_BASE_RATE'] * $area;
$floorMultiplier = $floors > 1
? pow($rates['UF_FLOOR_COEFF'], $floors - 1)
: 1.0;
$foundationMultiplier = 1.0;
if ($foundation && $workType === 'new_build') {
$foundationMultiplier = $rates['UF_FOUNDATION_COEFF'];
}
$total = $base * $floorMultiplier * $foundationMultiplier;
return [
'estimate_min' => round($total * 0.85),
'estimate_max' => round($total * 1.15),
'timeline_weeks' => $this->estimateTimeline($workType, $area),
'breakdown' => [
'base' => round($base),
'floor_adjustment' => round($base * ($floorMultiplier - 1)),
'foundation_adjustment' => round($base * $floorMultiplier * ($foundationMultiplier - 1)),
],
];
}
}
Фронтенд калькулятора. Каждый шаг — отдельный экран, переход с анимацией. На шагах 1-3 данные накапливаются в объекте состояния. На шаге 2 — AJAX-запрос для динамического обновления доступных опций (если выбрано «новое строительство», появляется выбор фундамента; если «ремонт» — появляется выбор текущего состояния). На шаге 4 — AJAX-запрос calculateAction с полным набором параметров.
Результат отображается как диапазон: «от 3 200 000 до 4 350 000 руб.». Не точная цифра — это важно юридически и коммерчески. Ниже — разбивка: базовая стоимость, надбавка за этажность, надбавка за тип фундамента. Клиент видит, из чего складывается оценка, и понимает, где можно сэкономить.
Сохранение расчётов. Каждый расчёт записывается в Highload-блок CALC_RESULTS с полями: входные параметры, результат, дата, IP, UTM-метки. Это даёт аналитику: какие типы работ считают чаще, какой средний запрашиваемый бюджет, на каком шаге пользователи уходят (если шаг 4 не достигнут — записываем по событию beforeunload). UTM-метки позволяют привязать расчёт к рекламной кампании.
Кнопка «Получить точную смету» открывает форму с полями: имя, телефон, email, комментарий. При отправке — создаётся лид в CRM (если подключён Битрикс24) или отправляется email через CEvent::Send() с типом почтового события CALC_REQUEST. В тело письма автоматически подставляются все параметры расчёта — менеджеру не нужно переспрашивать.
Тендерная система для B2B
Корпоративный заказчик приходит не с вопросом «сколько стоит», а с техническим заданием на 40 страниц. Ему нужна форма подачи заявки с загрузкой файлов.
Форма тендерной заявки — кастомный компонент на базе bitrix:form.result.new или отдельный контроллер. Поля: название компании, ИНН, контактное лицо, email, телефон, описание проекта (textarea), файлы ТЗ (множественная загрузка, до 5 файлов, форматы PDF/DOC/DWG/ZIP, максимум 50MB суммарно). Валидация на фронте — проверка расширений и размера до отправки. На бэкенде — повторная проверка через CFile::CheckFile().
Загруженные файлы сохраняются в инфоблок TENDER_REQUESTS как элемент со свойствами-файлами. Почтовое событие TENDER_NEW_REQUEST рассылает уведомление ответственному менеджеру. Автоответ заявителю — отдельное почтовое событие TENDER_CONFIRM с текстом «Ваша заявка #ID принята, ожидайте ответ в течение 2 рабочих дней».
Сертификаты, лицензии, допуски
Для строительной компании раздел с лицензиями — не декорация. СРО, ISO, лицензии на проектирование — всё это проверяет заказчик перед заключением договора. Инфоблок CERTIFICATES с минимумом полей: название документа, номер, дата выдачи, срок действия, скан (файл). На фронте — галерея с возможностью просмотра скана в полном размере через lightbox. Срок действия отслеживается агентом (CAgent): за 30 дней до истечения — уведомление администратору.
Команда и специализации
Инфоблок TEAM с привязкой к услугам через множественное свойство SPECIALIZATION (тип E, привязка к инфоблоку SERVICES). На странице сотрудника — его проекты из портфолио (связь через PROPERTY_MANAGER_ID в инфоблоке PORTFOLIO). На странице услуги — блок «Наши специалисты» с автоматической подборкой по привязке.
Мониторинг хода строительства
Клиентский портал для действующих заказчиков — отдельный раздел за авторизацией. Инфоблок CONSTRUCTION_PROGRESS с элементами-отчётами: дата, описание этапа, фотографии, процент выполнения. Привязка к проекту через PROPERTY_PROJECT_ID, привязка к клиенту через PROPERTY_CLIENT_USER_ID. Авторизованный клиент видит только свои проекты — фильтр ['PROPERTY_CLIENT_USER_ID' => $USER->GetID()].
Фотоотчёты загружает прораб через упрощённую форму в административной части или через мобильную версию фронтенда с bitrix:iblock.element.add.form. Уведомление клиенту при добавлении нового отчёта — через почтовое событие PROGRESS_UPDATE.
Интеграция с 1С для учёта проектов
Модуль sale не нужен — строительная компания не продаёт товары через корзину. Но обмен с 1С:Управление строительной организацией актуален: справочники контрагентов, статусы договоров, акты выполненных работ. Интеграция через REST API 1С или промежуточную базу данных. Данные из 1С подтягиваются в Highload-блоки Битрикса через крон-задачу, обновляются раз в час.
SEO: запросы «тип работ + город»
Целевые запросы — «строительство коттеджей Минск», «капитальный ремонт офиса Гомель», «промышленное строительство Беларусь». Шаблоны SEO через настройки инфоблока услуг:
-
ELEMENT_META_TITLE=#ELEMENT_NAME# в {город} | {компания} -
SECTION_META_TITLE=#SECTION_NAME# — услуги строительной компании | {компания}
Для геозависимых посадочных — отдельные разделы или landing-компонент с динамической подстановкой города из Highload-блока «Регионы работы». Schema.org микроразметка LocalBusiness с areaServed и Service:
{
"@context": "https://schema.org",
"@type": "GeneralContractor",
"name": "Название компании",
"areaServed": {"@type": "City", "name": "Минск"},
"hasOfferCatalog": {
"@type": "OfferCatalog",
"name": "Услуги",
"itemListElement": [
{"@type": "Offer", "itemOffered": {"@type": "Service", "name": "Строительство коттеджей"}}
]
}
}
Этапы и сроки
| Масштаб проекта | Сроки |
|---|---|
| Сайт-визитка с каталогом услуг и портфолио | 3-5 недель |
| Полноценный сайт с калькулятором, тендерной системой, клиентским порталом | 8-14 недель |
| Корпоративный портал с интеграцией 1С, мониторингом строительства, мультиязычностью | 14-24 недели |
- Аналитика (1-2 недели) — структура каталога услуг, логика калькулятора, прототипы
- Дизайн (2-3 недели) — главная, каталог, карточка проекта, калькулятор, мобильная версия
- Разработка ядра (3-5 недель) — инфоблоки, шаблоны, фильтрация, портфолио с картой
- Калькулятор и формы (2-3 недели) — многошаговый расчёт, тендерная форма, клиентский портал
- Интеграции (1-3 недели) — 1С, CRM, почтовые события
- Тестирование и запуск (1-2 недели) — кроссбраузер, мобильные устройства, SEO-аудит
Сроки не включают наполнение портфолио и настройку коэффициентов калькулятора — это делает заказчик параллельно с разработкой.







