CIBlockResult в 1С-Битрикс: руководство по работе с результатами выборок

Класс CIBlockResult — это один из важных инструментов для разработчиков 1С-Битрикс, когда требуется гибко управлять результатами запросов к информационным блокам. Он наследуется от класса CDBResult и обладает всеми его свойствами и методами, но также дополняется собственными возможностями, существенно упрощающими обработку элементов ИБ.

CIBlockResult в 1С-Битрикс: руководство по работе с результатами выборок

В данной статье мы рассмотрим основные методы CIBlockResult, разберёмся, в каких ситуациях каждый из них применяется, и приведём рабочие примеры использования.

1. Общая информация о CIBlockResult

Класс CIBlockResult возвращается при вызове таких методов, как:

  • CIBlockElement::GetList
  • CIBlockElement::GetByID
  • Функции GetIBlockElementList, GetIBlockElementListEx

В основе своей он предоставляет доступ к данным, которые мы запрашиваем из инфоблока (например, списки элементов с определёнными параметрами фильтрации и сортировки). Благодаря методам CIBlockResult мы можем последовательно перебирать записи, получать поля, свойства, а также гибко работать со строками для построения адресов (URL).

2. Методы класса CIBlockResult

2.1. GetNext

Метод: GetNext()

С версии: 3.0.5

Описание: Возвращает из выборки массив полей элемента с уже подставленными ссылками в полях DETAIL_PAGE_URL и LIST_PAGE_URL. Это означает, что, если вы используете настройки для шаблонов путей, при получении элемента через GetNext() ссылки в полях будут соответствовать вашим шаблонам.

Пример использования:

<?php
// Получаем список элементов инфоблока
$arSelect = ["ID", "NAME", "DETAIL_PAGE_URL", "IBLOCK_ID"];
$arFilter = ["IBLOCK_ID" => 5, "ACTIVE" => "Y"];
$rsElements = CIBlockElement::GetList(
    ["SORT" => "ASC"],  // Сортируем по полю SORT
    $arFilter,
    false,
    false,
    $arSelect
);

// Перебираем полученные элементы
while ($arElement = $rsElements->GetNext()) {
    echo "<p>";
    echo "ID элемента: " . $arElement["ID"] . "<br>";
    echo "Название: " . $arElement["NAME"] . "<br>";
    echo "Ссылка на детальную страницу: " . $arElement["DETAIL_PAGE_URL"] . "<br>";
    echo "</p>";
}
?>

В результате мы получим последовательный вывод всех нужных полей. Обратите внимание, что поле DETAIL_PAGE_URL уже будет содержать корректный путь в зависимости от настроек инфоблока и указанных шаблонов.

2.2. GetNextElement

Метод: GetNextElement()

С версии: 3.1.3

Описание: Возвращает объект типа _CIBElement (не массив!), который даёт более гибкий доступ к полям и свойствам элемента. С помощью возвращённого объекта можно отдельно вызывать методы для получения полей (GetFields()) и свойств (GetProperties()), что особенно удобно, когда вам нужно управлять большим количеством полей и свойств, а также в случаях, когда свойства содержат массивы данных.

Пример использования:

<?php
$arSelect = ["ID", "NAME", "IBLOCK_ID"];
$arFilter = ["IBLOCK_ID" => 5, "ACTIVE" => "Y"];
$rsElements = CIBlockElement::GetList(
    ["SORT" => "ASC"],
    $arFilter,
    false,
    false,
    $arSelect
);

// Выводим поля и свойства каждого элемента
while ($obElement = $rsElements->GetNextElement()) {
    // Достаём поля
    $arFields = $obElement->GetFields();
    // Достаём свойства
    $arProps = $obElement->GetProperties();

    echo "<h3>Элемент: {$arFields["NAME"]}</h3>";
    echo "ID: {$arFields["ID"]}<br>";

    // Если вам нужны определённые свойства:
    if (isset($arProps["PRICE"])) {
        echo "Цена: " . $arProps["PRICE"]["VALUE"] . "<br>";
    }

    // Вы можете перебрать все свойства:
    foreach ($arProps as $propCode => $arProp) {
        echo "Свойство {$propCode}: " . $arProp["VALUE"] . "<br>";
    }
}
?>

Здесь мы видим, что, используя метод GetNextElement(), мы можем отдельно получить поля (GetFields()) и свойства (GetProperties()) элемента, что во многих случаях упрощает их обработку.

2.3. SetUrlTemplates

Метод: SetUrlTemplates($strDetailPageURL, $strListPageURL = "", $strSectionPageURL = "")

С версии: 7.1.3

Описание: Позволяет задать шаблоны путей к элементам прямо из объекта результата выборки. Это может быть полезно, если вы хотите переопределить URL для детальной и списоковой страниц, а также для страниц разделов, не меняя глобальные настройки инфоблока.

Пример использования:

<?php
$arSelect = ["ID", "NAME", "DETAIL_PAGE_URL"];
$arFilter = ["IBLOCK_ID" => 5, "ACTIVE" => "Y"];
$rsElements = CIBlockElement::GetList([], $arFilter, false, false, $arSelect);

// Устанавливаем собственные шаблоны путей
$rsElements->SetUrlTemplates("/catalog/detail.php?ID=#ELEMENT_ID#", "/catalog/list.php", "/catalog/section.php?SECTION_ID=#SECTION_ID#");

while ($arItem = $rsElements->GetNext()) {
    echo "<p>";
    echo "ID элемента: " . $arItem["ID"] . "<br>";
    echo "Название: " . $arItem["NAME"] . "<br>";
    // DETAIL_PAGE_URL теперь будет формироваться по вашему шаблону
    echo "Ссылка на детальную страницу: " . $arItem["DETAIL_PAGE_URL"] . "<br>";
    echo "</p>";
}
?>

Таким образом, вы можете динамически влиять на то, как будет формироваться URL-адрес для каждого элемента прямо во время итерации по результатам.

2.4. SetSectionContext

Метод: SetSectionContext($arSection)

С версии: 7.1.3

Описание: Устанавливает контекст раздела для текущего объекта результата выборки, чтобы подставлять данные раздела в шаблоны путей. Это особенно актуально, когда нужно правильно формировать URL элементов, учитывая структуру разделов: к примеру, если элементы лежат в разных разделах и каждому разделу соответствует своя часть URL.

Пример использования:

<?php
// Допустим, мы заранее получили массив данных о разделе
$arSection = [
    "ID" => 10,
    "CODE" => "phones",
    "IBLOCK_ID" => 5
];

$arSelect = ["ID", "NAME", "DETAIL_PAGE_URL"];
$arFilter = ["IBLOCK_ID" => 5, "ACTIVE" => "Y", "SECTION_ID" => $arSection["ID"]];
$rsElements = CIBlockElement::GetList([], $arFilter, false, false, $arSelect);

// Устанавливаем контекст конкретного раздела
$rsElements->SetSectionContext($arSection);
// Также можем указать шаблон пути для элементов
$rsElements->SetUrlTemplates("/catalog/#SECTION_CODE#/#ELEMENT_CODE#.php");

while ($arItem = $rsElements->GetNext()) {
    echo "<p>";
    echo "ID элемента: " . $arItem["ID"] . "<br>";
    echo "Название: " . $arItem["NAME"] . "<br>";
    echo "URL: " . $arItem["DETAIL_PAGE_URL"] . "<br>";
    echo "</p>";
}
?>

Благодаря этому при формировании DETAIL_PAGE_URL система будет учитывать поля раздела (например, #SECTION_CODE#), и каждый элемент будет иметь правильную структуру ссылки.

3. Резюме

Класс CIBlockResult даёт разработчикам 1С-Битрикс удобный инструментарий для:

  1. Построчной обработки результатов выборки, благодаря методам GetNext() и GetNextElement().
  2. Получения полей и свойств отдельных элементов и их гибкого отображения.
  3. Настройки URL-шаблонов при формировании ссылок на элементы и разделы, не затрагивая глобальных параметров инфоблока.
  4. Удобного учета контекста раздела при необходимости формировать «человеко-понятные» ссылки и структуру каталога.

Используя методы SetUrlTemplates и SetSectionContext, вы можете корректно подставлять параметры разделов и инфоблоков в формируемые пути, что позволяет создавать удобную и логичную структуру URL на сайте.

В целом, CIBlockResult дополняет классический функционал CDBResult, позволяя точечно влиять на отображение и обработку элементов инфоблока. Разработчики, регулярно работающие с каталогами и контентом, по достоинству оценят эту гибкость, когда нужно вывести данные о товарах, услугах или других материалах информационных блоков в требуемом формате.

Используйте методы класса CIBlockResult там, где важна детальная постобработка данных, и ваша работа с элементами ИБ станет более предсказуемой, гибкой и управляемой.

---

Надеемся, что данное руководство по CIBlockResult поможет вам быстрее ориентироваться в методах класса и эффективно решать задачи по выводу элементов инфоблока на сайте. Удачной разработки!

Теги:  руководство

Интернет-магазин от 120 000 руб., срок от 4 недель

Платформа для продажи товаров или услуг. Включает интерактивные формы обратной связи в каждой карточке товара, а также множество статичных и динамичных разделов.

Корпоративный сайт от 60 000 руб., срок от 3 недель

Готовый информационный ресурс, включающий лицензию на 1С-Битрикс «Стандарт», технологию «Композитный сайт».

Лендинг от 25 000 руб., срок от 2 недель

Компактный сайт, идеально подходящий для старта. На одной странице можно представить ключевые преимущества вашей компании и разместить форму для обратной связи.