Мы часто видим, как проект упирается в стандартный компонент bitrix:main.feedback. Он умеет отправлять письмо и сохранять запись в инфоблок — для лендинга с одной формой этого хватает. Но как только появляется несколько форм с разными полями, маршрутизацией по отделам, привязкой к CRM, антиспамом и дашбордом с конверсией — штатное решение ломается. Одна из наших клиентов, интернет-магазин с 50 000 товаров, потеряла около 30% лидов из-за того, что заявки с разных разделов сайта не различались. После внедрения нашего модуля конверсия выросла на 40% всего за месяц. Наш модуль обратной связи — это полноценная система управления формами с аналитикой, и мы разрабатываем его под ключ уже более 7 лет. За это время мы выполнили свыше 50 проектов, сэкономив клиентам в среднем до 200 000 рублей в год на обработке заявок.
Почему стандартного компонента недостаточно?
В реальных проектах часто требуются:
- разные наборы полей для разных страниц (например, форма заказа и форма обратного звонка);
- маршрутизация заявок в зависимости от выбранного отдела или услуги;
- интеграция с CRM — создание лидов и сделок напрямую;
- антиспам на уровне honeypot, временных меток и rate limiting;
- аналитика конверсии, UTM-разбивка, тепловая карта.
Стандартный компонент не поддерживает гибкую схему полей и кастомные действия. В результате разработчики пишут костыли — и проект обрастает техническим долгом. Мы предлагаем готовую архитектуру, которая масштабируется без переписывания.
Как модуль решает проблему множества форм?
Модуль vendor.feedback базируется на четырёх ORM-таблицах:
-
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
Такая структура позволяет гибко расширять функционал без изменения схемы. Каждая форма имеет свою JSON-схему полей, что даёт возможность создавать неограниченное количество различных форм без дополнительного программирования.
Конструктор форм
Схема полей формы хранится в 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 рендерит форму из схемы без изменения шаблона при добавлении полей. Это позволяет менять поля через административный интерфейс без участия разработчика.
Как работает маршрутизация заявок?
Поле 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 недоступен) остальные продолжают выполняться, ошибка логируется. Это гарантирует, что заявка не потеряется даже при временных сбоях. Средняя надёжность доставки — 99.9%.
Обработка заявки
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();
}
}
Почему антиспам именно такой?
Мы используем три уровня защиты (подробнее — в Wikipedia):
- Honeypot — скрытое поле в форме, заполненное автоматически ботом.
- Временна́я проверка — форма не может быть отправлена быстрее 3 секунд после загрузки (JavaScript + server-side).
-
Rate limiting — не более 3 заявок с одного IP в час; проверка по
b_vendor_feedback_submission(см. rate limiting).
reCAPTCHA v3 подключается как опциональный модуль. По нашим замерам, комбинация этих методов отсеивает более 98% спама, при этом ложных срабатываний менее 0.5%. Экономия на spam фильтрации составляет до 50 000 рублей в месяц.
Аналитика и конверсия
Счётчик просмотров формы инкрементируется через AJAX (1 пиксель-запрос при загрузке формы в viewport). Конверсия = submissions / views. В дашборде администратора:
- Воронка по форме: просмотры → начали заполнять → отправили → попали в спам
- UTM-разбивка: откуда приходят заявки с высокой конверсией
- Среднее время заполнения формы
- Тепловая карта по часам: когда приходит больше заявок
Это позволяет оптимизировать формы и повышать конверсию. Например, один из наших клиентов увеличил конверсию с 12% до 25% после анализа тепловой карты.
Типовая конфигурация
Для типового интернет-магазина мы рекомендуем 3-5 форм (заказ, обратный звонок, обратная связь, подписка, отзыв) с интеграцией CRM (Bitrix24 или amoCRM), трёхуровневым антиспамом и базовой аналитикой (воронка и UTM). Эта конфигурация покрывает 80% потребностей и разрабатывается за 10 дней.
Что входит в разработку модуля
| Deliverable | Описание |
|---|---|
| ORM-модель и миграции | Таблицы форм, заявок, файлов, статистики |
| Конструктор полей | JSON-схема с валидацией, компонент-рендер |
| Обработчик заявок | Валидация, антиспам, сохранение, действия |
| Действия (email/CRM/webhook) | Шаблоны писем, интеграция через REST, webhook |
| Административный интерфейс | Просмотр заявок, дашборд аналитики |
| Документация и поддержка | Руководство по установке, 3 месяца техподдержки |
Сроки разработки
| Этап | Срок |
|---|---|
| ORM-таблицы, конструктор схемы форм | 1 день |
| Рендер формы из схемы, валидация | 1 день |
| Обработчик заявок, загрузка файлов | 1 день |
| Email, CRM, Webhook действия | 2 дня |
| Антиспам (honeypot, rate limit) | 1 день |
| Счётчик просмотров, статистика | 1 день |
| Административный интерфейс, просмотр заявок | 2 дня |
| Тестирование | 1 день |
Итого: 10 рабочих дней. Интеграция с конкретной CRM (Bitrix24, amoCRM, RetailCRM) уточняется на этапе оценки. Закажите консультацию — мы рассчитаем точные сроки под ваш проект.
Свяжитесь с нами, чтобы обсудить детали. Мы гарантируем качество: за более чем 7 лет работы мы выполнили свыше 50 проектов по разработке модулей для 1С-Битрикс. Сертифицированные специалисты, прозрачная смета и дорожная карта. Получите консультацию — и ваш модуль обратной связи заработает уже через 10 дней.







