Блог разработчика 1С-Битрикс

Свойства «по разделам» в одном инфоблоке Битрикс: руководство (с примерами и кодом)

В 1С-Битрикс свойства принадлежат инфоблоку целиком, а «персонализация по разделам» делается через привязки свойств к разделам с наследованием. Вы настраиваете, какие свойства доступны/видны в конкретном разделе (в форме редактирования и в умном фильтре). Есть «глобальная» привязка ко всем разделам и локальные переопределения.

Организация свойств в инфоблоке Битрикс по разделам

Ключевой переключатель — опция свойства «Показывать на странице редактирования элемента»:

  • если включена, свойство ведёт себя как общее и отображается во всех разделах;
  • если выключена, свойство можно точечно добавлять/убирать в каждом разделе.

Что важно знать перед началом

  • Свойство ≠ поле раздела. Свойства принадлежат инфоблоку. «Привязка к разделу» лишь управляет их доступностью (форма, умный фильтр, отображение).
  • Наследование. Привязки наследуются вниз по дереву разделов; полностью отключить наследование нельзя — его переопределяют локально (добавлением/удалением записей на уровне раздела).
  • Общее свойство. Глобальную видимость свойства обеспечивает галка «Показывать на странице редактирования элемента» в карточке свойства. Это фактически «общая привязка».
  • Умный фильтр. За участие в фильтре отвечает другая опция — «Показывать в умном фильтре» (в карточке свойства). Тип отображения (слайдер, чекбоксы и т. п.) можно уточнить на уровне раздела.

Пошагово в интерфейсе

1) Подготовка

Составьте матрицу «свойство → разделы»: где свойство должно быть видно и где участвовать в фильтре. Это избавляет от дубликатов свойств «под каждый раздел».

2) Создание свойств (уровень инфоблока)

  • Задайте Код (латиница), Тип (строка/число/список/привязка к HL-блоку), Сортировку.
  • Крупные словари выносите в HL-блоки.
  • Для свойств, которые должны быть везде, включите «Показывать на странице редактирования элемента».
  • Для свойств, которые должны быть только в отдельных категориях, галку не ставьте.

3) Привязка к разделам (вкладка «Свойства элементов» у раздела)

  1. Откройте нужный раздел → «Свойства элементов».
  2. Добавьте свойства, которые должны быть доступны в этом разделе (так создаётся локальная запись привязки).
  3. При необходимости задайте параметры отображения: тип в фильтре, подсказку, развёрнутый вид.
  4. Сохраните. Нажмите «Показать наследование», чтобы увидеть, что пришло сверху, а что задано локально.
  5. Чтобы убрать локальную привязку, нажмите «Скрыть» в строке свойства.

> Если после «Скрыть» свойство всё равно видно — оно приходит по наследованию или как «общее» (из-за галки «Показывать на странице…»). Тогда снимите эту галку у свойства или удалите «глобальную» привязку программно (см. ниже).

4) Умный фильтр

  • В карточке свойства включите «Показывать в умном фильтре».
  • На уровне раздела уточните тип отображения (слайдер/флажки/диапазон).
  • Убедитесь, что у товаров заполнены значения — пустые свойства фильтр обычно скрывает.
  • После массовых изменений перестройте фасетный индекс.

5) Форма редактирования элемента (чтобы показывались «свои» поля раздела)

  1. Откройте добавление/редактирование товара → настройка формы (иконка «шестерёнка»).
  2. Включите «вкладки» (если выключены).
  3. Удалите из расположения формы все явно добавленные свойства и оставьте только блок «Значения свойств».
  4. Если какие-то свойства были помечены как обязательные, предварительно снимите обязательность в их карточках — иначе их нельзя убрать из формы.
  5. Сохраните. Теперь форма автоматически выводит ровно те свойства, которые разрешены для текущего раздела (плюс «общие» — с галкой «Показывать на странице…»).

Как это работает логически (коротко)

  • Галка «Показывать на странице редактирования элемента» = общее свойство. Видно везде, без точечной настройки.
  • Без галки — свойство «по умолчанию скрыто», и вы точечно добавляете/убираете его на вкладке «Свойства элементов» в нужных разделах.
  • Наследование: если свойство включили «сверху», оно появится в дочерних разделах, пока вы не переопределите его локально.

Пример

  • Инфоблок: «Каталог».
  • Производитель — общий атрибут: стоит галка «Показывать на странице…» и опция «Показывать в умном фильтре».
  • Холодильники → добавляем свойство Высота (в фильтре — слайдер).
  • Молочные продукты → добавляем свойство Масса (грамм) (в фильтре — диапазон).
  • На витрине и в админке:
    • «Холодильники» показывают Производитель + Высота;
    • «Молочные продукты» — Производитель + Масса (грамм).

Частые ситуации и решения

  1. Свойство видно везде, а вы хотите управлять по разделам.
    Снимите у свойства галку «Показывать на странице…». Если где-то осталось «везде» — удалите «глобальную» привязку (см. код ниже), затем включайте точечно.
  2. Нажали «Скрыть», а свойство всё ещё отображается.
    Значит, оно приходит по наследованию или является «общим». Посмотрите «Показать наследование» и/или уберите глобальную запись.
  3. Список на вкладке «Свойства элементов» выглядит «серым».
    Обычно это права или отсутствие локальных записей. Добавьте локальную запись (строку) и действия станут доступны.
  4. Свойство не попадает в фильтр.
    Проверьте два условия: привязка к разделу и галка «Показывать в умном фильтре». Плюс у товаров должны быть значения. После массовых правок — перестройка фасетного индекса.
  5. Дубли свойств «под каждый раздел».
    Не дублируйте. Создайте одно свойство и управляйте привязками.

Программно: готовые рецепты (миграции/скрипты)

> Перед использованием подключите модуль iblock.

Получить карту привязок для раздела (с учётом наследования)

use Bitrix\Main\Loader;
Loader::includeModule('iblock');
$iblockId  = 10;
$sectionId = 123;
$map = \CIBlockSectionPropertyLink::GetArray($iblockId, $sectionId);
// Ключи — ID свойств; значения: SMART_FILTER, DISPLAY_TYPE, DISPLAY_EXPANDED, FILTER_HINT.

Добавить/обновить локальную привязку свойства к разделу

\CIBlockSectionPropertyLink::Add($iblockId, $sectionId, [
  'PROPERTY_ID'      => 456,
  'SMART_FILTER'     => 'Y',  // участие в умном фильтре
  'DISPLAY_TYPE'     => 'A',  // слайдер/диапазон и т.п.
  'DISPLAY_EXPANDED' => 'N',
  'FILTER_HINT'      => 'Выберите диапазон',
]);

Удалить локальную привязку свойства у раздела (D7)

use Bitrix\Iblock\SectionPropertyTable;
$res = SectionPropertyTable::getList([
  'select' => ['ID'],
  'filter' => ['IBLOCK_ID' => $iblockId, 'SECTION_ID' => $sectionId, 'PROPERTY_ID' => 456],
]);
while ($row = $res->fetch()) {
  SectionPropertyTable::delete($row['ID']);
}

Убрать «глобальную» привязку (чтобы свойство не было «везде»)

use Bitrix\Iblock\SectionPropertyTable;
$links = SectionPropertyTable::getList([
  'select' => ['ID'],
  'filter' => ['IBLOCK_ID' => $iblockId, 'SECTION_ID' => 0, 'PROPERTY_ID' => 456],
]);
while ($l = $links->fetch()) {
  SectionPropertyTable::delete($l['ID']);
}

Массово снять привязку по ветке разделов

use Bitrix\Iblock\SectionTable;
use Bitrix\Iblock\SectionPropertyTable;
$root = SectionTable::getRow([
  'select' => ['LEFT_MARGIN','RIGHT_MARGIN'],
  'filter' => ['=ID' => $rootSectId, '=IBLOCK_ID' => $iblockId],
]);
$sectionIds = [];
$sectRes = SectionTable::getList([
  'select' => ['ID'],
  'filter' => [
    '=IBLOCK_ID'    => $iblockId,
    '>=LEFT_MARGIN' => $root['LEFT_MARGIN'],
    '<=RIGHT_MARGIN'=> $root['RIGHT_MARGIN'],
  ],
]);
while ($s = $sectRes->fetch()) $sectionIds[] = (int)$s['ID'];
if ($sectionIds) {
  $links = SectionPropertyTable::getList([
    'select' => ['ID'],
    'filter' => ['IBLOCK_ID' => $iblockId, 'PROPERTY_ID' => 456, 'SECTION_ID' => $sectionIds],
  ]);
  while ($l = $links->fetch()) SectionPropertyTable::delete($l['ID']);
}

Перестроить фасетный индекс для умного фильтра

use Bitrix\Iblock\PropertyIndex\Manager;
Manager::createIndexer($iblockId)->startIndex();

Чек-лист перед релизом

  • [ ] Свойства созданы однократно на уровне инфоблока (без дублей).
  • [ ] Для общих свойств включена галка «Показывать на странице редактирования элемента».
  • [ ] Для «категорийных» свойств галка снята, и они точечно привязаны на вкладке «Свойства элементов» нужных разделов.
  • [ ] Во всех нужных свойствах стоит «Показывать в умном фильтре», типы отображения заданы на уровне разделов.
  • [ ] У товаров заполнены значения ключевых свойств.
  • [ ] При необходимости удалена «глобальная» запись (SECTION_ID = 0).
  • [ ] Форма редактирования оставлена с блоком «Значения свойств».
  • [ ] Фасетный индекс перестроен.

Итог

В одном инфоблоке можно показывать разные наборы свойств для разных разделов. Схема проста:

  1. создаём свойства на уровне инфоблока;
  2. «общие» делаем через галку «Показывать на странице редактирования элемента»;
  3. всё остальное — точечно привязываем на вкладке «Свойства элементов» у разделов;
  4. включаем участие в умном фильтре и настраиваем отображение;
  5. приводим в порядок форму редактирования и индекс.

С этой логикой каталог выглядит аккуратно, фильтр работает быстро, а админская форма показывает только релевантные свойства текущего раздела.

Теги: инфоблок, свойства, разделы, умный фильтр, наследование, привязка свойств


Валерий Макеев
01.10.2025 14:39
Получение свойств для раздела с учётом наследования
Код
<?php
// Получение всех свойств раздела (включая унаследованные) с детальной информацией
function getSectionPropertiesWithInheritance($iblockId, $sectionId)
{
    Loader::includeModule('iblock');
    
    $properties = [];
    
    // Получаем привязки с наследованием
    $propertyLinks = \CIBlockSectionPropertyLink::GetArray($iblockId, $sectionId);
    
    if (empty($propertyLinks)) {
        return $properties;
    }
    
    // Получаем полную информацию о свойствах
    $propertyIterator = \CIBlockProperty::GetList(
        [], 
        ['IBLOCK_ID' => $iblockId, 'ID' => array_keys($propertyLinks)]
    );
    
    while ($property = $propertyIterator->Fetch()) {
        $propertyId = (int)$property['ID'];
        $properties[$propertyId] = [
            'PROPERTY_INFO' => $property,
            'LINK_INFO' => $propertyLinks[$propertyId],
            'IS_INHERITED' => isset($propertyLinks[$propertyId]['INHERITED']) 
                             && $propertyLinks[$propertyId]['INHERITED'] === 'Y'
        ];
    }
    
    return $properties;
}

// Использование:
$sectionProperties = getSectionPropertiesWithInheritance(10, 123);
foreach ($sectionProperties as $propertyId => $data) {
    $property = $data['PROPERTY_INFO'];
    $link = $data['LINK_INFO'];
    $isInherited = $data['IS_INHERITED'];
    
    echo "{$property['NAME']} - в фильтре: {$link['SMART_FILTER']}";
    if ($isInherited) {
        echo " (унаследовано)";
    }
    echo "\n";
}
Валерий Макеев
01.10.2025 14:39
Массовое копирование привязок между разделами
Код
<?php
// Копирование настроек привязок из одного раздела в другой
function copySectionPropertyLinks($iblockId, $sourceSectionId, $targetSectionId)
{
    Loader::includeModule('iblock');
    
    $sourceLinks = \CIBlockSectionPropertyLink::GetArray($iblockId, $sourceSectionId);
    $copiedCount = 0;
    
    foreach ($sourceLinks as $propertyId => $linkSettings) {
        // Пропускаем унаследованные настройки
        if (isset($linkSettings['INHERITED']) && $linkSettings['INHERITED'] === 'Y') {
            continue;
        }
        
        // Добавляем привязку в целевой раздел
        $result = \CIBlockSectionPropertyLink::Add($iblockId, $targetSectionId, [
            'PROPERTY_ID' => $propertyId,
            'SMART_FILTER' => $linkSettings['SMART_FILTER'] ?? 'N',
            'DISPLAY_TYPE' => $linkSettings['DISPLAY_TYPE'] ?? '',
            'DISPLAY_EXPANDED' => $linkSettings['DISPLAY_EXPANDED'] ?? 'N',
            'FILTER_HINT' => $linkSettings['FILTER_HINT'] ?? '',
        ]);
        
        if ($result) {
            $copiedCount++;
        }
    }
    
    return $copiedCount;
}

// Использование:
$copied = copySectionPropertyLinks(10, 100, 200);
echo "Скопировано привязок: $copied";

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Модули и компоненты для «1С-Битрикс»

оценка производится на основе предоставленного Технического Задания

от 20 000 рублей
Разработка дополнительных модулей для 1С-Битрикс, расширение функционала, внедрение любых решений, требующихся для выполнения ваших бизнес-задач.

* стоимость зависит от конкретной задачи, ее объема и сложности выполняемых работ.

Участие в проекте

привлечение в проект на part-time основе

от 30 000 рублей / неделя

Возможно участие в проекте на ежедневной основе, как разработчика. Занятость - до 20 часов в неделю
Минимальный срок - одна неделя.

* сумма фиксированная

Разработка корпоративного сайта

от 7 дней

от 40 000 рублей

Разработка сайта без системы оплаты заказов через корзину

* стоимость зависит от наличия верстки, использования готового решения и т.д.