В этой статье разберём пример выгрузки товаров из каталога Битрикс в JSON. Рассмотрим ключевые моменты, возможные сложности и способы оптимизации.
Исходный код выгрузки
<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
CModule::IncludeModule("iblock");
CModule::IncludeModule("catalog");
header('Content-Type: application/json');
$filePath = ($_SERVER['HTTPS']) ? 'https' : 'http';
$IBLOCK_ID = 14;
$userGroup = [2];
$quantity = 1;
$renewal = 'N';
$arResult = [];
// Получаем все разделы заранее для оптимизации
$sections = [];
$resSections = CIBlockSection::GetList(
[],
['IBLOCK_ID' => $IBLOCK_ID],
false,
['ID', 'NAME']
);
while ($section = $resSections->GetNext()) {
$sections[$section['ID']] = $section['NAME'];
}
// Получаем товары
$res = CIBlockElement::GetList(
["ID" => "ASC"],
["IBLOCK_ID" => $IBLOCK_ID, "ACTIVE" => "Y"],
false,
false,
['ID', 'NAME', 'DETAIL_PICTURE', 'PREVIEW_TEXT', 'DETAIL_TEXT', 'IBLOCK_SECTION_ID']
);
while ($arItem = $res->GetNext()) {
// Категория из предзагруженного массива
$category = $sections[$arItem['IBLOCK_SECTION_ID']] ?? '';
// Получаем цену
$productID = $arItem['ID'];
$arPrice = CCatalogProduct::GetOptimalPrice($productID, $quantity, $userGroup, $renewal);
$item = [
'id' => $arItem['ID'],
'name' => trim($arItem['NAME']),
'jpg_url' => $filePath . '://' . $_SERVER['SERVER_NAME'] . CFile::GetPath($arItem['DETAIL_PICTURE']),
'description' => $arItem['DETAIL_TEXT'] ?: $arItem['PREVIEW_TEXT'],
'categories' => $category,
'categories_id' => $arItem['IBLOCK_SECTION_ID'],
'nominal' => $arPrice['RESULT_PRICE']['DISCOUNT_PRICE'],
'discount' => $arPrice['RESULT_PRICE']['DISCOUNT'],
];
$arResult[] = $item;
}
echo json_encode($arResult, JSON_UNESCAPED_UNICODE); Ключевые моменты и оптимизация
Предварительная загрузка разделов
Вместо запроса CIBlockSection::GetByID на каждой итерации, мы один раз получаем все разделы и сохраняем в массив $sections. Это ускоряет работу скрипта.
Оптимальный расчёт цены
Используем CCatalogProduct::GetOptimalPrice, который автоматически учитывает скидки и типы цен.
Корректный Content-Type
Обязательно указываем header('Content-Type: application/json'), чтобы браузер правильно интерпретировал ответ.
Возможные улучшения
Добавление SKU (торговых предложений) – можно доработать выборку.
Кеширование результата – если каталог большой, лучше сохранять JSON в файл и обновлять по крону.
Пагинация – если товаров много, стоит добавить постраничную выгрузку.
Заключение
Этот код позволяет быстро выгрузить каталог Битрикс в JSON. Для больших магазинов важно оптимизировать запросы и минимизировать нагрузку на сервер.