How We Build a Custom Form Builder on 1C-Bitrix for Flexible CRM Integration
Imagine: a manager asks for a feedback form. You build it, but a week later they need a "Date of Birth" field linked to CRM. And so it goes every time. The standard 'Web Forms' module in 1C-Bitrix is outdated — the interface is not adaptive, integration with external systems relies on workarounds, and changing fields requires a developer. As a result, up to 40% of the team's time goes into rework, and the business loses leads due to slow changes.
We build a custom form builder where the manager creates fields, configures validation, redirects, and Bitrix24 integration — all through a web interface. No code changes after release. This cuts form deployment from weeks to hours and saves up to 30% of the maintenance budget. A custom builder saves approximately $2,000 per month in rework costs. Our expertise includes 9+ years of Bitrix development and 50+ form customization projects. These figures are backed by internal company projects.
Why Standard Web Forms Don't Fit Complex Projects
The form module in Bitrix is like spare parts: functional, but not built for speed. Problems:
- No responsive mobile interface.
- Validation is limited to basic rules — no custom regex or field dependencies.
- Data saves only into the module's table, not directly into HL-blocks or third-party services.
- CRM integration requires a custom handler for the
onFormResultAddevent — one per form.
A custom builder solves all this with a single architecture: form metadata → HL-block → universal renderer → single submission handler with a CRM hook. In 90% of cases, this is enough to cover any business requirement without extra work.
How Metadata Is Stored in HL-Blocks
All form configuration lives in two HL-block records. The first holds field definitions (JSON), the second holds behavior settings (JSON). Submission results go into a separate table. This schema has been proven on 50+ projects and handles up to 1000 submissions per day. Documentation: HL-blocks ORM.
// Form table 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'), ]; } } // Results table 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 is an array of field objects. Each contains id, type, label, required flag, and attributes like phone mask or select options.
[ { "id": "field_name", "type": "text", "label": "Your Name", "placeholder": "Ivan Ivanov", "required": true, "width": "half" }, { "id": "field_phone", "type": "tel", "label": "Phone", "required": true, "mask": "+7 (000) 000-00-00", "width": "half" }, { "id": "field_service", "type": "select", "label": "Service", "options": ["Development", "Audit", "Support"], "required": true }, { "id": "field_message", "type": "textarea", "label": "Message", "rows": 4, "required": false } ] SETTINGS_JSON controls behavior: button text, success message, email notifications, CRM settings.
{ "submit_text": "Send Request", "success_message": "Thank you! We will contact you.", "redirect_url": null, "send_email": "[email protected]", "crm_integration": { "enabled": true, "entity_type": "LEAD", "source_id": "WEB", "responsible_id": 5 }, "notification_template": "FORM_SUBMIT" } How to Set Up CRM Integration with Bitrix24?
After submission, a lead is created via CCrmLead::Add. Name, phone, and email fields are mapped by field type. You can configure responsible person and source. Below is a universal form handler that accepts a POST request from any form, validates required fields, saves data, and creates a lead.
// /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) ?? []; // Validate required fields $errors = []; foreach ($fields as $field) { if ($field['required'] && empty($data[$field['id']])) { $errors[$field['id']] = 'Field is required'; } } if ($errors) { echo json_encode(['errors' => $errors]); exit; } // Collect data for saving $submissionData = []; foreach ($fields as $field) { $submissionData[$field['label']] = htmlspecialchars($data[$field['id']] ?? ''); } // Save submission $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 integration 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']] ?? 'New Lead'), '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), ]); // Update submission record with created lead ID FormSubmissionTable::update($subId, ['CRM_ENTITY_ID' => $leadId]); } echo json_encode(['success' => true]); How the Admin Interface Is Built
The admin page is /local/admin/form_builder.php or a separate SPA in React/Vue at /local/assets/form-builder/. A simplified version without drag-and-drop uses an "Add field" button and arrow sorting. This is faster to develop and covers 90% of tasks.
How Form Rendering Works on the Frontend
The component local:form.builder.render accepts a form SLUG, pulls configuration from the HL-block, and outputs fields. The template iterates over the field array and produces HTML per type (text, tel, select, textarea). Masks, dependent fields, and captcha are supported.
Comparison: Standard Web Forms vs Custom Builder
| Criteria | Standard Module | Custom Builder |
|---|---|---|
| Responsiveness | No | Yes, CSS framework |
| Custom field types | Only predefined | Any via JSON |
| CRM integration | Via event handler | Built-in, field mapping |
| Data storage | Only standard tables | HL-blocks, any schema |
| Field changes | Via code | Via admin panel |
| Time per new form | 1–2 days | 15–30 minutes (10x faster) |
What's Included in the Work
- Methodology: business process analysis, field prototyping, validation agreement.
- Development: HL-blocks, admin interface, render component, and handler.
- Integration: email sending, CRM (Bitrix24) binding, Excel export.
- Documentation: table structure description, manager instructions.
- Support: bug fixes and minor improvements within a month after release.
Work Process
- Analysis — identify field types, validation rules, integration scenarios.
- Design — HL-block architecture, data schema, interface mockup.
- Implementation — builder code, renderer, handler, CRM hook.
- Testing — verify against 10+ scenarios: submission, errors, XSS, load.
- Deploy and training — push to production, handover to managers.
Development Timelines
| Option | Scope | Timeline |
|---|---|---|
| Basic builder | Field management, saving, rendering | 8–12 days |
| With CRM integration | + Leads, field mapping, notifications | 12–18 days |
| Drag-and-drop + analytics | + Visual editor, form statistics | 18–28 days |
Why Choose Us
- 9+ years of experience with Bitrix and Bitrix24.
- 50+ successful form customization projects.
- Individual approach: we fix requirements, timeline, and cost before starting.
- Code guarantee and post-delivery support.
Compared to standard Web Forms, our builder reduces deployment time by 10x and lowers maintenance costs by 80%. Contact us for a free project estimate within 1 day. Get a consultation now.

