Схема работы торгового каталога и основные объекты

Модуль Торговый каталог расширяет элементы инфоблоков товарными данными. Инфоблок хранит контентную часть товара: название, разделы, свойства, изображения и адреса страниц. Модуль catalog хранит данные, которые участвуют в продаже: тип товара, цены, остатки, единицы измерения, НДС, складские документы и подписки на появление товара.

Используйте ORM-классы и API модуля catalog, чтобы корзина, заказы, скидки и складской учет получали согласованные данные.

О том, как устроены информационные блоки, читайте в статье Схема работы инфоблоков и основные объекты.

API модуля

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

Подробнее об API модуля читайте в статье Как выбрать API торгового каталога.

Основные пространства имен модуля

Для работы с данными каталога через ORM используйте классы из пространства имен Bitrix\Catalog.

use Bitrix\Catalog\CatalogIblockTable; // Настройки каталога для инфоблока
        use Bitrix\Catalog\ProductTable; // Товарные параметры
        use Bitrix\Catalog\PriceTable; // Цены
        use Bitrix\Catalog\GroupTable; // Типы цен
        use Bitrix\Catalog\VatTable; // Ставки НДС
        use Bitrix\Catalog\MeasureTable; // Единицы измерения
        use Bitrix\Catalog\MeasureRatioTable; // Коэффициенты единиц измерения
        use Bitrix\Catalog\StoreTable; // Склады
        use Bitrix\Catalog\StoreProductTable; // Остатки на складах
        use Bitrix\Catalog\StoreDocumentTable; // Складские документы
        use Bitrix\Catalog\StoreDocumentElementTable; // Строки складских документов
        use Bitrix\Catalog\SubscribeTable; // Подписки на появление товара
        use Bitrix\Catalog\CatalogViewedProductTable; // История просмотров товаров
        

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

Дополнительные ORM-классы

Кроме основных классов, в модуле есть ORM-классы для связанных данных: прав, наценок, округления цен, складского учета и документов. Они не образуют базовую схему товара, но помогают получить или изменить данные, связанные с каталогом.

use Bitrix\Catalog\GroupLangTable; // Названия типов цен по языкам
        use Bitrix\Catalog\GroupAccessTable; // Права групп пользователей на просмотр и покупку по типам цен
        use Bitrix\Catalog\ExtraTable; // Наценки
        use Bitrix\Catalog\RoundingTable; // Правила округления цен
        use Bitrix\Catalog\ProductGroupAccessTable; // Продажа прав доступа к контенту
        use Bitrix\Catalog\ContractorTable; // Контрагенты складских документов
        use Bitrix\Catalog\StoreBarcodeTable; // Штрихкоды товаров на складах
        use Bitrix\Catalog\StoreDocumentBarcodeTable; // Штрихкоды в строках складских документов
        use Bitrix\Catalog\StoreBatchTable; // Партии складского учета
        use Bitrix\Catalog\StoreBatchDocumentElementTable; // Связь партий со строками документов
        use Bitrix\Catalog\StoreDocumentFileTable; // Файлы складских документов
        use Bitrix\Catalog\SubscribeAccessTable; // Данные для аутентификации подписавшихся без регистрации пользователей
        

Карты ORM-классов

Каждый ORM-класс содержит метод getMap(). Он возвращает описание структуры таблицы: поля, типы полей, связи с другими объектами и правила валидации. Система использует карту класса для следующих задач:

  • строит SQL-запросы,

  • преобразует данные между PHP и базой данных,

  • проверяет типы данных при сохранении,

  • организует связи между таблицами.

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

Пример фрагмента результата getMap() для ProductTable:

Array
        (
            [ID] => Bitrix\Main\Entity\IntegerField Object
                (
                    [name:protected] => ID
                    [is_primary:protected] => 1
                )
        
            [QUANTITY] => Bitrix\Main\Entity\FloatField Object
                (
                    [name:protected] => QUANTITY
                    [default_value:protected] => 0
                )
        
            [QUANTITY_TRACE] => Bitrix\Main\Entity\EnumField Object
                (
                    [name:protected] => QUANTITY_TRACE
                    [values:protected] => Array
                        (
                            [0] => D
                            [1] => N
                            [2] => Y
                        )
                )
        
            [IBLOCK_ELEMENT] => Bitrix\Main\Entity\ReferenceField Object
                (
                    [name:protected] => IBLOCK_ELEMENT
                    [reference:protected] => Array
                        (
                            [=this.ID] => ref.ID
                        )
                )
        )
        

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

Каталог и инфоблоки

Класс Bitrix\Catalog\CatalogIblockTable хранит настройки каталога для инфоблока. Основной ключ записи — IBLOCK_ID, идентификатор инфоблока.

Поле

Тип данных

Описание

IBLOCK_ID*

int

Идентификатор инфоблока, который подключен к торговому каталогу

YANDEX_EXPORT

bool

Флаг экспорта каталога. Возможные значения:

  • Y — экспорт включен
  • N — экспорт выключен

Значение по умолчанию — N

SUBSCRIPTION

bool

Флаг подписки на появление товаров в каталоге. Возможные значения:

  • Y — подписка включена
  • N — подписка выключена

Значение по умолчанию — N

VAT_ID

int

Идентификатор ставки НДС из VatTable.
Значение по умолчанию — 0

PRODUCT_IBLOCK_ID

int

Идентификатор инфоблока товаров для инфоблока торговых предложений. Значение 0 означает, что инфоблок не привязан как инфоблок предложений

SKU_PROPERTY_ID

int

Идентификатор свойства, которое связывает торговое предложение с родительским товаром. Значение 0 означает, что свойство привязки не задано

Класс CCatalogSku определяет тип каталога по связи настроек в CatalogIblockTable.

Тип

Значение

Описание

TYPE_CATALOG

D

Инфоблок является самостоятельным каталогом без торговых предложений

TYPE_PRODUCT

P

Инфоблок является инфоблоком товаров, для которого есть отдельный инфоблок торговых предложений

TYPE_OFFERS

O

Инфоблок является инфоблоком торговых предложений

TYPE_FULL

X

Инфоблок одновременно является каталогом и инфоблоком товаров для предложений

Как устроен каталог

Каталог строится вокруг инфоблока. Класс CatalogIblockTable подключает инфоблок к модулю catalog и задает настройки каталога. Если каталог использует торговые предложения, он связывает инфоблок предложений с инфоблоком товаров через поля PRODUCT_IBLOCK_ID и SKU_PROPERTY_ID.

Элемент инфоблока становится товаром, когда для него появляются товарные параметры в ProductTable. Значение ID в ProductTable совпадает с ID элемента инфоблока. Через этот ключ модуль связывает товар с ценами, коэффициентами единиц измерения, остатками на складах, строками складских документов и подписками.

Инфоблок товаров
          ElementTable
                |
                | ID элемента = ID товара
                v
          ProductTable
                |
                +— PriceTable             цены товара
                +— MeasureRatioTable      коэффициенты единицы измерения
                +— StoreProductTable      остатки по складам
                +— SubscribeTable         подписки на появление в продаже
        
        Инфоблок торговых предложений
          ElementTable
                |
                | свойство SKU ссылается на товар
                v
          ProductTable
        

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

Жизненный цикл товара

Схема подготовки товара к продаже состоит из нескольких шагов:

  1. В инфоблоке создается элемент. На этом этапе у элемента есть контентные данные: название, описание, свойства, разделы и изображения.

  2. Для элемента создаются товарные параметры в ProductTable. После этого элемент становится товаром для модуля catalog.

  3. Для товара добавляют цены через PriceTable, единицу измерения через MeasureTable и коэффициенты продажи через MeasureRatioTable.

  4. Если товар учитывается на складах, остатки ведут через StoreProductTable и складские документы.

  5. Если у товара есть варианты, родительский элемент становится товарной карточкой, а продаваемыми позициями становятся торговые предложения.

Тип в поле ProductTable::TYPE показывает роль записи в каталоге. ProductTable::TYPE_EMPTY_SKU используется для родительского товара, у которого еще нет предложений. Когда предложения появляются, родительский товар получает ProductTable::TYPE_SKU, а элементы инфоблока предложений получают ProductTable::TYPE_OFFER.

Для обычного товара корзина работает с ID этого товара. Для товара с торговыми предложениями корзина должна получать ID выбранного предложения.

Торговые предложения

Чтобы продавать товары с торговыми предложениями, используют два инфоблока. Инфоблок товаров хранит родительские элементы, а инфоблок предложений хранит варианты товара. Связь между ними задает свойство SKU: его идентификатор хранится в SKU_PROPERTY_ID, а инфоблок родительских товаров — в PRODUCT_IBLOCK_ID.

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

В коде каталога тип записи показывает роль элемента.

Тип

Роль в каталоге

Как участвует в продаже

ProductTable::TYPE_PRODUCT

Обычный товар без торговых предложений.

Может быть самостоятельной позицией корзины

ProductTable::TYPE_SKU

Родительский товар с торговыми предложениями.

Группирует предложения. Обычно покупатель выбирает не родительский товар, а конкретное предложение

ProductTable::TYPE_EMPTY_SKU

Родительский товар, для которого предложения еще не созданы.

Нужен для промежуточного служебного состояния карточки товара

ProductTable::TYPE_OFFER

Торговое предложение, привязанное к родительскому товару.

Может быть самостоятельной позицией корзины

ProductTable::TYPE_FREE_OFFER

Торговое предложение без родительского товара.

Используется как предложение без связи с товарной карточкой

ProductTable::TYPE_SET

Комплект.

Продается как составной товар из нескольких позиций

ProductTable::TYPE_SERVICE

Услуга.

Передается в корзину как услуга

При добавлении в корзину класс Bitrix\Catalog\Product\Basket проверяет родительские товары TYPE_SKU и TYPE_EMPTY_SKU. Если не включен режим совместимости show_catalog_tab_with_offers, такие товары нельзя добавить в корзину напрямую: покупатель должен выбрать торговое предложение.

Пересчет торговых предложений

Класс Bitrix\Catalog\Product\Sku отвечает за состояние родительского товара с предложениями. Метод getOfferState() определяет одно из состояний:

Состояние

Что означает

Sku::OFFERS_ERROR

Данные товара или инфоблока некорректны

Sku::OFFERS_NOT_EXIST

У товара нет предложений

Sku::OFFERS_NOT_AVAILABLE

Предложения есть, но среди них нет доступных к покупке

Sku::OFFERS_AVAILABLE

Есть предложения, доступные к покупке

Метод getDefaultParentSettings() по этому состоянию подбирает тип родительского товара, доступность и правила учета количества. Например, если доступных предложений нет, родительский товар получает статус недоступного. Если есть доступные предложения, родительский товар остается типом TYPE_SKU и получает доступность Y.

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

  • enableDeferredCalculation() включает режим, в котором накапливаются задачи для пересчета. После этого методы подготовки не запускают пересчет сразу. Метод используют перед массовым изменением товаров или предложений.

  • disableDeferredCalculation() выключает режим, в котором накапливаются задачи для пересчета. Метод не пересчитывает данные. Его используют после массового изменения, перед запуском calculate().

  • calculateComplete($id, $iblockId = null, $type = null) добавляет товар или предложение в очередь полного пересчета. Полный пересчет обновляет доступность родительского товара и цены. Если отложенный режим не включен, метод сразу запускает calculate(). Метод используют, когда изменились данные предложения, которые влияют на доступность или состояние родительского товара.

  • calculatePrice($id, $iblockId = null, $type = null, array $priceTypes = []) добавляет товар или предложение в очередь пересчета цен родительского товара. Если список $priceTypes пустой, пересчитываются все типы цен. Если отложенный режим не включен, метод сразу запускает calculate(). Метод используют, когда изменились только цены предложений.

  • calculate() выполняет накопленные задачи: определяет родительские товары для предложений, пересчитывает их доступность и цены, обновляет связанные данные элемента. Метод используют после завершения массовой операции. Также он запускается автоматически из calculateComplete() и calculatePrice(), если отложенный режим не включен.

Товарные параметры

Класс Bitrix\Catalog\ProductTable хранит товарную часть элемента инфоблока: тип, количество, правила учета остатков, доступность, НДС, вес, габариты и единицу измерения.

Поле

Тип данных

Описание

ID*

int

Идентификатор товара. Совпадает с ID элемента инфоблока

QUANTITY

float

Общее количество товара. Значение по умолчанию — 0

QUANTITY_TRACE

enum

Управляет учетом количества. Возможные значения:

  • Y — учитывать остаток
  • N — не учитывать остаток
  • D — брать значение из настроек модуля

Значение по умолчанию — D

CAN_BUY_ZERO

enum

Разрешает покупку при нулевом или отрицательном остатке. Возможные значения:

  • Y — разрешить покупку при нулевом или отрицательном остатке
  • N — запретить покупку при нулевом или отрицательном остатке
  • D — брать значение из настроек модуля

Значение по умолчанию — D

NEGATIVE_AMOUNT_TRACE

enum

Управляет разрешением отрицательного остатка. Возможные значения:

  • Y — разрешить отрицательный остаток
  • N — запретить отрицательный остаток
  • D — брать значение из настроек модуля

Значение по умолчанию — D

QUANTITY_RESERVED

float

Зарезервированное количество товара

TIMESTAMP_X

datetime

Дата и время последнего изменения товарной записи. Значение по умолчанию — текущее время

PRICE_TYPE

enum

Тип оплаты для товара. Возможные значения:

  • S — разовая оплата
  • R — регулярная оплата
  • T — пробный период

Значение по умолчанию — S

RECUR_SCHEME_LENGTH

int

Длина периода для регулярной оплаты или пробного периода. Значение по умолчанию — 0

RECUR_SCHEME_TYPE

enum

Единица периода для регулярной оплаты или пробного периода. Возможные значения:

  • H — час
  • D — день
  • W — неделя
  • M — месяц
  • Q — квартал
  • S — полугодие
  • Y — год

Значение по умолчанию — D

TRIAL_PRICE_ID

int

Идентификатор товара, который используется как пробный период для регулярной оплаты

WITHOUT_ORDER

bool

Флаг товара без оформления заказа. Возможные значения:

  • Y — товар можно использовать без заказа
  • N — товар требует заказ

Значение по умолчанию — N

SELECT_BEST_PRICE

bool

Флаг выбора лучшей цены. Возможные значения:

  • Y — выбирать лучшую цену
  • N — не выбирать лучшую цену

Значение по умолчанию — Y

SUBSCRIBE

enum

Управляет подпиской на появление товара. Возможные значения:

  • Y — разрешить подписку
  • N — запретить подписку
  • D — брать значение из настроек модуля

Значение по умолчанию — D

AVAILABLE

bool

Флаг доступности товара для покупки. Возможные значения:

  • Y — товар доступен
  • N — товар недоступен

TYPE

enum

Тип товарной записи. Используйте константы ProductTable::TYPE_*

VAT_ID

int

Идентификатор ставки НДС

VAT_INCLUDED

bool

Показывает, включен ли НДС в цену товара. Возможные значения:

  • Y — НДС включен в цену
  • N — НДС не включен в цену

Значение по умолчанию — N

TMP_ID

string(40)

Временный идентификатор. Используется служебными сценариями импорта и обработки товаров

WEIGHT

float

Вес товара. Значение по умолчанию — 0

BARCODE_MULTI

bool

Флаг нескольких штрихкодов у товара. Возможные значения:

  • Y — у товара может быть несколько штрихкодов
  • N — у товара один штрихкод

Значение по умолчанию — N

WIDTH, LENGTH, HEIGHT

float

Габариты товара

MEASURE

int

Идентификатор единицы измерения из MeasureTable

PURCHASING_PRICE

float

Закупочная цена

PURCHASING_CURRENCY

string(3)

Валюта закупочной цены

BUNDLE

bool

Флаг комплекта. Возможные значения:

  • Y — товар является комплектом
  • N — товар не является комплектом

Тип товара

Тип товара задает роль записи в каталоге.

Константа

Значение

Описание

ProductTable::TYPE_PRODUCT

1

Обычный товар

ProductTable::TYPE_SET

2

Комплект

ProductTable::TYPE_SKU

3

Родительский товар с торговыми предложениями

ProductTable::TYPE_OFFER

4

Торговое предложение

ProductTable::TYPE_FREE_OFFER

5

Торговое предложение без родительского товара

ProductTable::TYPE_EMPTY_SKU

6

Родительский товар без предложений

ProductTable::TYPE_SERVICE

7

Услуга

Если у товара еще нет предложений, модуль может использовать тип TYPE_EMPTY_SKU. Когда появляются предложения, родительский товар получает тип TYPE_SKU, а элементы инфоблока предложений получают тип TYPE_OFFER.

Доступность и покупка

Значение D в полях QUANTITY_TRACE, CAN_BUY_ZERO, NEGATIVE_AMOUNT_TRACE и SUBSCRIBE означает Использовать настройку модуля. На эти поля влияют настройки модуля Торговый каталог:

  • учитывать количество товара при продаже,

  • разрешить покупку при отсутствии товара,

  • разрешить отрицательное количество товара,

  • разрешить подписку на товары, которых нет на складе.

ProductTable подставляет эти значения перед расчетом доступности и правил покупки. Доступность рассчитывается по полям QUANTITY, QUANTITY_TRACE и CAN_BUY_ZERO. Если количество меньше или равно нулю, учет остатков включен и покупка при нуле запрещена, товар получает значение AVAILABLE = 'N'. В остальных случаях товар доступен и получает AVAILABLE = 'Y'.

Поле NEGATIVE_AMOUNT_TRACE управляет разрешением отрицательного остатка, а SUBSCRIBE — подпиской на появление товара. Эти поля не заменяют AVAILABLE, но участвуют в правилах продажи и уведомлений.

Для родительских товаров с предложениями доступность пересчитывает Bitrix\Catalog\Product\Sku. Если среди активных предложений есть доступное, родительский товар может получить AVAILABLE = 'Y'. Если доступных предложений нет, родительский товар становится недоступным для покупки как группа предложений.

Цены и типы цен

Класс Bitrix\Catalog\PriceTable хранит цены товаров и торговых предложений. Одна запись цены относится к товару или торговому предложению, типу цены и валюте.

Поле

Тип данных

Описание

ID*

int

Идентификатор цены

PRODUCT_ID*

int

Идентификатор товара или торгового предложения. Совпадает с ID элемента инфоблока и ID товарной записи в ProductTable

EXTRA_ID

int

Идентификатор наценки из ExtraTable

CATALOG_GROUP_ID*

int

Идентификатор типа цены из GroupTable

PRICE*

float

Значение цены

CURRENCY*

string(3)

Валюта цены

TIMESTAMP_X

datetime

Дата и время последнего изменения цены.
Значение по умолчанию — текущее время

QUANTITY_FROM

int

Нижняя граница количества для диапазонной цены

QUANTITY_TO

int

Верхняя граница количества для диапазонной цены

TMP_ID

string(40)

Временный идентификатор. Используется служебными сценариями импорта и обработки цен

PRICE_SCALE*

float

Цена в базовой валюте для внутренних расчетов и сортировки

Типы цен

Класс Bitrix\Catalog\GroupTable хранит типы цен.

Поле

Тип данных

Описание

ID*

int

Идентификатор типа цены

NAME*

string(100)

Внутреннее название типа цены

BASE

bool

Флаг базового типа цены. Возможные значения:

  • Y — базовый тип цены
  • N — не базовый тип цены

SORT

int

Порядок сортировки типа цены

XML_ID

string(255)

Внешний идентификатор типа цены

TIMESTAMP_X

datetime

Дата и время последнего изменения типа цены.
Значение по умолчанию — текущее время

MODIFIED_BY

int

Идентификатор пользователя, который изменил тип цены

DATE_CREATE

datetime

Дата и время создания типа цены.
Значение по умолчанию — текущее время

CREATED_BY

int

Идентификатор пользователя, который создал тип цены

Выбор цены

Для одного товара можно хранить несколько цен. Разные записи отличаются типом цены CATALOG_GROUP_ID, валютой и диапазоном количества QUANTITY_FROMQUANTITY_TO.

Тип цены задает группу цен, например, базовую, розничную или оптовую. Поле BASE = 'Y' в GroupTable отмечает базовый тип цены. Метод GroupTable::getBasePriceType() возвращает базовый тип цены, если он есть.

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

Не используйте PRICE_SCALE как исходную цену товара. При добавлении и изменении цены API пересчитывает PRICE_SCALE по PRICE, CURRENCY и текущему курсу валюты, если значение не передано явно. Обработчик Bitrix\Catalog\Product\Price::handlerAfterUpdateCurrencyBaseRate() обновляет PRICE_SCALE при изменении базового курса валюты.

При выборе цены важны три условия:

  1. Идентификатор PRODUCT_ID должен указывать на товар или торговое предложение, которое покупатель добавляет в корзину.

  2. Идентификатор CATALOG_GROUP_ID должен соответствовать доступному типу цены.

  3. Количество в корзине должно попадать в диапазон QUANTITY_FROMQUANTITY_TO, если для цены задан диапазон.

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

Создавайте цены для товара или торгового предложения через API каталога, чтобы тип цены, валюта и пересчитанная цена PRICE_SCALE оставались согласованными.

Доступность типов цен

Тип цены может быть доступен не всем группам пользователей. Класс GroupAccessTable связывает тип цены с группой пользователей и уровнем доступа:

  • GroupAccessTable::ACCESS_VIEW — группа может видеть цены этого типа,

  • GroupAccessTable::ACCESS_BUY — группа может покупать товары по ценам этого типа.

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

Ставки НДС

Класс Bitrix\Catalog\VatTable работает со ставками НДС. Товар ссылается на ставку через поле VAT_ID, а поле VAT_INCLUDED показывает, включен ли НДС в цену.

Поле

Тип данных

Описание

ID*

int

Идентификатор ставки НДС

TIMESTAMP_X

datetime

Дата и время последнего изменения ставки НДС.
Значение по умолчанию — текущее время

ACTIVE

bool

Флаг активности ставки. Возможные значения:

  • Y — ставка активна
  • N — ставка не активна

Значение по умолчанию — Y

SORT

int

Порядок сортировки ставки НДС.
Значение по умолчанию — 100

NAME*

string(50)

Название ставки

RATE

float

Значение ставки в процентах

EXCLUDE_VAT

bool

Флаг системной ставки для исключения НДС. Возможные значения:

  • Y — ставка исключает НДС
  • N — обычная ставка НДС

Для записи с EXCLUDE_VAT = 'Y' поле RATE хранится как NULL.
Значение по умолчанию — N

XML_ID

string(255)

Внешний идентификатор ставки

Единицы измерения

Класс Bitrix\Catalog\MeasureTable хранит единицы измерения, а Bitrix\Catalog\MeasureRatioTable хранит коэффициенты. Товар ссылается на единицу измерения через поле MEASURE.

Поле

Тип данных

Описание

ID*

int

Идентификатор единицы измерения

CODE*

int

Код единицы измерения

MEASURE_TITLE

string(500)

Полное название единицы измерения

SYMBOL

string(20)

Краткое обозначение единицы измерения. В ORM-карте поле связано с внутренним полем SYMBOL_RUS

SYMBOL_INTL

string(20)

Международное обозначение единицы измерения

SYMBOL_LETTER_INTL

string(20)

Международное буквенное обозначение единицы измерения

IS_DEFAULT

bool

Флаг единицы измерения по умолчанию. Возможные значения:

  • Y — единица используется по умолчанию
  • N — единица не используется по умолчанию

Значение по умолчанию — N

Коэффициенты единиц измерения

Класс Bitrix\Catalog\MeasureRatioTable работает с коэффициентами единиц измерения. Коэффициент задает кратность продажи для товара.

Поле

Тип данных

Описание

ID*

int

Идентификатор коэффициента

PRODUCT_ID*

int

Идентификатор товара или торгового предложения

RATIO*

float

Коэффициент единицы измерения. Метод MeasureRatioTable::getCurrentRatio() возвращает коэффициент по умолчанию, а если он не найден, использует 1

IS_DEFAULT

bool

Флаг коэффициента по умолчанию. Возможные значения:

  • Y — коэффициент используется по умолчанию
  • N — коэффициент не используется по умолчанию

Значение по умолчанию — N

Складской учет

Класс Bitrix\Catalog\StoreTable хранит склады. Склад описывает место хранения или выдачи товара.

Поле

Тип данных

Описание

ID*

int

Идентификатор склада

TITLE

string(75)

Название склада

ACTIVE

bool

Флаг активности склада. Возможные значения:

  • Y — склад активен
  • N — склад не активен

Значение по умолчанию — Y

ADDRESS*

string(245)

Адрес склада

DESCRIPTION

text

Описание склада

GPS_N

string(15)

Географическая широта склада

GPS_S

string(15)

Географическая долгота склада

IMAGE_ID

string(45)

Идентификатор изображения склада

LOCATION_ID

int

Идентификатор местоположения склада

DATE_MODIFY

datetime

Дата и время последнего изменения склада.
Значение по умолчанию — текущее время

DATE_CREATE

datetime

Дата и время создания склада.
Значение по умолчанию — текущее время

USER_ID

int

Идентификатор пользователя, который создал склад

MODIFIED_BY

int

Идентификатор пользователя, который изменил склад

PHONE

string(45)

Телефон склада

SCHEDULE

string(255)

График работы склада

XML_ID

string(255)

Внешний идентификатор склада

SORT

int

Порядок сортировки склада.
Значение по умолчанию — 100

EMAIL

string(255)

E-mail склада

ISSUING_CENTER

bool

Флаг пункта выдачи. Возможные значения:

  • Y — склад является пунктом выдачи
  • N — склад не является пунктом выдачи

Значение по умолчанию — Y

SHIPPING_CENTER

bool

Флаг склада отгрузки. Возможные значения:

  • Y — склад используется для отгрузки
  • N — склад не используется для отгрузки

Значение по умолчанию — Y

SITE_ID

string(2)

Идентификатор сайта склада

CODE

string(255)

Символьный код склада

IS_DEFAULT

enum

Флаг склада по умолчанию. Возможные значения:

  • Y — склад используется по умолчанию
  • N — склад не используется по умолчанию

Значение по умолчанию — N

Остатки товара

Остаток товара на конкретном складе хранит Bitrix\Catalog\StoreProductTable.

Поле

Тип данных

Описание

ID*

int

Идентификатор записи остатка

STORE_ID*

int

Идентификатор склада

PRODUCT_ID*

int

Идентификатор товара или торгового предложения

AMOUNT

float

Количество товара на складе

QUANTITY_RESERVED

float

Зарезервированное количество товара на складе

В каталоге есть два уровня остатков:

  1. ProductTable::QUANTITY хранит общий остаток товара.

  2. StoreProductTable::AMOUNT хранит остаток товара на конкретном складе.

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

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

При складском учете меняйте остатки документами, а не прямой правкой данных, с которыми работает StoreProductTable.

Штрихкоды

Штрихкоды товаров хранит StoreBarcodeTable. Запись связывает товар или торговое предложение, штрихкод и при необходимости склад.

Поле

Тип данных

Описание

ID*

int

Идентификатор записи штрихкода

PRODUCT_ID*

int

Идентификатор товара или торгового предложения

BARCODE*

string(100)

Значение штрихкода. Должно быть уникальным

STORE_ID

int

Идентификатор склада, если штрихкод связан с конкретным складом

ORDER_ID

int

Идентификатор заказа, если штрихкод связан с заказом

DATE_MODIFY

datetime

Дата и время последнего изменения записи

DATE_CREATE

datetime

Дата и время создания записи

CREATED_BY

int

Идентификатор пользователя, который создал запись

MODIFIED_BY

int

Идентификатор пользователя, который изменил запись

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

Если у товара BARCODE_MULTI = 'N', один штрихкод относится к товару как к позиции. Если BARCODE_MULTI = 'Y', штрихкоды ведутся по предложениям товара, а количество штрихкодов в документе должно соответствовать количеству товара в строке.

Состояние складского учета проверяет Bitrix\Catalog\Config\State::isUsedInventoryManagement(). Если складской учет выключен, система отключает складские ограничения и часть складских полей в интерфейсе.

Документы

Складской учет работает с документами. Документ фиксирует операцию складского учета: приход, оприходование, перемещение, возврат, списание или отмену резерва.

  1. Документ создается в StoreDocumentTable и получает тип операции в поле DOC_TYPE.

  2. Товары документа добавляются строками через StoreDocumentElementTable.

  3. В строке указывают товар, количество, склад-источник STORE_FROM и склад-получатель STORE_TO, если они нужны для типа операции.

  4. После проведения документа модуль меняет складские остатки и фиксирует статус документа.

Пока документ не проведен, он хранит планируемую операцию. Поле STATUS показывает, проведен ли документ, а WAS_CANCELLED — был ли он отменен. Для фильтрации и отображения состояния модуль использует константы:

  • StoreDocumentTable::STATUS_CONDUCTED — документ проведен,

  • StoreDocumentTable::STATUS_DRAFT — черновик, документ еще не проведен,

  • StoreDocumentTable::STATUS_CANCELLED — документ отменен.

Складские документы хранит класс Bitrix\Catalog\StoreDocumentTable.

Поле документа

Тип данных

Описание

ID*

int

Идентификатор документа

TITLE

string(255)

Название документа

DOC_TYPE*

enum

Тип складского документа. Используйте константы StoreDocumentTable::TYPE_*

DOC_NUMBER

string(64)

Номер документа

SITE_ID

string(2)

Идентификатор сайта

CONTRACTOR_ID

int

Идентификатор поставщика или контрагента

DATE_MODIFY

datetime

Дата и время последнего изменения документа.
Значение по умолчанию — текущее время

DATE_CREATE

datetime

Дата и время создания документа.
Значение по умолчанию — текущее время

CREATED_BY

int

Идентификатор пользователя, который создал документ

MODIFIED_BY

int

Идентификатор пользователя, который изменил документ

RESPONSIBLE_ID

int

Идентификатор ответственного пользователя

CURRENCY

string(3)

Валюта документа

STATUS

bool

Флаг проведения документа. Возможные значения:

  • Y — документ проведен
  • N — документ не проведен

Значение по умолчанию — N

WAS_CANCELLED

bool

Флаг отмены документа. Возможные значения:

  • Y — документ отменен
  • N — документ не отменен

Значение по умолчанию — N

DATE_STATUS

datetime

Дата и время изменения статуса документа

DATE_DOCUMENT

datetime

Дата документа.
Значение по умолчанию — текущее время

STATUS_BY

int

Идентификатор пользователя, который изменил статус документа

TOTAL

float

Сумма документа

COMMENTARY

string(1000)

Комментарий к документу

ITEMS_ORDER_DATE

datetime

Дата заказа товаров по документу

ITEMS_RECEIVED_DATE

datetime

Дата получения товаров по документу

Строки документа хранит Bitrix\Catalog\StoreDocumentElementTable.

Поле строки документа

Тип данных

Описание

ID*

int

Идентификатор строки документа

DOC_ID*

int

Идентификатор складского документа

ELEMENT_ID

int

Идентификатор товара или торгового предложения

STORE_FROM

int

Склад-источник для операций перемещения или списания

STORE_TO

int

Склад-получатель для операций прихода или перемещения

AMOUNT

float

Количество товара в строке документа

PURCHASING_PRICE

int

Закупочная цена в строке документа

BASE_PRICE

int

Базовая цена в строке документа

BASE_PRICE_EXTRA

float

Наценка для базовой цены

BASE_PRICE_EXTRA_RATE

enum

Тип значения наценки для базовой цены. Возможные значения:

  • 1 — процент
  • 2 — денежная сумма

Значение по умолчанию — 1

COMMENT

string

Комментарий к строке документа

Типы складских документов

Основные типы складских документов:

Константа

Значение

Описание

StoreDocumentTable::TYPE_ARRIVAL

A

Приход

StoreDocumentTable::TYPE_STORE_ADJUSTMENT

S

Оприходование

StoreDocumentTable::TYPE_MOVING

M

Перемещение

StoreDocumentTable::TYPE_RETURN

R

Возврат

StoreDocumentTable::TYPE_DEDUCT

D

Списание

StoreDocumentTable::TYPE_UNDO_RESERVE

U

Отмена резерва

Подписки на появление товара

Класс Bitrix\Catalog\SubscribeTable хранит подписки на появление товара. Подписка связывает товар, контакт пользователя и сайт.

Поле

Тип данных

Описание

ID*

int

Идентификатор подписки

DATE_FROM*

datetime

Дата начала подписки

DATE_TO

datetime

Дата окончания подписки

USER_CONTACT*

string

Контакт для уведомления. Для встроенного типа контакта используется e-mail

CONTACT_TYPE*

int

Тип контакта. Встроенный тип CONTACT_TYPE_EMAIL имеет значение 1

USER_ID

int

Идентификатор пользователя

ITEM_ID

int

Идентификатор товара или торгового предложения

NEED_SENDING

bool

Флаг необходимости отправить уведомление. Возможные значения:

  • Y — уведомление нужно отправить
  • N — уведомление не нужно отправлять

Значение по умолчанию — N

SITE_ID*

string(2)

Идентификатор сайта

LANDING_SITE_ID

int

Идентификатор сайта из модуля Сайты24, если подписка связана с ним

Когда доступность товара меняется с N на Y, модуль может пометить активные подписки флагом NEED_SENDING = 'Y' и запустить агент отправки уведомлений. Подписка работает, если для товара разрешено поле SUBSCRIBE или это разрешение берется из настройки модуля.

История просмотров товаров

Класс Bitrix\Catalog\CatalogViewedProductTable хранит историю просмотров товаров. Модуль использует эти данные для блоков просмотренных товаров и сценариев рекомендаций.

Поле

Тип данных

Описание

ID*

int

Идентификатор записи просмотра

FUSER_ID

int

Идентификатор посетителя из модуля sale

DATE_VISIT

datetime

Дата и время последнего просмотра товара.
Значение по умолчанию — текущее время

PRODUCT_ID

int

Идентификатор товара или торгового предложения

ELEMENT_ID

int

Идентификатор родительского элемента. Для торгового предложения может хранить товарную карточку

SITE_ID

string(2)

Идентификатор сайта

VIEW_COUNT

int

Количество просмотров товара этим посетителем

RECOMMENDATION

string(40)

Идентификатор рекомендации, по которой был открыт товар

Для товара с торговыми предложениями история просмотров может хранить два идентификатора: выбранное предложение и родительский товар. Метод CatalogViewedProductTable::getProductsMap() помогает получить такую связь. Он возвращает массив, где ключ — идентификатор переданного товара или предложения, а значение — идентификатор родительского товара. Если переданный товар не является предложением, значение совпадает с ключом.

Интеграция с модулем Интернет-магазин

Модуль Интернет-магазин sale использует данные каталога при работе с корзиной и заказом. Чтобы проверить возможность покупки, провайдер товара каталога читает тип товара, цены, доступность и остатки.

Для обычного товара корзина работает с ID товара. Для товара с торговыми предложениями корзина должна получать ID выбранного предложения. Родительский товар типа TYPE_SKU группирует предложения, но обычно не является самостоятельной продаваемой позицией.

В корзину можно добавить:

  • обычный товар ProductTable::TYPE_PRODUCT,

  • комплект ProductTable::TYPE_SET, если для него найден состав комплекта,

  • торговое предложение ProductTable::TYPE_OFFER, если найден активный родительский товар,

  • услуга ProductTable::TYPE_SERVICE.

Родительские типы ProductTable::TYPE_SKU и ProductTable::TYPE_EMPTY_SKU предназначены для группировки предложений и по умолчанию не добавляются в корзину напрямую.

При оформлении заказа данные каталога участвуют в проверках:

  • товар должен существовать как элемент инфоблока и товарная запись каталога,

  • товар должен быть доступен для покупки,

  • цена должна соответствовать типу цены, валюте и количеству,

  • остаток должен позволять продажу с учетом настроек QUANTITY_TRACE и CAN_BUY_ZERO,

  • при складском учете отгрузка должна учитывать складские остатки и резервы.

Не дублируйте цены, остатки и правила покупки в свойствах инфоблока. Такие свойства не заменяют данные модуля catalog для корзины и заказа в модуле sale.

Что не нужно хранить в свойствах инфоблока

Свойства инфоблока подходят для описания товара: цвет, бренд, материал, страна, технические характеристики, файлы и другие данные карточки. Данные продажи храните через объекты каталога.

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

Данные

Где хранить

Цена товара

PriceTable

Тип цены

GroupTable

Общий остаток

ProductTable::QUANTITY

Остаток по складу

StoreProductTable::AMOUNT

Единица измерения

MeasureTable и ProductTable::MEASURE

Коэффициент продажи

MeasureRatioTable

НДС

VatTable и ProductTable::VAT_ID

Признак доступности

ProductTable::AVAILABLE

Подписка на появление

SubscribeTable