Вывести торговые предложения (SKU) как простые товары в каталоге, с учетом раздела.

Внимание! Все сообщения на форуме проходят модерацию. Ваше сообщение появится после проверки.
Вывести торговые предложения (SKU) как простые товары в каталоге, с учетом раздела.

Задача: Отобразить SKU товаров в каталоге как простые товары, учитывая текущий раздел. Необходимо вывести все торговые предложения (варианты, комплектации) для товаров, находящихся в текущем разделе каталога.
Лучше всего вынести всю описанную логику в отдельный компонент со своим классом и просто подключить в section.php

Чтобы сделать класс (например подключаемый из /vendor).
Код
<?php
namespace Ваш\namespace\если делаем модулем;

use Bitrix\Catalog\CatalogIblockTable;
use Bitrix\Iblock\IblockTable;
use Bitrix\Iblock\ElementTable;
use CCatalogSku;
use Bitrix\Iblock\SectionTable;

class IblockDataFetcher // или наследуемся от CBitrixComponent если делаем свой компонент
{
    protected $iblockId;
    protected $cacheTime;

    public function __construct($iblockId, $cacheTime)
    {
        $this->iblockId = $iblockId;
        $this->cacheTime = $cacheTime;
    }

    // Получить ID инфоблока SKU, принадлежащего каталогу
    public function getSkuIblockId()
    {
        $result = CatalogIblockTable::getList([
            'filter' => ['PRODUCT_IBLOCK_ID' => $this->iblockId],
            'select' => ['IBLOCK_ID'],
            'cache' => ['ttl' => $this->cacheTime],
        ])->fetch();

        return $result ? $result['IBLOCK_ID'] : null;
    }

    // Получить информацию об инфоблоке по ID
    public function getIblockInfo($iblockId)
    {
        return IblockTable::getList([
            'filter' => ['ID' => $iblockId],
            'select' => ['*'], // Можно урезать
            'cache' => ['ttl' => $this->cacheTime],
        ])->fetch();
    }

    // Получить текущий раздел
    public function getCurrentSectionId($sectionVariable)
    {
        return CIBlockFindTools::GetSectionID(
            $sectionVariable['SECTION_ID'],
            $sectionVariable['SECTION_CODE'],
            ['IBLOCK_ID' => $this->iblockId]
        );
    }

    // Получить список элементов текущего раздела
    public function getElementsInSection($sectionId)
    {
        return ElementTable::getList([
            'filter' => [
                'IBLOCK_ID' => $this->iblockId,
                'IBLOCK_SECTION_ID' => $sectionId,
            ],
            'select' => ['ID'],
            'cache' => ['ttl' => $this->cacheTime],
        ])->fetchAll();
    }

    // Получить предложения (SKU) для элемента
    public function getOffersForElement($elementId)
    {
        return CCatalogSku::getOffersList($elementId);
    }

    // Получить все предложения по списку элементов
    public function getAllOffers($elements)
    {
        $allOfferIds = [];
        foreach ($elements as $element) {
            $offers = $this->getOffersForElement($element['ID']);
            foreach ($offers as $offerGroup) {
                foreach ($offerGroup as $offer) {
                    $allOfferIds[] = $offer['ID'];
                }
            }
        }
        return $allOfferIds;
    }
}

Использование:
Код
// Использование класса в вашем основном файле
use App\IblockDataFetcher;

$fetcher = new IblockDataFetcher($arParams['IBLOCK_ID'], $arParams['CACHE_TIME']);

// Получаем ID инфоблока SKU
$skuIblockId = $fetcher->getSkuIblockId();

if ($skuIblockId) {
    // Получаем информацию об инфоблоке SKU
    $skuIblockInfo = $fetcher->getIblockInfo($skuIblockId);
}

// Получаем текущий раздел
$currentSectionId = $fetcher->getCurrentSectionId($arResult['VARIABLES']);

// Получаем элементы раздела
$listElements = $fetcher->getElementsInSection($currentSectionId);

// Получаем все предложения по элементам
$allOfferIds = $fetcher->getAllOffers($listElements);

// Передача в глобальный фильтр
$GLOBALS[$arParams["FILTER_NAME"]] = [
    'ID' => $allOfferIds,
];
Как решить противоположную задачу?
"Вывести простые товары как торговые предложения (SKU) в карточке товара с учетом товаров, подобранных на основе свойства "Похожие товары по фильтру" или на основе одного и того же значения специально созданного свойства (например, передаваемого  из 1С как доп реквизит)"
Если правильно понял задачу:

Для товаров, которые должны вывестись внутри другого товара, нужно создать допреквизит
Например "Связан с:" и в него передать некую уникальную строку - например артикул того "основного" товара.
Дальше, в "основном" товаре, фильтруем товары каталога у которого встречается его артикул.

Или от обратного. В основном товаре свойство "Связаные товары", и в него передавать артикулы связанных с ним товаров.
Например в виде
АРТИКУЛ123//АРТИКУЛ456//АРТИКУЛ667
Дальше разбрать эту строку на массив и, снова, фильтром найти все совпадения.
Первый вариант - он будет работать через обмен с 1С(УТ, Розница и тд). Спасибо.
Искал подобное готовое решение на маркетплейсе - безуспешно.
Когда возникает необходимость реализовать подобное, почему-то чаще выбирают по второму варианту.
Именно, потому что проще реализовать на стороне 1С - уж не знаю почему.
Всегда предлагаю оба и по первому ниразу не выбрали  :)
ИМХО вариант с выделенным допреквизитом для фильтра для отбора более универсален.

Только он должен содержать не ссылку на конкретный товар или его артикул, а объединительный признак, если таковой заполнен у товара, по нему будут отбираться товары для как "псевдо SKU" с совпадающим значением этого признака, с ограничением по разделу (или виду номеклатуры, что зачастую, совпадает).

Отбор свойств для формирования SKU из свойств товара может ограничиваться в свойстве или свойствах раздела (имхо по разделу будет проще в реализации, чем по виду номеклатуры).

P.S. Отправил запрос на оценку бюджета через "контакты".
P.P.S Вы, часом, не планируете создать такой апплет для маркетплейса битрикс?
Там у меня Б24 тупит. Вроде бы вижу запрос но прочитать не могу, на почту продублируйте.
Для маркетплейса не планирую, в целом с маркетплейсом не работаю как вендор. Гемморновато, в плане бюррократии.
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
Загрузить файлы
 

Стоимость разработки на 1С-Битрикс:

Индивидуальная разработка магазина

от 500 000 руб. от 5-ти недель

Разработка магазина на 1С-Битрикс с нуля. Дизайн, сборка и оптимизация производительности под конкретный проект и требования. Реализация любого функционала без ограничений готовых решений.

Запуск сайта на готовом решении

от 150 000 руб. от 7-ми дней

Вариант для тех, кто не хочет тратить много средств на индивидуальный проект, и не имеет серьезных требований к сайту. Магазин, быстро запускается на базе одного из 200-та готовых решений.

Мобильное приложение

от 400 000 руб. от 5-ти недель

Разработка кроссплатформенного мобильного приложения, которое не уступает нативным решениям как в производительности, так и пользовательском опыте. Публикуется в AppStore, GooglePlay и RuStore

Сайт компании

от 300 000 руб. от 2-х недель

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

Инфоресурс

от 300 000 руб. от 4-х недель

Информационный ресурс любой сложности. Сайт для СМИ, городской портал или многопользовательская доска объявлений. Внутренние форумы, блоги- по необходимости.

3D‑моделирование, визуализация

от 25 000 руб. от 3-х дней

По вашим фото, чертежам или описанию создадим 3D‑модели и отрендерим набор изображений для каталога товаров: общий вид, крупные планы и технические ракурсы или 360°‑обзор товара.