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

Что такое CDBResult::Fetch()
?
Метод CDBResult::Fetch()
:
- Делает выборку значений текущей строки результата SQL-запроса в ассоциативный массив формата
["поле"=>"значение", …]
. - Передвигает внутренний «указатель» (или «курсор») результата запроса на следующую запись.
- Возвращает
false
, если достигнут конец результата или если данных нет совсем.
Важно понимать, что Fetch()
является нестатическим методом (т. е. вызывается из конкретного объекта результата).
Когда использовать Fetch()
В основном метод Fetch()
применяется в случаях, когда вам нужно построчно обрабатывать результат некоторого SQL-запроса или системной выборки, сделанной средствами 1С-Битрикс. Например:
- При написании собственных компонентов, где вы сами напрямую отправляете запрос к базе через API Битрикс (например,
CIBlockElement::GetList()
,CUser::GetList()
и т. д.). - При обработке выборки объектов в скриптах миграции или интеграции с внешними системами.
- При создании административных страниц (handlers, ajax-скрипты), требующих гибкой кастомизации запроса.
Если же вы используете высокоуровневые API-функции 1С-Битрикс, которые возвращают уже готовые массивы или объекты, то вызов Fetch()
может быть вам не нужен. Но при тонкой работе с данными непосредственно через «низкоуровневые» объекты класса CDBResult
без Fetch()
не обойтись.
Общая схема работы
Алгоритм работы с методом Fetch()
можно описать так:
- Получить объект результата типа
CDBResult
, например, вызвав методGetList()
или другой метод, который формирует запрос. - В цикле
while
последовательно вызыватьFetch()
, пока он не вернётfalse
. - Внутри цикла обрабатывать полученный ассоциативный массив по строкам.
На практике это выглядит так:
// Допустим, мы делаем выборку пользователей
$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>";
}
Здесь всё аналогично:
- Отправили запрос к инфоблоку с нужным фильтром и сортировкой.
- Получили объект результата
$res
типаCDBResult
. - В цикле
while
последовательно выводим ID и NAME каждого элемента.
Возврат false
Метод Fetch()
вернёт false
в двух основных случаях:
- Когда выборка полностью исчерпана (достигнут конец «списка»).
- Когда результат запроса изначально пуст (нет ни одной строки).
Это очень удобно для организации циклов: пока есть данные — обрабатываем, как только Fetch()
вернул false
, выходим из цикла.
Частые ошибки и рекомендации
- Вы не видите результата, а метод
Fetch()
всегда возвращаетfalse
:- Проверьте, действительно ли в базе имеются соответствующие записи с учётом фильтров.
- Убедитесь, что вы используете правильные поля в
$arFilter
. - Убедитесь, что не перепутали названия полей (например, неверно указали
UF_*
поля).
- Дублируете вызов
Fetch()
вне цикла:- При однократном вызове
Fetch()
«курсор» результата сдвигается на следующую запись, и при повторном вызове в цикле вы начинаете не с первой записи, а со второй. - Помните, что
Fetch()
всегда сдвигает «курсор»; если вам требуется несколько раз обойти данные, используйте методы типаReset()
или заново формируйте объект результата.
- При однократном вызове
- Проблемы с закодированными именами полей:
- В некоторых случаях вместо привычных
NAME
,ID
и т. д. поля могут иметь префиксы или иные ключи (например, при JOIN-запросах). Всегда проверяйте структуру результата массива.
- В некоторых случаях вместо привычных
- Не учитываете пагинацию (
nPageSize
) или группировку:- Если в метод
GetList()
для инфоблока или пользователей вы передаёте параметры пагинации (например,["nPageSize" => 10]
), то результат будет содержать только часть данных на текущей странице. Аналогично с параметром группировки (если используется).
- Если в метод
Дополнительные возможности
Хотя основной смысл Fetch()
— это построчное извлечение данных, в 1С-Битрикс также есть ряд вспомогательных методов и настроек:
SelectedRowsCount()
— возвращает общее количество найденных строк (не всегда работает для сложных запросов, но часто полезен).- Метод
GetNext()
— похож наFetch()
, но автоматически форматирует некоторые поля (например, ссылки на изображения) для удобства. - Учет прав доступа — если вы используете высокоуровневые методы (например,
CIBlockElement::GetList()
), то «из коробки» можно автоматически проверять права (для инфоблоков: параметрCHECK_PERMISSIONS
).
Заключение
Метод CDBResult::Fetch()
— незаменимый инструмент при работе с данными на низком уровне в 1С-Битрикс. С его помощью вы можете итерировать по результатам запросов построчно, что даёт тонкий контроль над обработкой данных. Вот основные советы по работе:
- Используйте
while
-цикл, чтобы последовательно извлекать все строки до тех пор, пока метод не вернётfalse
. - Следите за корректностью фильтров, чтобы не сталкиваться с пустыми результатами там, где вы их не ожидаете.
- Старайтесь не вызывать
Fetch()
до цикла (если не подразумевается специальная логика), чтобы не «пропустить» часть результатов. - Учитывайте параметры сортировки, фильтрации, группировки и пагинации (если они есть), чтобы иметь полную картину по загружаемым данным.
При правильном использовании Fetch()
ваш код будет гибким, а результат — предсказуемым и удобным для дальнейшей обработки.