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

Задача: На страницу приходит 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, делайте редирект на ЧПУ с привязкой к каталогу. |
Итоги
Мы реализовали универсальный скрипт, который:
- Принимает ID товара из запроса.
- Последовательно ищет этот ID в трёх инфоблоках.
- Если находит, выводит полную карточку: название, картинку, описание и все свойства.
- Работает строго в рамках ядра 1С-Битрикс и легко расширяется под любые задачи.
Такой подход особенно полезен, когда исторически товары оказались распределены по разным инфоблокам, но вы хотите сохранить единый URL-шаблон и не плодить дублирующий код. Надеюсь, решение пригодится вам в проектах и позволит сосредоточиться на развитии функционала, а не на рутине поиска элементов.