Разработка модуля обратной связи 1С-Битрикс
Стандартный компонент bitrix:main.feedback умеет отправлять письмо и сохранять запись в инфоблок. Этого достаточно для лендинга с одной формой. Как только появляется несколько форм с разными полями, маршрутизацией по отделам, привязкой к CRM, антиспамом и дашбордом с конверсией — штатное решение ломается. Модуль обратной связи — это полноценная система управления формами с аналитикой.
Модель данных
Модуль vendor.feedback:
-
b_vendor_feedback_form— формы: id, code, name, fields_schema (JSON), submit_action (JSON: email/crm/webhook), success_message, redirect_url, is_active, spam_protection (JSON) -
b_vendor_feedback_submission— заявки: id, form_id, data (JSON), user_id, ip, user_agent, page_url, utm_source, utm_medium, utm_campaign, status (new/processed/spam), created_at -
b_vendor_feedback_attachment— файлы к заявкам: id, submission_id, file_id -
b_vendor_feedback_stat— статистика форм (суточные срезы): form_id, date, views, submissions, conversion
Конструктор форм
Схема полей формы хранится в fields_schema как JSON. Пример:
[
{"type": "text", "name": "name", "label": "Имя", "required": true},
{"type": "phone", "name": "phone", "label": "Телефон", "required": true, "mask": "+7 (999) 999-99-99"},
{"type": "email", "name": "email", "label": "Email", "required": false},
{"type": "select", "name": "dept", "label": "Отдел", "options": ["Продажи", "Поддержка", "Бухгалтерия"]},
{"type": "file", "name": "doc", "label": "Документ", "accept": ".pdf,.doc,.docx", "max_size_mb": 5},
{"type": "textarea","name": "message","label": "Сообщение", "required": true}
]
Компонент vendor:feedback.form рендерит форму из схемы без изменения шаблона при добавлении полей.
Обработка заявки
class SubmissionHandler
{
public function handle(int $formId, array $postData, array $files): HandleResult
{
$form = FormTable::getById($formId)->fetch();
// Валидация по схеме полей
$validator = new FormValidator($form['FIELDS_SCHEMA']);
if (!$validator->validate($postData)) {
return HandleResult::validationError($validator->getErrors());
}
// Антиспам
if (!$this->spamChecker->check($postData, $form['SPAM_PROTECTION'])) {
return HandleResult::spam();
}
// Сохраняем заявку
$submissionId = SubmissionTable::add([
'FORM_ID' => $formId,
'DATA' => $postData,
'IP' => $_SERVER['REMOTE_ADDR'],
'PAGE_URL' => $_SERVER['HTTP_REFERER'] ?? '',
'UTM_SOURCE' => $_COOKIE['utm_source'] ?? '',
// ...
])->getId();
// Загружаем файлы
foreach ($files as $fieldName => $file) {
$fileId = \CFile::SaveFile(\CFile::MakeFileArray($file['tmp_name']), 'feedback');
AttachmentTable::add(['SUBMISSION_ID' => $submissionId, 'FILE_ID' => $fileId]);
}
// Выполняем действия (email, CRM, webhook)
$this->dispatchActions($form['SUBMIT_ACTION'], $submissionId, $postData);
return HandleResult::success();
}
}
Маршрутизация и действия
Поле submit_action определяет, что происходит после отправки формы:
{
"email": {"to": ["[email protected]"], "template": "feedback_sales"},
"crm": {"type": "lead", "responsible_id": 42, "fields_map": {"name": "TITLE", "phone": "PHONE"}},
"webhook": {"url": "https://n8n.company.ru/webhook/feedback", "method": "POST"}
}
Несколько действий выполняются последовательно. При ошибке одного действия (например, CRM недоступен) остальные продолжают выполняться, ошибка логируется.
Антиспам
Три уровня защиты:
- Honeypot — скрытое поле в форме, заполненное автоматически ботом
- Временна́я проверка — форма не может быть отправлена быстрее 3 секунд после загрузки (JavaScript + server-side)
-
Rate limiting — не более 3 заявок с одного IP в час: проверка по
b_vendor_feedback_submission
reCAPTCHA v3 подключается как опциональный модуль.
Аналитика и конверсия
Счётчик просмотров формы инкрементируется через AJAX (1 пиксель-запрос при загрузке формы в viewport). Конверсия = submissions / views:
В дашборде администратора:
- Воронка по форме: просмотры → начали заполнять → отправили → попали в спам
- UTM-разбивка: откуда приходят заявки с высокой конверсией
- Среднее время заполнения формы
- Тепловая карта по часам: когда приходит больше заявок
Сроки разработки
| Этап | Срок |
|---|---|
| ORM-таблицы, конструктор схемы форм | 1 день |
| Рендер формы из схемы, валидация | 1 день |
| Обработчик заявок, загрузка файлов | 1 день |
| Email, CRM, Webhook действия | 2 дня |
| Антиспам (honeypot, rate limit) | 1 день |
| Счётчик просмотров, статистика | 1 день |
| Административный интерфейс, просмотр заявок | 2 дня |
| Тестирование | 1 день |
Итого: 10 рабочих дней. Интеграция с конкретной CRM (Bitrix24, amoCRM, RetailCRM) уточняется на этапе оценки.







