Проблема множественных полей в 1с битрикс

В базе есть товары вида "Ящик 2 - 12 ячеек". Вместо адекватного разбиения на 11 товаров сделали 1 товар с подписью. Пришел я и нужно как-то автоматизировать процесс подсчета. Для подсчета используются данные из базы, наиболее важными являются объем и вес. Я попробовал использовать множественные поля, как решение, ожидая, что в выводе информации я буду получать 2 массива. 1 - весов, 2й - объемов.

введите сюда описание изображения

Однако на выход я лишь получил перемножение вариантов. То есть мне вывелось 11*11 комбинаций.

Покажу лишь часть

введите сюда описание изображения

Для вывода из php использую такой код:

$arSort = array("SORT" => "ASC", "NAME" => "ASC");
$arFilter = array("IBLOCK_ID" => $IBLOCK_ID, "ACTIVE" => "Y");
$arSelect = array("ID", "NAME", "PROPERTY_FILTER_PRICE", "PROPERTY_PR_VES","PROPERTY_PROD_VOLUME" , "DETAIL_PICTURE", "DETAIL_TEXT");
$obIBlockResult = CIBlockElement::GetList($arSort, $arFilter, false, false, $arSelect);

$data = array();
while ($arFields = $obIBlockResult->GetNext()) {
    $data[] = $arFields;
}


if (isset($_GET['ELEMENT_ID'])) {
    $elementId = intval($_GET["ELEMENT_ID"]);
    $obIBlockResult = CIBlockElement::GetByID($elementId);

    if ($obIBlockResult && $obIBlockResult->SelectedElement()) {
        $result = [];
        while ($ob = $obIBlockResult->GetNextElement()) {
            $arFields = $ob->GetFields();
            $arProps = $ob->GetProperties();
            $result[] = $arProps;
        }
        echo json_encode($result);
    } else {
        http_response_code(404);
        echo "Элемент не найден";
    }
}

Вот js

$("#chooseProduct").on("change.select2", function (e) {
            var selectedId = e.target.value;
            var selectedElement = null;
            var elements = <?= json_encode($data) ?>;

            console.log(elements) // Именно на этом этапе мне выводит 121 элемент
            $('#product-image').css('display', 'flex');

            $('#product-image').html(' <div class="circle"></div> <div class="circle" style = "animation-delay: 0.5s;"> </div> <div class="circle" style="animation-delay: 1s;"></div>');

            for (var i = 0; i < elements.length; i++) {
                if (elements[i].ID === selectedId) {
                    selectedElement = elements[i];
                    break;
                }
            }

            $.ajax({
                url: "?DETAIL_IMAGE=" + selectedElement.DETAIL_PICTURE,
                success: function (pictureUrl) {
                    if (pictureUrl) {
                        $('#product-image').html('');
                        $('#product-image').css('display', 'inline');
                        $('<img>').attr('src', pictureUrl).attr('width', '400').attr('height', '400').appendTo('#product-image');
                        $('<div class="production-description">')
                            .html(selectedElement.DETAIL_TEXT)
                            .appendTo('#product-image');
                        $("#window").show()
                    } else {
                        $('#product-image').html('');
                    }
                }
            });

            $('.money-count').text(`${selectedElement.PROPERTY_FILTER_PRICE_VALUE} рублей`);
            updateTotalPrice();
            window.selectedElement = selectedElement
        })
        ;


        function setPriceFields(product) {
            $(".money-count").textContent = product.price
            $(".total-money-count").textContent = product.price * product.count
        }

        function addProductToList() {
            let counter = $('#count')[0];
            let product = {}
            console.log(selectedElement)
            product.name = selectedElement.NAME;
            product.priceForOne = parseFloat(selectedElement.PROPERTY_FILTER_PRICE_VALUE)
            product.params = []
            product.params.push(["Вес", selectedElement.PROPERTY_PR_VES_VALUE])
            product.weight = parseFloat(selectedElement.PROPERTY_PR_VES_VALUE) * counter.value;
            product.volume = parseFloat(selectedElement.PROPERTY_PROD_VOLUME_VALUE) * counter.value;
            product.count = parseInt(counter.value)
            product.priceForAll = parseFloat(product.priceForOne * product.count)

            console.log(product)
            counter.value = 1
            window.products.push(product)
            $("#product-image").hide()
            clearPriceFields()
            clearFirstSelect()

            $(".button-container").show();
            $(".adding_info").show();
        }

Ответы (1 шт):

Автор решения: Konstantin Likhachev

Как вариант делаете

$iblockClass = \Bitrix\Iblock\Iblock::wakeUp($IBLOCK_ID)->getEntityDataClass();
$items = $iblockClass::getList([
  "order"  => ["SORT" => "ASC", "NAME" => "ASC"],
  "filter" => ["ACTIVE" => "Y"],
  "select" => ["ID", "NAME", "FILTER_PRICE", "PR_VES","PROD_VOLUME" , "DETAIL_PICTURE", "DETAIL_TEXT"]
]);

Затем в цикле через fetchObject получаете данные

$data = [];
while ($item = $items->fetchObject()) {
  $data[] = [
    "ID"             => $item->getId(),
    "NAME"           => $item->getName(),
    "DETAIL_PICTURE" => $item->getDetailPicture(),
    "DETAIL_TEXT"    => $item->getDetailText(),
    "PR_VES"         => array_map(static function ($value) {
        return $value->getValue();
    }, $item->get("PR_VES")?->getAll()),
    "PROD_VOLUME"    => array_map(static function ($value) {
        return $value->getValue();
    }, $item->get("PROD_VOLUME")?->getAll()),
  ];
}
→ Ссылка