Настройка валідації полів форм 1С-Бітрікс
Форма приймає номер телефону в будь-якому форматі: «80291234567», «+375-29-123-45-67», «029 123 45 67» — все це потрапляє в базу як є. Через три місяці менеджер дивиться на 2000 записів з номерами в десяти різних форматах і не може експортувати їх у CRM.
Вбудована валідація модуля form
Модуль form підтримує базову валідацію на рівні полів через параметри в b_form_field: поле REQUIRED (Y/N), поле CHECK_FILTER — регулярне вираження для перевірки значення, поле FILTER_MEMO — повідомлення про помилку.
Редагування через API:
\CFormField::Update($fieldId, $formId, [
'REQUIRED' => 'Y',
'CHECK_FILTER' => '^\\+375[0-9]{9}$',
'FILTER_MEMO' => 'Введіть номер у форматі +375XXXXXXXXX',
]);
CHECK_FILTER перевіряється на сервері при збереженні результату. Клієнтська валідація вбудованим модулем не підтримується — лише серверна.
Клієнтська валідація через JavaScript
Для негайного зворотного зв'язку клієнтська валідація додається в шаблон компонента bitrix:form.result.new. Обробник підписується на подію submit форми:
document.getElementById('form_<?= $arResult['FORM']['SID'] ?>').addEventListener('submit', function (e) {
var errors = [];
// Телефон
var phone = document.getElementById('field_PHONE').value.replace(/\D/g, '');
if (!/^375\d{9}$/.test(phone)) {
errors.push('Телефон: введіть номер у форматі +375XXXXXXXXX');
document.getElementById('field_PHONE').classList.add('error');
}
// Email
var email = document.getElementById('field_EMAIL').value;
if (email && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
errors.push('Email: неверний формат адреси');
document.getElementById('field_EMAIL').classList.add('error');
}
if (errors.length > 0) {
e.preventDefault();
document.getElementById('form_errors').innerHTML = errors.join('<br>');
}
});
Нормалізація перед збереженням
Валідація без нормалізації — половинчасте рішення. Телефон потрібно не лише перевірити, а й привести до єдиного виду. Обробник події OnBeforeResultAdd:
AddEventHandler('form', 'OnBeforeResultAdd', function($formId, &$arFields) {
if (isset($arFields['form_field_PHONE'])) {
$phone = preg_replace('/\D/', '', $arFields['form_field_PHONE']);
// Нормалізувати: 80291234567 → 375291234567
if (strlen($phone) === 11 && $phone[0] === '8') {
$phone = '375' . substr($phone, 2);
}
if (strlen($phone) === 9) {
$phone = '375' . $phone;
}
if (strlen($phone) === 12 && str_starts_with($phone, '375')) {
$arFields['form_field_PHONE'] = '+' . $phone;
} else {
// Вернути помилку
global $APPLICATION;
$APPLICATION->ThrowException('Неверний формат телефону');
return false;
}
}
});
Валідація з допомогою маски введення
Маска введення запобігає некоректному форматі під час набору. Бібліотека IMask.js інтегрується в шаблон компонента:
IMask(document.getElementById('field_PHONE'), {
mask: '+{375} (00) 000-00-00',
});
Після маски користувач фізично не може ввести букву у поле телефону. Це знімає частину навантаження з серверної валідації, але не замінює її — дані можуть прийти через прямий POST-запит, минуючи форму.
Захист від спама
Стандартна CAPTCHA Бітрікса підключається через параметр компонента USE_CAPTCHA. Для Web-форм — поле типу captcha у b_form_field. Альтернатива — Google reCAPTCHA v3 через обробник OnBeforeResultAdd: при низькому скорі рекапчи форма відхиляється без показу помилки користувачу (honeypot-підхід для ботів).
Серверна перевірка reCAPTCHA v3:
$token = $_POST['g-recaptcha-response'];
$response = file_get_contents(
'https://www.google.com/recaptcha/api/siteverify?secret=SECRET&response=' . $token
);
$data = json_decode($response, true);
if ($data['score'] < 0.5) {
return false; // Мовчки відхилити
}







