Как вывести инфоблок и подкаталоги древовидным списком с скачиванием файлов в Битрикс?

Чтобы вывести инфоблок и его подкаталоги в виде древовидного списка с возможностью скачивания файлов в Битрикс, вам потребуется использовать некоторые функции API 1C-Bitrix.

Шаг 1: Получение данных об инфоблоках и подкаталогах
Для начала вам нужно получить данные об инфоблоке и его подкаталогах. Для этого можно воспользоваться функцией CIBlock::GetList(). Пример кода:

$arResult = array();

$iblock_type = 'catalog'; // тут укажите свой тип инфоблока
$iblock_id = 1; // тут укажите ID своего инфоблока

$arFilter = array(
    'TYPE' => $iblock_type,
    'ID' => $iblock_id
);

$dbIblock = CIBlock::GetList(array(), $arFilter);
if ($arIblock = $dbIblock->Fetch()) {
    $arResult['IBLOCK'] = $arIblock;
    
    // Получаем подкаталоги инфоблока
    $arFilter = array(
        'TYPE' => $iblock_type,
        'IBLOCK_ID' => $iblock_id,
        'DEPTH_LEVEL' => 2 // указываем глубину вложенности подкаталогов
    );

    $dbSections = CIBlockSection::GetList(array('LEFT_MARGIN' => 'ASC'), $arFilter, true, array('ID', 'NAME', 'IBLOCK_SECTION_ID'));
    while ($arSection = $dbSections->Fetch()) {
        $arResult['SECTIONS'][$arSection['ID']] = $arSection;
    }
}

Шаг 2: Вывод списка инфоблока и подкаталогов в виде дерева
Следующим шагом нужно вывести полученные данные в виде древовидного списка. Для этого можно воспользоваться рекурсивной функцией, которая будет обходить подкаталоги и выводить их. Пример кода:

function showSections($sections, $depth = 1) {
    foreach ($sections as $section) {
        echo str_repeat('  ', $depth) . $section['NAME'] . '<br>';
        
        // Если в разделе есть файлы, выводим их
        $arFilter = array(
            'IBLOCK_ID' => $section['IBLOCK_ID'],
            'SECTION_ID' => $section['ID'],
            'ACTIVE' => 'Y'
        );

        $dbElements = CIBlockElement::GetList(array(), $arFilter, false, array('ID', 'NAME', 'PROPERTY_FILE'));
        while ($arElement = $dbElements->Fetch()) {
            $file_arr = CFile::GetFileArray($arElement['PROPERTY_FILE_VALUE']);
            $file_url = $file_arr['SRC'];
            echo str_repeat('  ', $depth + 1) . '<a href="' . $file_url . '" target="_blank" rel="noopener">' . $arElement['NAME'] . '</a><br>';
        }
        
        // Если в разделе есть дочерние подразделы, вызываем функцию рекурсивно
        if (isset($section['CHILDREN'])) {
            showSections($section['CHILDREN'], $depth + 1);
        }
    }
}

// Вызываем функцию вывода списка
showSections($arResult['SECTIONS']);

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