Как вывести информацию о товаре из нескольких инфоблоков по ID: практическое решение на 1С-Битрикс

В работе интернет-магазина нередко возникает ситуация, когда карточки товаров распределены по разным инфоблокам (например, «Одежда», «Обувь», «Аксессуары»). При этом на витрину попадает только один параметр — ID товара. Ниже вы найдёте готовый PHP-код, который ищет элемент сразу в трёх инфоблоках, а затем выводит всю информацию о нём и его свойствах. Сразу после кода подробно разберём, что здесь происходит, и какие есть варианты улучшений.

Как вывести товар из нескольких инфоблоков по ID

Задача: На страницу приходит ID товара ($_REQUEST["CODE"]), который может быть в одном из 3 инфоблоков. Необходимо получить всю информацию о нем.

Решение:

<?php

/** Подключаем модуль «Информационные блоки» (D7-стиль) */
\Bitrix\Main\Loader::includeModule('iblock');

/** Безопасно приводим входящий параметр к целому числу */
$code = (int)($_REQUEST['CODE'] ?? 0);

if ($code <= 0)
{
    ShowError('Неверный ID товара.');
    return;
}

/** Перечень интересующих нас инфоблоков */
$iblockIds = [7, 10, 5];

/** Массив, куда сложим данные найденного элемента */
$productData = [];

/** Перебираем инфоблоки в заданном порядке */
foreach ($iblockIds as $iblockId)
{
    /**
     * SELECT — какие поля берём;
     * FILTER — условия выборки;
     * LIMIT 1 — быстрее, чем break после Fetch().
     */
    $res = CIBlockElement::GetList(
        [],
        [
            'ID'         => $code,
            'IBLOCK_ID'  => $iblockId,
            'ACTIVE'     => 'Y',
            'CHECK_PERMISSIONS' => 'N',   // если нужен обход прав
        ],
        false,
        ['nTopCount' => 1],
        [
            'ID',
            'IBLOCK_ID',
            'NAME',
            'DETAIL_TEXT',
            'DETAIL_PICTURE',
            'DATE_ACTIVE_FROM',
            'PROPERTY_*',                 // забираем все свойства
        ]
    );

    if ($item = $res->Fetch())
    {
        /** Основные поля элемента */
        $productData = [
            'ID'            => (int)$item['ID'],
            'IBLOCK_ID'     => (int)$item['IBLOCK_ID'],
            'NAME'          => $item['NAME'],
            'DETAIL_TEXT'   => $item['DETAIL_TEXT'],
            'DETAIL_PICTURE'=> $item['DETAIL_PICTURE'],
            'DATE_ACTIVE_FROM'=> $item['DATE_ACTIVE_FROM'],
            'PROPERTIES'    => [],
        ];

        /** Получаем свойства элемента отдельно: так надёжнее */
        $propIterator = CIBlockElement::GetProperty(
            $item['IBLOCK_ID'],
            $item['ID'],
            ['sort' => 'asc', 'id' => 'asc'],
            []
        );

        while ($prop = $propIterator->Fetch())
        {
            // Для множественных свойств собираем массив значений
            if ($prop['MULTIPLE'] == 'Y')
            {
                $productData['PROPERTIES'][$prop['CODE']][] = $prop['VALUE'];
            }
            else
            {
                $productData['PROPERTIES'][$prop['CODE']] = $prop['VALUE'];
            }
        }

        break; // найдено — прерываем цикл
    }
}

/** Рендер результата */
if ($productData)
{
    echo '<h1>'.$productData['NAME'].'</h1>';

    // Картинка
    if ($productData['DETAIL_PICTURE'])
    {
        $img = CFile::GetPath($productData['DETAIL_PICTURE']);
        echo '<img src="'.$img.'" alt="'.htmlspecialcharsbx($productData['NAME']).'" style="max-width:300px;">';
    }

    // Описание
    echo '<p>'.$productData['DETAIL_TEXT'].'</p>';

    // Свойства
    if (!empty($productData['PROPERTIES']))
    {
        echo '<h2>Характеристики</h2><ul>';
        foreach ($productData['PROPERTIES'] as $code => $value)
        {
            if (is_array($value))              // множественное свойство
                $value = implode(', ', $value);

            echo '<li><strong>'.$code.':</strong> '.htmlspecialcharsbx($value).'</li>';
        }
        echo '</ul>';
    }
}
else
{
    ShowError('Товар не найден в заданных инфоблоках.');
}
?>

Пояснения к коду

1. Подключение модуля

\Bitrix\Main\Loader::includeModule('iblock');

D7-способ подключения гарантирует, что класс CIBlockElement и остальные сущности доступны.

2. Безопасная обработка входящего параметра

Мы приводим $_REQUEST['CODE'] к целому числу через (int), отсекая неверный ввод и XSS-атаки.

3. Перечень инфоблоков

$iblockIds = [7, 10, 5];

Очерёдность важна: скрипт остановится на первом же совпадении. Если порядок приоритетов другой — меняйте массив.

4. CIBlockElement::GetList

  • FILTER ищет элемент с конкретным ID в текущем инфоблоке.
  • nTopCount => 1 ограничивает выборку одним элементом, что ускоряет запрос.
  • PROPERTY_* тянет ID всех свойств, но сами значения мы берём отдельным запросом через GetProperty(). Это даёт больше контроля (например, сортировка свойств).

5. Сохранение свойств

Множественные свойства собираются в массив:

if ($prop['MULTIPLE'] == 'Y') {
    $productData['PROPERTIES'][$prop['CODE']][] = $prop['VALUE'];
}

В итоге структура $productData всегда одинакова, что облегчает вывод.

6. Вывод результата

  • Заголовок H1 — имя товара.
  • Изображение — через CFile::GetPath.
  • Описание — поле DETAIL_TEXT.
  • Свойства — список <ul> с читаемыми именами.

7. Обработка ошибки

Если элемент не найден ни в одном инфоблоке, выводим системную функцию ShowError() — в битриксовых шаблонах она оформляет сообщение в фирменном стиле.

Что можно улучшить

Улучшение Зачем
Кеширование (\Bitrix\Main\Data\Cache) Снять нагрузку с базы при большом трафике.
D7-ORM (\Bitrix\Iblock\Elements\Element…) Современный подход, меньше ошибок, IDE-подсветка.
Произвольные поля (UF_*) Если часть свойств повторяется во всех инфоблоках, выносите их в HL-блок.
E-Tag / Last-Modified Дадите браузеру кэшировать карточки и сократите время отклика.
ЧПУ-URL Если товар найден в инфоблоке 10, делайте редирект на ЧПУ с привязкой к каталогу.

Итоги

Мы реализовали универсальный скрипт, который:

  1. Принимает ID товара из запроса.
  2. Последовательно ищет этот ID в трёх инфоблоках.
  3. Если находит, выводит полную карточку: название, картинку, описание и все свойства.
  4. Работает строго в рамках ядра 1С-Битрикс и легко расширяется под любые задачи.

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

Теги:  PHP, инфоблоки, ID товара, разработка, интернет-магазин


Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Лечение сайтов от вирусов

восстановление сайта и подъем версии PHP

от 25 000 рублей
Лечение сайтов на решениях АСПРО и прочих.

* полный комплекс лечения проекта и закрытия дыр

Техническая поддержка

выполняется с сайтами на основе любых CMS

от 5 000 рублей
Оптимизация производительности действующих интернет-проектов, наполнение и сопровождение, полная техническая поддержка и продвижение в поисковых сетях.

* стоимость зависит от объема и сложности выполняемых работ, используемой CMS.

Лендинг

от 3 дней

от 25 000 рублей

Разработка одностраничного сайта на платформе Битрикс

* стоимость зависит от наличия верстки, использования готового решения и т.д.