Как мы строим кастомный конструктор форм на 1С-Битрикс для гибкой CRM-интеграции
Представьте: менеджер просит форму обратной связи. Вы делаете, а через неделю нужно добавить поле «Дата рождения» и привязать к CRM. И так каждый раз. Типовой модуль «Веб-формы» в 1С-Битрикс морально устарел — интерфейс не адаптивен, интеграция с внешними системами через костыли, а менять поля без разработчика нельзя. В результате на доработки уходит до 40% времени команды, а бизнес теряет лиды из-за медленных изменений.
Мы строим кастомный конструктор форм, где менеджер сам создаёт поля, настраивает валидацию, перенаправления и интеграцию с Битрикс24 — всё через веб-интерфейс. Никаких правок в коде после релиза. Это сокращает время внедрения новых форм с недель до часов и экономит до 30% бюджета на сопровождение. Наш опыт — 9+ лет разработки на Битрикс и более 50 проектов по кастомизации форм. Эти данные подтверждены внутренними проектами компании.
Почему стандартные веб-формы не подходят для сложных проектов?
Модуль form в Битрикс — это как запчасти: есть, но не для гонок. Проблемы:
- Интерфейс не перестраивается под мобильные устройства.
- Валидация ограничена стандартными правилами — без кастомных regex или зависимостей полей.
- Сохранение данных — только в таблицу модуля, без прямой записи в HL-блоки или сторонние сервисы.
- CRM-интеграция требует написания обработчика на событие
onFormResultAdd— для каждой формы свой.
Кастомный конструктор решает всё это одной архитектурой: метаданные формы → HL-блок → универсальный рендерер → единый обработчик сабмита с CRM-хуком. В 90% случаев этого достаточно, чтобы покрыть любые бизнес-требования без дополнительных доработок.
Как устроено хранение метаданных в HL-блоках?
Вся конфигурация формы лежит в двух записях HL-блока. Первая — описание полей (JSON), вторая — настройки поведения (JSON). Результаты сабмитов — в отдельной таблице. Схема проверена на 50+ проектах и выдерживает нагрузку до 1000 сабмитов в день. Документация: HL-блоки ORM.
// Таблица форм b_hl_form_builder
class FormBuilderTable extends \Bitrix\Main\ORM\Data\DataManager
{
public static function getTableName(): string { return 'b_hl_form_builder'; }
public static function getMap(): array
{
return [
new IntegerField('ID', ['primary' => true, 'autocomplete' => true]),
new StringField('TITLE'),
new StringField('SLUG'),
new TextField('FIELDS_JSON'),
new TextField('SETTINGS_JSON'),
new BooleanField('IS_ACTIVE', ['values' => [false, true]]),
new IntegerField('SUBMISSIONS_COUNT'),
new DatetimeField('CREATED_AT'),
];
}
}
// Таблица результатов b_hl_form_submissions
class FormSubmissionTable extends \Bitrix\Main\ORM\Data\DataManager
{
public static function getTableName(): string { return 'b_hl_form_submissions'; }
public static function getMap(): array
{
return [
new IntegerField('ID', ['primary' => true, 'autocomplete' => true]),
new IntegerField('FORM_ID'),
new TextField('DATA_JSON'),
new StringField('USER_IP'),
new StringField('USER_AGENT'),
new IntegerField('USER_ID'),
new IntegerField('CRM_ENTITY_ID'),
new DatetimeField('CREATED_AT'),
];
}
}
FIELDS_JSON — массив объектов полей. Каждый содержит id, тип, метку, обязательность, атрибуты вроде маски телефона или опций селекта.
[
{
"id": "field_name",
"type": "text",
"label": "Ваше имя",
"placeholder": "Иван Иванов",
"required": true,
"width": "half"
},
{
"id": "field_phone",
"type": "tel",
"label": "Телефон",
"required": true,
"mask": "+7 (000) 000-00-00",
"width": "half"
},
{
"id": "field_service",
"type": "select",
"label": "Услуга",
"options": ["Разработка", "Аудит", "Поддержка"],
"required": true
},
{
"id": "field_message",
"type": "textarea",
"label": "Сообщение",
"rows": 4,
"required": false
}
]
SETTINGS_JSON — управляет поведением: текст кнопки, сообщение об успехе, email для уведомлений, настройки CRM.
{
"submit_text": "Отправить заявку",
"success_message": "Спасибо! Мы свяжемся с вами.",
"redirect_url": null,
"send_email": "[email protected]",
"crm_integration": {
"enabled": true,
"entity_type": "LEAD",
"source_id": "WEB",
"responsible_id": 5
},
"notification_template": "FORM_SUBMIT"
}
Как настроить интеграцию с CRM Битрикс24?
После сабмита создаётся лид через CCrmLead::Add. Поля name, phone, email маппятся по типу поля. Можно настроить ответственного и источник. Ниже — универсальный обработчик, который принимает POST-запрос от любой формы, проверяет обязательные поля, сохраняет данные и создаёт лид.
// /local/ajax/form_builder_submit.php
$data = json_decode(file_get_contents('php://input'), true);
$formId = (int)($data['form_id'] ?? 0);
$form = FormBuilderTable::getByPrimary($formId)->fetch();
if (!$form || !$form['IS_ACTIVE']) {
echo json_encode(['error' => 'Form not found']);
exit;
}
$fields = json_decode($form['FIELDS_JSON'], true) ?? [];
$settings = json_decode($form['SETTINGS_JSON'], true) ?? [];
// Валидация обязательных полей
$errors = [];
foreach ($fields as $field) {
if ($field['required'] && empty($data[$field['id']])) {
$errors[$field['id']] = 'Поле обязательно';
}
}
if ($errors) {
echo json_encode(['errors' => $errors]);
exit;
}
// Собрать данные для сохранения
$submissionData = [];
foreach ($fields as $field) {
$submissionData[$field['label']] = htmlspecialchars($data[$field['id']] ?? '');
}
// Сохранить результат
$subId = FormSubmissionTable::add([
'FORM_ID' => $formId,
'DATA_JSON' => json_encode($submissionData, JSON_UNESCAPED_UNICODE),
'USER_IP' => $_SERVER['REMOTE_ADDR'],
'CREATED_AT' => new \Bitrix\Main\Type\DateTime(),
])->getId();
// CRM-интеграция
if ($settings['crm_integration']['enabled'] ?? false) {
\Bitrix\Main\Loader::includeModule('crm');
$nameField = findFieldByType($fields, 'text');
$phoneField = findFieldByType($fields, 'tel');
$emailField = findFieldByType($fields, 'email');
$leadId = \CCrmLead::Add([
'TITLE' => $form['TITLE'] . ': ' . ($data[$nameField['id']] ?? 'Новый лид'),
'NAME' => $data[$nameField['id']] ?? '',
'PHONE' => [['VALUE' => $data[$phoneField['id']] ?? '', 'VALUE_TYPE' => 'WORK']],
'EMAIL' => [['VALUE' => $data[$emailField['id']] ?? '', 'VALUE_TYPE' => 'WORK']],
'SOURCE_ID' => 'WEB',
'COMMENTS' => json_encode($submissionData, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT),
]);
// Обновляем запись сабмита ID созданного лида
FormSubmissionTable::update($subId, ['CRM_ENTITY_ID' => $leadId]);
}
echo json_encode(['success' => true]);
Как построен интерфейс администратора
Страница /local/admin/form_builder.php или отдельный SPA на React/Vue в /local/assets/form-builder/. Упрощённая версия без drag-and-drop — добавление полей через кнопку + сортировка стрелками. Это быстрее в разработке и покрывает 90% задач.
Как происходит рендер формы на фронтенде
Компонент local:form.builder.render принимает SLUG формы, достаёт конфигурацию из HL-блока и выводит поля. Шаблон проходится по массиву полей и для каждого типа (text, tel, select, textarea) рисует свой HTML. Поддерживаются маски, зависимые поля, капча.
Сравнение: стандартные веб-формы vs кастомный конструктор
| Критерий | Стандартный модуль | Кастомный конструктор |
|---|---|---|
| Адаптивность | Нет | Да, CSS-фреймворк |
| Кастомные типы полей | Только заданные | Любые через JSON |
| CRM-интеграция | Через обработчик события | Встроенная, маппинг полей |
| Хранение данных | Только стандартные таблицы | HL-блоки, любая схема |
| Изменение полей | Через код | Через админку |
| Время на новую форму | 1-2 дня | 15-30 минут |
Что входит в работу
- Методика: анализ бизнес-процессов, прототипирование полей, согласование валидации.
- Разработка: создание HL-блоков, админ-интерфейса, компонента рендера и обработчика.
- Интеграция: настройка отправки писем, привязка к CRM (Битрикс24), экспорт в Excel.
- Документация: описание структуры таблиц, инструкция для менеджеров.
- Поддержка: исправление ошибок, доработки в течение месяца после релиза.
Процесс работы
- Аналитика — выявляем типы полей, правила валидации, сценарии интеграции.
- Проектирование — архитектура HL-блоков, схема данных, макет интерфейса.
- Реализация — код конструктора, рендерера, обработчика, CRM-хука.
- Тестирование — проверка на 10+ сценариях: сабмит, ошибки, XSS, нагрузка.
- Деплой и обучение — заливка на продакшен, передача менеджерам.
Сроки разработки
| Вариант | Состав | Срок |
|---|---|---|
| Базовый конструктор | Управление полями, сохранение, рендер | 8–12 дней |
| С CRM-интеграцией | + Лиды, маппинг полей, уведомления | 12–18 дней |
| Drag-and-drop + аналитика | + Визуальный редактор, статистика форм | 18–28 дней |
Почему выбирают нас
- 9+ лет опыта с Битрикс и Битрикс24.
- 50+ успешных проектов по кастомизации форм.
- Индивидуальный подход: фиксируем требования, сроки и стоимость до старта.
- Гарантия на код, поддержка после сдачи.
Хотите такой же конструктор? Свяжитесь с нами — оценим проект бесплатно за 1 день. Получите консультацию прямо сейчас.







