В продолжение статьи в этой заметке речь пойдет о товарном каталоге Битрикс 24 и вариациях товаров.

В товарном каталоге Битрикс 24 есть 2 сущности товаров: простые товары и товары с вариациями.

Архитектура товарного каталога Битрикс 24...
...обнаруженная опытным путём

Простые товары имеют только название, описание, картинку, цену и т.д. Для покупателя они имеют одну цену и количество. Товары с вариациями имеют возможность указывать разные цены товара в зависимости от комбинации его атрибутов: цвет, размер, объём и т.д. Количество для каждой вариации товара тоже может быть разным.

Для хранения простых товаров и товаров с вариациями на самом деле используется 2 товарных каталога, один из которых в веб-интерфейсе CRM Битрикс 24 не виден. 

В веб-интерфейсе Битрикс 24 один товарный каталог
В веб-интерфейсе Битрикс 24 один товарный каталог

Если мы запрашиваем список товарных каталогов через метод crm.catalog.list (документация), то в ответе нам придёт информация о видимом товарном каталоге.

Array
(
    [result] => Array
        (
            [0] => Array
                (
                    [ID] => 24
                    [ORIGINATOR_ID] => 
                    [ORIGIN_ID] => 
                    [NAME] => Товарный каталог CRM
                    [XML_ID] => FUTURE-1C-CATALOG
                )

        )

    [total] => 1
    [time] => Array
        (
            [start] => 1671248836.1657
            [finish] => 1671248836.2086
            [duration] => 0.042879104614258
            [processing] => 0.007220983505249
            [date_start] => 2022-12-17T06:47:16+03:00
            [date_finish] => 2022-12-17T06:47:16+03:00
            [operating_reset_at] => 1671249436
            [operating] => 0
        )

)

Но если мы будем запрашивать список товарных каталогов через метод catalog.catalog.list (документация), то нам придёт информация уже об обоих каталогах.

Array
(
    [result] => Array
        (
            [catalogs] => Array
                (
                    [0] => Array
                        (
                            [iblockId] => 24
                            [iblockTypeId] => 0
                            [id] => 24
                            [name] => Товарный каталог CRM
                            [skuPropertyId] => 
                        )

                    [1] => Array
                        (
                            [iblockId] => 26
                            [iblockTypeId] => 0
                            [id] => 26
                            [name] => Товарный каталог CRM (предложения)
                            [skuPropertyId] => 102
                        )

                )

        )

    [total] => 2
    [time] => Array
        (
            [start] => 1671249092.3837
            [finish] => 1671249092.4254
            [duration] => 0.041728973388672
            [processing] => 0.0050361156463623
            [date_start] => 2022-12-17T06:51:32+03:00
            [date_finish] => 2022-12-17T06:51:32+03:00
            [operating_reset_at] => 1671249692
            [operating] => 0
        )

)

Если Ваш товар - товар с вариациями, то картинки, цены, остатки хранятся в товарном каталоге для вариаций товаров и получить их (на момент написания статьи) можно только оттуда. При создании нового товара с вариациями через веб-интерфейс товар добавляется в основной товарный каталог, а его вариации - в каталог с вариациями.

Товары в основном каталоге становятся своего рода товарами-контейнерами, в которых содержится лишь не изменяемая от вариации к вариации информация. 

Этот же подход наблюдается и в компоненте интернет-магазина JoomShopping на Joomla. В JoomShopping есть зависимые и независимые атрибуты товара. С помощью зависимых атрибутов мы указываем разные цены комбинациям атрибутов товара, а покупатель "снаружи" может покликать по ним и выбрать нужный вариант. При этом цена, указанная в атрибуте товара имеет приоритет над ценой собственно товара. В случае использования зависимых атрибутов основной товар JoomShopping становится таким же товаром-контейнером.

Как отличить простой товар Битрикс 24 от товара с варициями?

В веб-интерфейсе карточки товара есть кнопка "добавить вариацию". Если у Вас тип товара - простой товар и Вы попытаетесь создать вариацию, то получите следующее предупреждение.

 Предупреждение о невозможности создать вариацию товара для простого товара Битрикс 24
Предупреждение о невозможности создать вариацию товара для простого товара Битрикс 24

Единственным визуальным отличием, которое удалось найти - это наличие меню-бургера около вариации товара. В простом товаре этого меню нет.

Товары с вариациями имеют меню бургер в веб интерфейсе битрикс 24
Товары с вариациями имеют меню-бургер в веб интерфейсе битрикс 24.

Однако, в ноябре 2022 года на портале одного из клиентов было замечено, что Битрикс 24 постепенно отказывается от использования простых товаров. при создании новых товаров. Даже товар, который выглядит как товар без вариаций на самом деле структурно является товаром с одной единственной вариацией.

При этом id товаров в этих двух товарных каталогах, естественно, разные. Значит на стороне интернет-магазина, в таблице связей нужно хранить не только id товара-контейнера из основного каталога, но и id единственной вариации товара.

Получить цены и остатки вариаций товара Битрикс 24 по API

Для получения цен и остатков вариаций товаров по REST API Битрикс 24 нужно выполнить те же запросы, что и для простых товаров (как описывалось в статье, но указывать уже id вариации товара и iblockId товарного каталога для вариаций товара (с предложениями).

Получить список вариаций конкретного товара Битрикс 24 по API

Для этого мы выполняем запрос к методу catalog.product.list с нужными фильтрами.

$b24_parent_product_id = 126; //id товара-контейнера из основного каталога
			$request_options = [
				'select' => [
					'id', 'iblockId', 'name', 'detailPicture', 'price', 'quantity', 'xmlId'
				],
				'filter' => [
					'iblockId' => 26 // id товарного каталога с предложениями из метода catalog.catalog.list
				],
				'start'  => $product_pagination_start
			];

			if($b24_parent_product_id){
				$request_options['filter']['parentId'] = $b24_parent_product_id;
			}

			$resultBitrix24 = CRest::call("catalog.product.list", $request_options);

 В целом алгоритм следующий:

  1. Получаем заранее iblockId каталогов для товаров и товарных предложений.
  2. Получаем товар (если нужно) из каталога товаров.
  3. Получаем список вариаций по parentId из каталога товарных предложений (в ответе есть количество товара)
  4. Получаем цену по каждой вариации товара. 

Расширения Joomla WebTolk

78 Всего расширений
11 Категорий
331 Выпущено версий
310164 Всего скачиваний
Корзина
Корзина пуста