Розробка модуля зворотного зв'язку 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": "+380 (99) 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.ua/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) уточнюється на етапі оцінки.







