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

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка условной логики в формах 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1177
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • 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 Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Настройка условной логики в формах 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(). Это покрывает большинство сценариев без подключения внешней библиотеки.