В 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() ваш код будет гибким, а результат — предсказуемым и удобным для дальнейшей обработки.