Налаштування умовної логіки у формах 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Налаштування умовної логіки у формах 1С-Бітрікс
Проста
~1 робочий день
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Настройка умовної логіки у формах 1С-Бітрікс

Форма зворотного зв'язку з 15 полями показує всі 15 одразу. П'ять з них актуальні лише для юридичних осіб, три — лише при виборі певного типу запиту. Користувач бачить зайві поля та йде. Умовна логіка ховає та показує поля залежно від значень інших полів.

Веб-форми Бітрікса та їх структура

Модуль form зберігає форми в b_form, поля — в b_form_field. Кожне поле має тип (SID): text, select, radio, checkbox, textarea тощо. Стандартний модуль форм не підтримує умовну логіку з коробки — вона добавляється через JavaScript у шаблоні компонента bitrix:form.result.new.

Компонент розташований у /bitrix/components/bitrix/form.result.new/. Шаблон копіюється в /bitrix/templates/[template]/components/bitrix/form.result.new/[template_name]/template.php.

У шаблоні кожне поле форми рендериться з атрибутом id, сформованим за маскою field_[SID], де SID — системний ідентифікатор поля з b_form_field. Це якір для JavaScript-логіки.

Реалізація через data-атрибути

Умови описуються через data-* атрибути на контейнерах полів. Підхід дозволяє тримати конфігурацію рядом з розміткою:

<!-- Поле тип_клієнта (radio: фізлиця / юридична особа) -->
<div class="form-row" id="row_CLIENT_TYPE">
    <!-- рендер поля -->
</div>

<!-- Поле ІНН — показувати лише якщо тип_клієнта = 'company' -->
<div class="form-row"
     id="row_INN"
     data-condition-field="CLIENT_TYPE"
     data-condition-value="company"
     style="display:none">
    <!-- рендер поля -->
</div>

JavaScript-обробник:

document.addEventListener('DOMContentLoaded', function () {
    function applyConditions() {
        document.querySelectorAll('[data-condition-field]').forEach(function (row) {
            var fieldSid   = row.dataset.conditionField;
            var reqValue   = row.dataset.conditionValue;
            var controller = document.querySelector('[name="form_field_' + fieldSid + '"]');
            if (!controller) return;

            var currentValue = controller.type === 'radio'
                ? (document.querySelector('[name="form_field_' + fieldSid + '"]:checked') || {}).value
                : controller.value;

            row.style.display = (currentValue === reqValue) ? '' : 'none';

            // Скинути значення прихованого поля
            if (row.style.display === 'none') {
                row.querySelectorAll('input, select, textarea').forEach(function (el) {
                    el.value = '';
                    if (el.type === 'checkbox' || el.type === 'radio') el.checked = false;
                });
            }
        });
    }

    // Навісити на всі контрольовані поля
    document.querySelectorAll('[data-condition-field]').forEach(function (row) {
        var fieldSid   = row.dataset.conditionField;
        var controller = document.querySelectorAll('[name="form_field_' + fieldSid + '"]');
        controller.forEach(function (el) {
            el.addEventListener('change', applyConditions);
        });
    });

    applyConditions(); // Застосувати при завантаженні
});

Серверна валідація прихованих полів

Важливий момент: приховане поле не повинно бути обов'язковим на сервері, якщо воно приховане за умовою. Стандартний модуль form перевіряє обов'язковість поля за прапором REQUIRED у b_form_field без урахування умов.

Обхід через обробник події OnBeforeResultAdd:

AddEventHandler('form', 'OnBeforeResultAdd', function($formId, &$arFields) {
    // Якщо тип клієнта не юридична особа — убрати ІНН з обов'язкових
    if (($arFields['form_field_CLIENT_TYPE'] ?? '') !== 'company') {
        unset($arFields['form_field_INN']);
    }
});

Множинні умови

Для полів з кількома умовами (показати якщо A = x І B = y) data-атрибути розширяються:

data-condition-rules='[{"field":"CLIENT_TYPE","value":"company"},{"field":"REQUEST_TYPE","value":"credit"}]'

JavaScript читає JSON.parse(row.dataset.conditionRules) та перевіряє всі умови через Array.every(). Це покриває більшість сценаріїв без підключення зовнішньої бібліотеки.