Руководство по использованию метода Fetch() в 1С-Битрикс

В 1С-Битрикс часто возникает необходимость получать данные из базы (например, при выборке пользователей, элементов инфоблоков, заказов и т. д.). Работая на уровне низкоуровневых функций, вы неизбежно столкнётесь с классом CDBResult, метод которого Fetch() позволяет итеративно извлекать строки результата запроса. В этой статье мы разберём, как правильно использовать метод Fetch(), в каких случаях он полезен и приведём примеры кода.

Руководство по использованию метода Fetch() в 1С-Битрикс

Что такое CDBResult::Fetch()?

Метод CDBResult::Fetch():

  • Делает выборку значений текущей строки результата SQL-запроса в ассоциативный массив формата ["поле"=>"значение", …].
  • Передвигает внутренний «указатель» (или «курсор») результата запроса на следующую запись.
  • Возвращает false, если достигнут конец результата или если данных нет совсем.

Важно понимать, что Fetch() является нестатическим методом (т. е. вызывается из конкретного объекта результата).

Когда использовать Fetch()

В основном метод Fetch() применяется в случаях, когда вам нужно построчно обрабатывать результат некоторого SQL-запроса или системной выборки, сделанной средствами 1С-Битрикс. Например:

  • При написании собственных компонентов, где вы сами напрямую отправляете запрос к базе через API Битрикс (например, CIBlockElement::GetList(), CUser::GetList() и т. д.).
  • При обработке выборки объектов в скриптах миграции или интеграции с внешними системами.
  • При создании административных страниц (handlers, ajax-скрипты), требующих гибкой кастомизации запроса.

Если же вы используете высокоуровневые API-функции 1С-Битрикс, которые возвращают уже готовые массивы или объекты, то вызов Fetch() может быть вам не нужен. Но при тонкой работе с данными непосредственно через «низкоуровневые» объекты класса CDBResult без Fetch() не обойтись.

Общая схема работы

Алгоритм работы с методом Fetch() можно описать так:

  1. Получить объект результата типа CDBResult, например, вызвав метод GetList() или другой метод, который формирует запрос.
  2. В цикле while последовательно вызывать Fetch(), пока он не вернёт false.
  3. Внутри цикла обрабатывать полученный ассоциативный массив по строкам.

На практике это выглядит так:


// Допустим, мы делаем выборку пользователей
$rsUsers = CUser::GetList(
    ($by = "ID"),
    ($order = "ASC"),
    ["ACTIVE" => "Y"], // Фильтр: только активные пользователи
    ["SELECT" => ["UF_*"]] // Дополнительные поля, если есть пользовательские
);

// Объект $rsUsers — это CDBResult
while ($arUser = $rsUsers->Fetch()) {
    // $arUser — ассоциативный массив с полями текущего пользователя
    echo "ID пользователя: " . $arUser["ID"] . "<br>";
    echo "Логин: " . $arUser["LOGIN"] . "<br>";
    echo "Email: " . $arUser["EMAIL"] . "<br>";

    // Если нужно вывести данные о пользовательских полях
    // echo "Доп. поле UF_CITY: " . $arUser["UF_CITY"] . "<br>";

    echo "<hr>";
}
    

В этом примере:

  • CUser::GetList() возвращает объект типа CDBResult.
  • В цикле while ($arUser = $rsUsers->Fetch()) { … } мы проходим по всем строкам результата (по всем найденным пользователям) до тех пор, пока метод Fetch() не вернёт false.

Пример с выборкой элементов инфоблока

Для инфоблоков 1С-Битрикс есть свой класс CIBlockElement, метод GetList которого тоже возвращает объект результата. Пример:


$arSelect = ["ID", "NAME", "IBLOCK_ID"];
$arFilter = [
    "IBLOCK_ID" => 10,
    "ACTIVE"    => "Y"
];
$res = CIBlockElement::GetList(
    ["SORT" => "ASC"], // Сортируем по полю SORT
    $arFilter,
    false,            // Группировка
    false,            // Постраничная навигация
    $arSelect
);

while ($arElem = $res->Fetch()) {
    // $arElem — это массив, содержащий ID и NAME текущего элемента
    echo "ID: " . $arElem["ID"] . ", Название: " . $arElem["NAME"] . "<br>";
}
    

Здесь всё аналогично:

  1. Отправили запрос к инфоблоку с нужным фильтром и сортировкой.
  2. Получили объект результата $res типа CDBResult.
  3. В цикле while последовательно выводим ID и NAME каждого элемента.

Возврат false

Метод Fetch() вернёт false в двух основных случаях:

  1. Когда выборка полностью исчерпана (достигнут конец «списка»).
  2. Когда результат запроса изначально пуст (нет ни одной строки).

Это очень удобно для организации циклов: пока есть данные — обрабатываем, как только Fetch() вернул false, выходим из цикла.

Частые ошибки и рекомендации

  1. Вы не видите результата, а метод Fetch() всегда возвращает false:
    • Проверьте, действительно ли в базе имеются соответствующие записи с учётом фильтров.
    • Убедитесь, что вы используете правильные поля в $arFilter.
    • Убедитесь, что не перепутали названия полей (например, неверно указали UF_* поля).
  2. Дублируете вызов Fetch() вне цикла:
    • При однократном вызове Fetch() «курсор» результата сдвигается на следующую запись, и при повторном вызове в цикле вы начинаете не с первой записи, а со второй.
    • Помните, что Fetch() всегда сдвигает «курсор»; если вам требуется несколько раз обойти данные, используйте методы типа Reset() или заново формируйте объект результата.
  3. Проблемы с закодированными именами полей:
    • В некоторых случаях вместо привычных NAME, ID и т. д. поля могут иметь префиксы или иные ключи (например, при JOIN-запросах). Всегда проверяйте структуру результата массива.
  4. Не учитываете пагинацию (nPageSize) или группировку:
    • Если в метод GetList() для инфоблока или пользователей вы передаёте параметры пагинации (например, ["nPageSize" => 10]), то результат будет содержать только часть данных на текущей странице. Аналогично с параметром группировки (если используется).

Дополнительные возможности

Хотя основной смысл Fetch() — это построчное извлечение данных, в 1С-Битрикс также есть ряд вспомогательных методов и настроек:

  • SelectedRowsCount() — возвращает общее количество найденных строк (не всегда работает для сложных запросов, но часто полезен).
  • Метод GetNext() — похож на Fetch(), но автоматически форматирует некоторые поля (например, ссылки на изображения) для удобства.
  • Учет прав доступа — если вы используете высокоуровневые методы (например, CIBlockElement::GetList()), то «из коробки» можно автоматически проверять права (для инфоблоков: параметр CHECK_PERMISSIONS).

Заключение

Метод CDBResult::Fetch() — незаменимый инструмент при работе с данными на низком уровне в 1С-Битрикс. С его помощью вы можете итерировать по результатам запросов построчно, что даёт тонкий контроль над обработкой данных. Вот основные советы по работе:

  1. Используйте while-цикл, чтобы последовательно извлекать все строки до тех пор, пока метод не вернёт false.
  2. Следите за корректностью фильтров, чтобы не сталкиваться с пустыми результатами там, где вы их не ожидаете.
  3. Старайтесь не вызывать Fetch() до цикла (если не подразумевается специальная логика), чтобы не «пропустить» часть результатов.
  4. Учитывайте параметры сортировки, фильтрации, группировки и пагинации (если они есть), чтобы иметь полную картину по загружаемым данным.

При правильном использовании Fetch() ваш код будет гибким, а результат — предсказуемым и удобным для дальнейшей обработки.

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

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

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

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

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

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

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