GetNextElement() или GetNext() — какой метод выбрать при работе с инфоблоками

Внимание! Все сообщения на форуме проходят модерацию. Ваше сообщение появится после проверки.
GetNextElement() или GetNext() — какой метод выбрать при работе с инфоблоками

При разработке на 1С-Битрикс один из частых вопросов — какой метод использовать для обхода результатов выборки из инфоблока: GetNext() или GetNextElement()?
Быстрый пример из реального проекта.
Это код в component.php кастомного компонента. Пользователь попадает на него со своими текущими координатами и нужно показать рестораны с координатами в квадрате 5 на 5 км. Где центр это местоположение пользователя:
Код
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
// TODO: все важные настройки уедут в options /local/modules/edavmig.mobileapp
use Bitrix\Main\Loader;
use Bitrix\Main\Config\Option;
// use Bitrix\Main\Engine\CurrentUser;


if (
    !Loader::includeModule('iblock') ||
    !Loader::includeModule('highloadblock')
) {
    return;
}

// PARAMS - позже уедут в параметры компонента
$arParams['IBLOCK_ID'] = 4;               // Рестораны
$arParams['HL_FOR_ATT_FOOD_TYPE'] = 7;    // HL-блок Категории кухни
$arParams['FIND_REST_RADIUS'] = 5;        // Радиус поиска ресторанов
$arParams['YANDEX_MAP_API_KEY'] = trim(
    Option::get("fileman", "yandex_map_api_key")
);

// RESULTS
$arResult['RESTAURANTS'] = [];
$arResult['FILTER'] = [
    '=IBLOCK_ID' => $arParams['IBLOCK_ID'], // Рестораны
];

// Проверяем наличие координат в $_REQUEST
if (
    isset($_REQUEST['LAT'], $_REQUEST['LON']) &&
    $_REQUEST['LAT'] !== '' && $_REQUEST['LON'] !== ''
) {
    /*
        Если пришли с координатами в $_REQUEST, находим
        все рестораны, которые находятся в квадрате FIND_REST_RADIUS×FIND_REST_RADIUS км
        с центром в точке $_REQUEST['LAT'] и $_REQUEST['LON'].
    */
    $userLat = (float) $_REQUEST['LAT'];
    $userLon = (float) $_REQUEST['LON'];
    $squareSize = (float) $arParams['FIND_REST_RADIUS'];
    // Вычисляем границы квадрата (1 градус широты ≈ 111 км)
    $latDelta = $squareSize / 111;
    $lonDelta = $squareSize / (111 * cos(deg2rad($userLat)));
    // Применяем в фильтре, находим только рестораны внутри квадрата
    $arResult['FILTER']['><PROPERTY_LAT'] = [$userLat - $latDelta, $userLat + $latDelta];
    $arResult['FILTER']['><PROPERTY_LON'] = [$userLon - $lonDelta, $userLon + $lonDelta];
}

// Формируем рестораны =================================================================
$arFoodTypesFromHl = []; // Сборщик типов кухни для дальнейшего запроса в HL

$Restorants = CIBlockElement::GetList(
    ['NAME' => 'ASC'], // Сортировка по названию
    $arResult['FILTER'],
    false,
    false,
    ['ID', 'NAME', 'DETAIL_PAGE_URL', 'PREVIEW_TEXT', 'PROPERTY_*']
);

while ($obRestaurant = $Restorants->GetNextElement()) {
    $arFields = $obRestaurant->GetFields();
    $arProps = $obRestaurant->GetProperties();

    // Объединяем поля и свойства
    $arResult['RESTAURANTS'][$arFields['ID']] = $arFields;
    $arResult['RESTAURANTS'][$arFields['ID']]['PROPERTIES'] = $arProps;

    // Формирование категорий для использования в фильтре
    if (!empty($arProps['ATT_FOOD_TYPE']['VALUE']) && is_array($arProps['ATT_FOOD_TYPE']['VALUE'])) {
        foreach ($arProps['ATT_FOOD_TYPE']['VALUE'] as $foodTypeXmlId) {
            $arFoodTypesFromHl[] = $foodTypeXmlId;
        }
    }
}
// end Формируем рестораны ============================================================

/*
    Формирование фильтра "Тип кухни" из HL-блока
    UF_XML_ID содержится в свойстве-справочнике у ресторанов
*/
$arResult['FOOD_TYPES_FILTER'] = [];
$arFoodTypesFromHl = array_unique($arFoodTypesFromHl);

// Делаем запрос к HL только если есть что выбирать
if (!empty($arFoodTypesFromHl)) {
    $hlBlock = Bitrix\Highloadblock\HighloadBlockTable::getById(
        $arParams['HL_FOR_ATT_FOOD_TYPE']
    )->fetch();
    if ($hlBlock) {
        $entityDataClass = Bitrix\Highloadblock\HighloadBlockTable::compileEntity($hlBlock)->getDataClass();
        $arResult['FOOD_TYPES_FILTER'] = $entityDataClass::getList([
            'filter' => [
                'UF_XML_ID' => $arFoodTypesFromHl
            ],
            'select' => [
                'UF_NAME',
                'UF_XML_ID',
                'UF_FILE'
            ]
        ])->fetchAll();
    }
}
// end Формирование фильтра "Тип кухни" из HL-блока =======================================

$this->IncludeComponentTemplate();

У ресторанов очень много свойств и постоянно появляются новые (проект в активной стадии разработки) - постоянно отслеживать новые свойства, вообще не с руки. С помощью GetNextElement() я уверен что они автоматом попадут в выборку
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
Загрузить файлы
 

Стоимость разработки на 1С-Битрикс:

Индивидуальная разработка магазина

от 500 000 руб. от 5-ти недель

Разработка магазина на 1С-Битрикс с нуля. Дизайн, сборка и оптимизация производительности под конкретный проект и требования. Реализация любого функционала без ограничений готовых решений.

Запуск сайта на готовом решении

от 150 000 руб. от 7-ми дней

Вариант для тех, кто не хочет тратить много средств на индивидуальный проект, и не имеет серьезных требований к сайту. Магазин, быстро запускается на базе одного из 200-та готовых решений.

Мобильное приложение

от 400 000 руб. от 5-ти недель

Разработка кроссплатформенного мобильного приложения, которое не уступает нативным решениям как в производительности, так и пользовательском опыте. Публикуется в AppStore, GooglePlay и RuStore

Сайт компании

от 300 000 руб. от 2-х недель

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

Инфоресурс

от 300 000 руб. от 4-х недель

Информационный ресурс любой сложности. Сайт для СМИ, городской портал или многопользовательская доска объявлений. Внутренние форумы, блоги- по необходимости.

3D‑моделирование, визуализация

от 25 000 руб. от 3-х дней

По вашим фото, чертежам или описанию создадим 3D‑модели и отрендерим набор изображений для каталога товаров: общий вид, крупные планы и технические ракурсы или 360°‑обзор товара.