Николаев Виталий
<Разработка сайтов>
|

Битрикс выгрузить все элементы вместе со свойствами в файл

Этот скрипт выгружает все элементы инфоблока в файл csv
<?php
use Bitrix\Main\Loader;

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

if (!Loader::includeModule("iblock")) {
    die("Модуль Инфоблоки не подключен");
}

$IBLOCK_ID = 55;
$FILE_PATH = $_SERVER["DOCUMENT_ROOT"] . "/upload/export_iblock_{$IBLOCK_ID}.csv";

// Получаем список всех свойств инфоблока
$arProps = [];
$rsProps = CIBlockProperty::GetList(
    ["SORT"=>"ASC"],
    ["IBLOCK_ID"=>$IBLOCK_ID, "ACTIVE"=>"Y"]
);
while ($arProp = $rsProps->Fetch()) {
    $arProps[$arProp["CODE"]] = $arProp;
}

// Заголовки для CSV: ID, NAME + все свойства
$headers = ["ID", "NAME"];
foreach ($arProps as $code => $prop) {
    $headers[] = $prop["CODE"];
}

$fp = fopen($FILE_PATH, "w");
fputcsv($fp, $headers, ";");

// Выбираем элементы инфоблока
$arSelect = ["ID", "IBLOCK_ID", "NAME"];
$arFilter = ["IBLOCK_ID" => $IBLOCK_ID, "ACTIVE" => "Y"];
$res = CIBlockElement::GetList(["ID"=>"ASC"], $arFilter, false, false, $arSelect);

while ($arItem = $res->GetNextElement()) {
    $fields = $arItem->GetFields();
    $props  = $arItem->GetProperties();

    $row = [$fields["ID"], $fields["NAME"]];

    foreach ($arProps as $code => $propInfo) {
        $value = $props[$code]["VALUE"];

        if (empty($value)) {
            $row[] = "";
            continue;
        }

        // Если свойство — файл (в том числе множественное)
        if ($propInfo["PROPERTY_TYPE"] === "F") {
            if (is_array($value)) {
                $filePaths = [];
                foreach ($value as $fileId) {
                    $filePath = CFile::GetPath($fileId);
                    if ($filePath) {
                        $filePaths[] = $filePath;
                    }
                }
                $row[] = implode(",", $filePaths);
            } else {
                $row[] = CFile::GetPath($value);
            }
        }
        // Если множественное свойство (строки, числа, списки и пр.)
        elseif ($propInfo["MULTIPLE"] === "Y" && is_array($value)) {
            $row[] = implode(",", $value);
        }
        // Обычное свойство
        else {
            $row[] = $value;
        }
    }

    fputcsv($fp, $row, ";");
}

fclose($fp);

echo "Экспорт завершен. Файл: ".$FILE_PATH;