При разработке интернет-магазинов на 1С-Битрикс нередко возникает задача: вывести в разделе каталога не только товары текущего инфоблока, но и элементы другого инфоблока — например, услуги, товары «на аренду» или сопутствующие позиции.
В этой статье разберём практическое решение на примере шаблона АСПРО Максимум, которое корректно работает:
- когда в разделе есть товары;
- когда раздел полностью пуст;
- без вмешательства в ядро 1С-Битрикс;
- с управлением через настройки раздела.
Исходные данные
В проекте используются два инфоблока:
- Инфоблок «Продажа» — основной каталог товаров;
- Инфоблок «Аренда» — отдельный каталог арендных товаров.
Задача — в нужных разделах инфоблока «Продажа» выводить выбранные элементы из инфоблока «Аренда»:
- под основным списком товаров, если товары есть;
- вместо сообщения «Раздел пуст», если товаров нет.
Общая логика решения
- В разделе инфоблока «Продажа» создаётся пользовательское поле с привязкой к элементам инфоблока «Аренда».
- В шаблоне Aspro Max определяется, выбраны ли арендные товары.
- Если выбраны — выводится дополнительный блок с использованием стандартного шаблона каталога.
- Блок показывается как в пустом, так и в непустом разделе.
Важно: в нашем случае сообщение «Раздел пуст» формируется не в шаблоне catalog.section, а в родительском файле list_elements_1.php. Поэтому вся логика должна находиться именно там.
Шаг 1. Создание пользовательского поля у раздела
В административной части Битрикс:
В настройках раздела создаём дополнительное поле:
- Код поля:
UF_RENT_ITEMS - Тип: Привязка к элементам инфоблоков
- Инфоблок: «Аренда»
- Множественное: Да
Теперь для каждого раздела можно выбрать любые арендные товары.

Шаг 2. Где вносить изменения
Основной файл для правок:
/bitrix/templates/aspro_max/components/bitrix/catalog/main/page_blocks/list_elements_1.phpИменно здесь решение:
- подсчитывает количество товаров в разделе;
- решает, выводить товары или сообщение «Раздел пуст»;
- формирует структуру страницы.
Шаг 3. Код определения и вывода арендных товаров
Ниже приведён итоговый код. В нем необходимо указать ID инфоблока из которого выводить элементы.
<?php
$rentIblockId = 47; // ID инфоблока "Аренда"
$ufCode = 'UF_RENT_ITEMS';
$rentIds = [];
$bHasRent = false;
// Функция вывода блока аренды
$__renderRentBlock = function() use (&$rentIds, $rentIblockId, $arParams, $component, $APPLICATION) {
if (empty($rentIds)) {
return;
}
$GLOBALS['asproRentFilter'] = ['=ID' => $rentIds];
echo '<div class="rent-products-block">';
echo '<div class="main-title">Можно арендовать</div>';
$arRentParams = $arParams;
$arRentParams['IBLOCK_ID'] = $rentIblockId;
$arRentParams['IBLOCK_ID_PARENT'] = $rentIblockId;
$arRentParams['FILTER_NAME'] = 'asproRentFilter';
$arRentParams['SECTION_ID'] = '';
$arRentParams['SECTION_CODE'] = '';
$arRentParams['SECTION_CODE_PATH'] = '';
$arRentParams['INCLUDE_SUBSECTIONS'] = 'Y';
$arRentParams['PAGE_ELEMENT_COUNT'] = (string)count($rentIds);
$arRentParams['CACHE_FILTER'] = 'Y';
$arRentParams['SET_TITLE'] = 'N';
$arRentParams['SET_STATUS_404'] = 'N';
$arRentParams['SEF_FOLDER'] = '';
$arRentParams['USE_FILTER'] = 'N';
$arRentParams['SET_LAST_MODIFIED'] = 'N';
$rentDetailUrl = (string)CIBlock::GetArrayByID($rentIblockId, 'DETAIL_PAGE_URL');
$rentSectionUrl = (string)CIBlock::GetArrayByID($rentIblockId, 'SECTION_PAGE_URL');
if (!$rentDetailUrl) {
$rentDetailUrl = '/rent/#SECTION_CODE_PATH#/#ELEMENT_CODE#/';
}
if (!$rentSectionUrl) {
$rentSectionUrl = '/rent/#SECTION_CODE_PATH#/';
}
$arRentParams['DETAIL_URL'] = $rentDetailUrl;
$arRentParams['SECTION_URL'] = $rentSectionUrl;
$arRentParams['LIST_URL'] = $rentSectionUrl;
$APPLICATION->IncludeComponent(
'bitrix:catalog.section',
'catalog_block',
$arRentParams,
$component
);
echo '</div>';
};
// Получаем текущий раздел
if (\Bitrix\Main\Loader::includeModule('iblock')) {
global $USER_FIELD_MANAGER;
$currentSectionId = (int)($arResult['SECTION_ID'] ?? 0);
if ($currentSectionId > 0) {
$secRow = CIBlockSection::GetByID($currentSectionId)->Fetch();
$sectionIblockId = (int)($secRow['IBLOCK_ID'] ?? 0);
$entityId = $sectionIblockId ? 'IBLOCK_' . $sectionIblockId . '_SECTION' : '';
if ($entityId) {
$uf = $USER_FIELD_MANAGER->GetUserFields($entityId, $currentSectionId, LANGUAGE_ID);
if (!empty($uf[$ufCode]['VALUE'])) {
$rentIds = array_map('intval', (array)$uf[$ufCode]['VALUE']);
}
}
}
}
$bHasRent = !empty($rentIds);
?>Шаг 4. Вывод в непустом разделе
В ветке if($itemsCnt) (когда товары есть) добавляем вызов:
<?php if ($bHasRent) { $__renderRentBlock(); } ?>Лучше всего размещать этот вызов после основного списка товаров и пагинации.
Шаг 5. Вывод в пустом разделе
Стандартный блок «Раздел пуст» заменяем условием:
<?else:?>
<?if(!$iSectionsCount):?>
<?php
if ($bHasRent) {
$__renderRentBlock();
} else {
?>
<div class="no_goods">
<div class="no_products">
<div class="wrap_text_empty">
<?php $APPLICATION->IncludeFile(
SITE_DIR."include/section_no_products.php",
[],
["MODE" => "html"]
); ?>
</div>
</div>
</div>
<?php } ?>
<?endif;?>
<?endif;?>Результат
- Арендные товары добавляются через настройки раздела
- Корректно отображаются и в пустых, и в непустых разделах
- Нет дублирования логики и конфликтов шаблонов
Вывод
Такой подход позволяет аккуратно расширять каталог 1С-Битрикс, не смешивая инфоблоки и не ломая архитектуру шаблона. Решение легко масштабируется.


