Блог Горошко Андрея 1C-Битрикс,Разработка Современная работа с разделами инфоблоков: SectionTable::getList в Bitrix D7 ORM

Современная работа с разделами инфоблоков: SectionTable::getList в Bitrix D7 ORM

Продолжая осваивать D7 ORM, перейдем от элементов к разделам. Для работы с разделами инфоблоков в современном API предназначен класс \Bitrix\Iblock\SectionTable. Он предоставляет тот же мощный и гибкий синтаксис, что и ElementTable, делая код чистым и унифицированным.

Подготовка и базовый синтаксис

Как и в случае с элементами, для начала работы нужно подключить модуль и импортировать класс.

use Bitrix\Main\Loader;
use Bitrix\Iblock\SectionTable;

Loader::includeModule('iblock');

Метод getList — наш основной инструмент. Он принимает массив параметров, знакомый нам по работе с ElementTable.

$result = SectionTable::getList([
    'select' => [...],
    'filter' => [...],
    'order'  => [...],
    'limit'  => ...
]);

1. Выборка полей (select)

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

Пример: Выбрать ID, название и символьный код всех активных разделов

$result = SectionTable::getList([
    'select' => ['ID', 'SECTION_NAME' => 'NAME', 'CODE'],
    'filter' => ['=IBLOCK_ID' => 5, '=ACTIVE' => 'Y']
]);

while ($section = $result->fetch()) {
    echo "{$section['ID']}: {$section['SECTION_NAME']} ({$section['CODE']})<br>";
}

Выборка пользовательских полей (UF*):
D7 ORM позволяет легко выбирать UF-поля. Их имена уже доступны в сущности SectionTable и не требуют JOIN-ов вручную.

$result = SectionTable::getList([
    'select' => ['ID', 'NAME', 'UF_CUSTOM_TITLE'], // Просто указываем UF_ поле
    'filter' => ['=IBLOCK_ID' => 5]
]);

2. Фильтрация (filter)

Фильтр работает так же, как и для элементов, включая все операторы (!, >, <, % и т.д.).

Пример: Найти дочерние разделы для раздела с ID=12

$parentId = 12;

$result = SectionTable::getList([
    'select' => ['ID', 'NAME'],
    'filter' => [
        '=IBLOCK_ID' => 5,
        '=IBLOCK_SECTION_ID' => $parentId, // Фильтр по родительскому разделу
        '=ACTIVE' => 'Y'
    ]
]);

Сложная фильтрация:
Для логики «ИЛИ» используется ключ LOGIC => OR

// Найти разделы, у которых символьный код 'bags' ИЛИ 'shoes'
$result = SectionTable::getList([
    'select' => ['ID', 'NAME'],
    'filter' => [
        '=IBLOCK_ID' => 5,
        'LOGIC' => 'OR',
        ['=CODE' => 'bags'],
        ['=CODE' => 'shoes']
    ]
]);

3. Подсчет элементов в разделе

D7 ORM позволяет легко подсчитывать количество элементов, связанных с разделом, с помощью runtime полей и ReferenceField.

use Bitrix\Main\Entity;

$result = SectionTable::getList([
    'select' => ['ID', 'NAME', 'ELEMENT_CNT'],
    'filter' => ['=IBLOCK_ID' => 5, '=ACTIVE' => 'Y'],
    'runtime' => [
        new Entity\ReferenceField(
            'ELEMENTS',
            '\Bitrix\Iblock\ElementTable',
            ['=this.ID' => 'ref.IBLOCK_SECTION_ID'],
            ['join_type' => 'LEFT']
        ),
        new Entity\ExpressionField('ELEMENT_CNT', 'COUNT(%s)', 'ELEMENTS.ID')
    ]
]);

while($row = $result->fetch()){
    echo "{$row['NAME']} ({$row['ELEMENT_CNT']})<br>";
}

Этот код более сложный, но он демонстрирует всю мощь ORM — возможность строить сложные запросы, не выходя за рамки объектной модели.

CRUD-операции

Методы add, update и delete для SectionTable работают абсолютно идентично ElementTable и HighloadBlockTable.

  • SectionTable::add($arFields) — добавляет раздел.
  • SectionTable::update($id, $arFields) — обновляет раздел.
  • SectionTable::delete($id) — удаляет раздел.

// Пример добавления раздела
$result = SectionTable::add([
    'IBLOCK_ID' => 5,
    'NAME' => 'Новый раздел D7',
    'CODE' => 'new_section_d7',
    'ACTIVE' => 'Y'
]);

if ($result->isSuccess()) {
    echo "ID нового раздела: " . $result->getId();
} else {
    print_r($result->getErrorMessages());
}

Вывод:
Использование SectionTable — это современный и предпочтительный способ работы с разделами инфоблоков. Он предлагает более чистый синтаксис, предсказуемое поведение и расширенные возможности по сравнению со старым CIBlockSection. Для всех новых разработок рекомендуется использовать именно D7 ORM.

SectionTable, getList, D7 ORM, разделы Битрикс, Bitrix\Iblock\SectionTable, ORM Битрикс, выборка разделов, современная разработка.

Похожая задача в бизнесе?

Помогу автоматизировать процессы и внедрить ИИ

Меня зовут Андрей Горошко. Я Full-stack разработчик и эксперт по 1С-Битрикс. Настраиваю CRM Битрикс24, разрабатываю защищенные API и создаю умных ИИ-агентов для автоматизации рутины.

Добавить комментарий

Related Post

Как использовать CIBlock::Add() в 1С-Битрикс: пример кодаКак использовать CIBlock::Add() в 1С-Битрикс: пример кода

Оптимизация производительности и безопасности — залог успешного проекта на 1С-Битрикс. Данный материал посвящен практическому применению «Как использовать CIBlock::Add() в 1С-Битрикс: пример кода». Мы подготовили подробный разбор принципов работы и развернутые

Vyborka: Руководство разработчикаVyborka: Руководство разработчика

Эффективная интеграция и кастомизация функционала в Битрикс24 часто требует работы на уровне API. Сегодня мы подробно рассмотрим «Vyborka: Руководство разработчика». Вы узнаете экспертные методики работы с запросов и научитесь избегать

Интеграция Битрикс24 с Авито (Avito Сообщения и Лиды)Интеграция Битрикс24 с Авито (Avito Сообщения и Лиды)

Профессиональная настройка и внедрение Битрикс24 CRM позволяет систематизировать работу отдела продаж, исключить потерю лидов и автоматизировать ключевые бизнес-процессы компании. Услуга «Интеграция Битрикс24 с Авито (Avito Сообщения и Лиды)» обеспечивает переписка