Перейти к содержанию

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

Совет

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

Основные блоки:

API модуля

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

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

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

Для работы с заказом используйте классы из пространства имен Bitrix\Sale. Они образуют объектную модель заказа и связанных коллекций.

use Bitrix\Sale\Order; // Заказ
use Bitrix\Sale\Basket; // Корзина
use Bitrix\Sale\BasketItem; // Позиция корзины
use Bitrix\Sale\Fuser; // Покупатель корзины
use Bitrix\Sale\PropertyValueCollection; // Значения свойств заказа
use Bitrix\Sale\PaymentCollection; // Коллекция оплат
use Bitrix\Sale\Payment; // Оплата
use Bitrix\Sale\ShipmentCollection; // Коллекция отгрузок
use Bitrix\Sale\Shipment; // Отгрузка
use Bitrix\Sale\Discount; // Расчет правил работы с корзиной

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

use Bitrix\Sale\Internals\OrderTable; // Заказы
use Bitrix\Sale\Internals\BasketTable; // Позиции корзины и заказа
use Bitrix\Sale\Internals\PaymentTable; // Оплаты
use Bitrix\Sale\Internals\PayableItemTable; // Привязка оплаты к позициям или отгрузкам
use Bitrix\Sale\Internals\ShipmentTable; // Отгрузки
use Bitrix\Sale\Internals\ShipmentItemTable; // Позиции отгрузок
use Bitrix\Sale\Internals\OrderPropsTable; // Настройки свойств заказа
use Bitrix\Sale\Internals\OrderPropsValueTable; // Значения свойств заказа
use Bitrix\Sale\Internals\OrderDiscountTable; // Сохраненные скидки заказа
use Bitrix\Sale\Internals\OrderCouponsTable; // Купоны заказа
use Bitrix\Sale\Internals\OrderRulesTable; // Результаты применения правил скидок

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

|

|| Пространство имен | Что содержит || || Bitrix\Sale\PaySystem | Платежные системы, обработчики оплат и результаты работы платежных систем || || Bitrix\Sale\Delivery\Services | Службы доставки и менеджер служб доставки || || Bitrix\Sale\Cashbox | Онлайн-кассы, чеки и менеджеры фискальных документов || || Bitrix\Sale\Reservation | Сервисы резервирования и расчета доступного количества || || Bitrix\Sale\Helpers | Служебные помощники модуля, в том числе очистка устаревших резервов || |#

Основная схема заказа

Корзина существует до оформления заказа. После создания заказа корзина становится частью заказа, а остальные данные добавляются через коллекции заказа.

```plain text Basket -> BasketItem

Order -> Basket -> PropertyValueCollection -> PaymentCollection -> Payment -> ShipmentCollection -> Shipment -> Discount

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

#|
|| **Объект** | **Роль в модели заказа** ||
|| `Bitrix\Sale\Order` | Объединяет корзину, свойства, оплаты, отгрузки, скидки, статусы и историю продажи ||
|| `Bitrix\Sale\Basket` | Хранит позиции покупателя до оформления и передает их в заказ через `Order::setBasket()` ||
|| `Bitrix\Sale\BasketItem` | Хранит одну позицию корзины: товар, торговое предложение или услугу, количество, цену, валюту и данные поставщика ||
|| `Bitrix\Sale\PropertyValueCollection` | Хранит значения свойств заказа для выбранного типа плательщика ||
|| `Bitrix\Sale\PaymentCollection` | Хранит оплаты заказа и создает объекты оплаты `Payment` ||
|| `Bitrix\Sale\Payment` | Хранит сумму оплаты, валюту, платежную систему и состояние оплаты ||
|| `Bitrix\Sale\ShipmentCollection` | Хранит отгрузки заказа и создает объекты `Shipment` ||
|| `Bitrix\Sale\Shipment` | Хранит службу доставки, стоимость доставки, состав доставляемых позиций и состояние отгрузки ||
|| `Bitrix\Sale\Discount` | Рассчитывает правила работы с корзиной, скидки и купоны для корзины или заказа ||
|#

## Жизненный цикл заказа

Типовой сценарий начинается с корзины и заканчивается сохранением заказа.

1. Создайте или загрузите корзину через `Basket`.

2. Добавьте в корзину товары и торговые предложения как позиции `BasketItem`.

3. Создайте заказ методом `Order::create()` и передайте в него корзину методом `Order::setBasket()`.

4. Задайте в заказе тип плательщика. От типа плательщика зависят свойства заказа, доступные платежные системы и службы доставки.

5. Заполните значения свойств через `PropertyValueCollection`.

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

7. Создайте оплату через `PaymentCollection`, установите текущую сумму заказа и выберите платежную систему с учетом ограничений.

8. Выполните финальный расчет через `Order::doFinalAction(true)`, чтобы применить скидки, обновить налоги и итоговые суммы.

9. Запишите итоговую сумму заказа в оплату и повторно проверьте доступность выбранных служб доставки и платежных систем.

10. Сохраните заказ через `Order::save()`.

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

При сохранении заказ:

-  проверяет данные,

-  вызывает события до и после сохранения,

-  сохраняет дочерние объекты и скидки,

-  обновляет историю,

-  обрабатывает отложенные события.

В реализации `Order::save()` также вызывается провайдер каталога, который обрабатывает товарные данные заказа.

## Коллекции внутри заказа

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

#|
|| **Метод заказа** | **Что возвращает** | **Назначение** ||
|| `Order::getBasket()` | `Bitrix\Sale\Basket` | Получает корзину, связанную с заказом ||
|| `Order::setBasket()` | `Bitrix\Sale\Result` | Передает подготовленную корзину в новый несохраненный заказ

В сохраненном заказе изменение корзины требует проверки отгрузок, оплат, скидок и итоговой суммы ||
|| `Order::getPropertyCollection()` | `Bitrix\Sale\PropertyValueCollection` | Возвращает свойства заказа для чтения или заполнения ||
|| `Order::getPaymentCollection()` | `Bitrix\Sale\PaymentCollection` | Возвращает коллекцию для создания, чтения или изменения оплат заказа ||
|| `Order::getShipmentCollection()` | `Bitrix\Sale\ShipmentCollection` | Возвращает коллекцию для создания, чтения или изменения отгрузок заказа ||
|#

Оплата и отгрузка относятся к заказу. Не создавайте их как независимые записи в таблицах при оформлении покупки через объекты заказа.

## Связь с ORM-классами

Объектная модель использует таблицы модуля как слой хранения. С ними работают ORM-классы в пространстве имен `Bitrix\Sale\Internals`.

#|
|| **Объект заказа** | **Основной ORM-класс** | **Что хранит** ||
|| `Basket`, `BasketItem` | `Bitrix\Sale\Internals\BasketTable` | Позиции корзины и заказа ||
|| `Order` | `Bitrix\Sale\Internals\OrderTable` | Основные поля заказа: сайт, покупатель, тип плательщика, статус, суммы и служебные признаки ||
|| `Payment` | `Bitrix\Sale\Internals\PaymentTable` | Оплаты заказа ||
|| `Shipment` | `Bitrix\Sale\Internals\ShipmentTable` | Отгрузки заказа ||
|| `Property` | `Bitrix\Sale\Internals\OrderPropsTable` | Настройки свойств заказа ||
|| `PropertyValue` | `Bitrix\Sale\Internals\OrderPropsValueTable` | Значения свойств конкретного заказа ||
|#

Используйте ORM-классы для быстрых выборок заказов, оплат, отгрузок и настроек свойств. Например, отчет может читать `OrderTable` и `PaymentTable`, не создавая полный объект заказа.

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

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

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

ORM использует карту, чтобы:

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

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

-  проверять типы и обязательность полей,

-  применять значения по умолчанию,

-  подключать связи с другими таблицами.

ORM-классы модуля `sale` описывают карты в двух форматах. Часть классов описывает поля как массивы с ключами `data_type`, `required`, `values`, `validation`. Часть классов использует объекты полей, например `IntegerField`, `StringField`, `BooleanField`, `EnumField`, `FloatField`, `DatetimeField` и `ReferenceField`.

**Пример.** Фрагмент карты класса `OrderTable`:

```php
return [
    new \Bitrix\Main\Entity\IntegerField(
        'USER_ID',
        [
            'required' => true,
        ]
    ),
    new \Bitrix\Main\Entity\BooleanField(
        'PAYED',
        [
            'values' => ['N', 'Y'],
            'default_value' => 'N',
        ]
    ),
    new \Bitrix\Main\Entity\ReferenceField(
        'PAYMENT',
        'Bitrix\Sale\Internals\Payment',
        [
            '=ref.ORDER_ID' => 'this.ID',
        ]
    ),
];

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

|

|| Тип элемента карты | Что означает | Пример || || Поле хранения | Колонка таблицы, которую ORM читает или сохраняет | ID, USER_ID, PRICE, CURRENCY || || Вычисляемое поле | Значение, которое ORM вычисляет в SQL-запросе. Оно не является отдельной колонкой хранения | DATE_INSERT_SHORT, PRODUCTS_QUANT, DISCOUNT_ALL || || Связь | Описание связи с другой таблицей или объектом ORM | USER, BASKET, PAYMENT, SHIPMENT, PROPERTY || |#

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

Схема связей ORM-классов

Объект заказа сохраняется в несколько связанных таблиц. Связи строятся от OrderTable: корзина, оплаты, отгрузки, свойства и результаты скидок ссылаются на заказ по ORDER_ID или через связанные идентификаторы.

```plain text OrderTable -> BasketTable ORDER_ID = OrderTable.ID

-> PaymentTable ORDER_ID = OrderTable.ID -> PayableItemTable PAYMENT_ID = PaymentTable.ID ENTITY_TYPE = BASKET_ITEM или SHIPMENT

-> ShipmentTable ORDER_ID = OrderTable.ID -> ShipmentItemTable ORDER_DELIVERY_ID = ShipmentTable.ID BASKET_ID = BasketTable.ID

-> OrderPropsValueTable ORDER_ID = OrderTable.ID ORDER_PROPS_ID = OrderPropsTable.ID

-> OrderCouponsTable ORDER_ID = OrderTable.ID ORDER_DISCOUNT_ID = OrderDiscountTable.ID

-> OrderDiscountDataTable ORDER_ID = OrderTable.ID

-> OrderRulesTable ORDER_ID = OrderTable.ID ORDER_DISCOUNT_ID = OrderDiscountTable.ID

-> OrderRulesDescrTable ORDER_ID = OrderTable.ID ORDER_DISCOUNT_ID = OrderDiscountTable.ID RULE_ID = OrderRulesTable.ID

OrderDiscountTable ID используется как ORDER_DISCOUNT_ID в связанных таблицах ```

Настройки свойств, статусов, платежных систем и служб доставки хранятся отдельно от заказа. Заказ и его дочерние объекты ссылаются на эти настройки по идентификаторам: PERSON_TYPE_ID, STATUS_ID, PAY_SYSTEM_ID, DELIVERY_ID, ORDER_PROPS_ID.

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

Основные поля ORM-классов

Данные заказа распределены между несколькими ORM-классами.

Примечание

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

Заказ

Класс Bitrix\Sale\Internals\OrderTable хранит основные поля заказа: покупателя, сайт, тип плательщика, статус, суммы, признаки оплаты, доставки, отмены и служебные данные обмена.

|

|| Поле | Тип данных | Описание || || ID* | int | Идентификатор заказа. Первичный ключ записи || || LID | string | Идентификатор сайта, на котором создан заказ || || ACCOUNT_NUMBER | string(100) | Номер заказа для отображения и поиска. Может отличаться от числового ID || || TRACKING_NUMBER | string | Трек-номер заказа, если он хранится на уровне заказа. В объектной модели трекинг относится к отгрузке || || PAY_SYSTEM_ID | int | Идентификатор платежной системы на уровне заказа. Поле сохраняют для совместимости. В объектной модели оплаты хранятся в PaymentTable || || DELIVERY_ID | int | Идентификатор службы доставки на уровне заказа. Поле сохраняют для совместимости. В объектной модели отгрузки хранятся в ShipmentTable || || PERSON_TYPE_ID | string | Идентификатор типа плательщика. Тип плательщика определяет свойства заказа, доступные платежные системы и службы доставки || || USER_ID* | int | Идентификатор пользователя, для которого создан заказ || || DATE_INSERT | datetime | Дата и время создания заказа || || DATE_UPDATE | datetime | Дата и время последнего изменения заказа || || STATUS_ID | string | Идентификатор статуса заказа. Связан со статусами модуля sale || || DATE_STATUS | datetime | Дата и время последнего изменения статуса заказа || || EMP_STATUS_ID | int | Идентификатор пользователя, который изменил статус заказа || || PAYED | bool | Флаг полной оплаты заказа. Возможные значения:

  • Y — заказ оплачен,
  • N — заказ не оплачен.

Значение по умолчанию — N || || IS_SYNC_B24 | bool | Служебный флаг синхронизации с Битрикс24. Возможные значения:

  • Y — синхронизация включена,
  • N — синхронизация не включена.

Значение по умолчанию — N || || DATE_PAYED | datetime | Дата и время оплаты заказа || || EMP_PAYED_ID | int | Идентификатор пользователя, который установил оплату заказа || || DEDUCTED | bool | Флаг отгрузки или списания товаров по заказу. Возможные значения:

  • Y — товары отгружены или списаны,
  • N — товары не отгружены или не списаны.

Значение по умолчанию — N || || DATE_DEDUCTED | datetime | Дата и время изменения флага DEDUCTED || || EMP_DEDUCTED_ID | int | Идентификатор пользователя, который изменил флаг DEDUCTED || || REASON_UNDO_DEDUCTED | string | Причина отмены отгрузки или списания || || ALLOW_DELIVERY | bool | Флаг разрешения доставки. Возможные значения:

  • Y — доставка разрешена,
  • N — доставка не разрешена.

Значение по умолчанию — N || || DATE_ALLOW_DELIVERY | datetime | Дата и время разрешения доставки || || EMP_ALLOW_DELIVERY_ID | int | Идентификатор пользователя, который разрешил доставку || || RESERVED | bool | Флаг резервирования товаров заказа. Возможные значения:

  • Y — товары зарезервированы,
  • N — товары не зарезервированы.

Значение по умолчанию — N || || PRICE | float | Итоговая сумма заказа. Значение по умолчанию — 0.0 || || PRICE_DELIVERY | float | Стоимость доставки заказа || || CURRENCY* | string(3) | Валюта заказа || || DISCOUNT_VALUE | float | Сумма скидки, которая хранится на уровне заказа. Значение по умолчанию — 0.0 || || TAX_VALUE | float | Сумма налогов заказа || || SUM_PAID | float | Сумма уже оплаченных платежей по заказу || || USER_DESCRIPTION | string(2000) | Комментарий покупателя к заказу || || PAY_VOUCHER_NUM | string(20) | Номер платежного документа || || PAY_VOUCHER_DATE | date | Дата платежного документа || || ADDITIONAL_INFO | string | Дополнительная информация по заказу || || COMMENTS | string | Служебный комментарий к заказу || || COMPANY_ID | int | Идентификатор компании, связанной с заказом || || CREATED_BY | int | Идентификатор пользователя, который создал заказ || || RESPONSIBLE_ID | int | Идентификатор ответственного пользователя || || STAT_GID | string | Идентификатор статистики, если заказ связан с модулем статистики или аналитическим сценарием || || DATE_PAY_BEFORE | date | Дата, до которой нужно оплатить заказ || || DATE_BILL | date | Дата выставления счета || || IS_RECURRING | bool | Флаг регулярного заказа. Возможные значения:

  • Y — заказ регулярный,
  • N — заказ не регулярный.

Значение по умолчанию — N || || RECURRING_ID | int | Идентификатор связанной записи регулярной оплаты или заказа || || LOCKED_BY | int | Идентификатор пользователя, который заблокировал заказ для редактирования || || DATE_LOCK | datetime | Дата и время блокировки заказа || || CANCELED | bool | Флаг отмены заказа. Возможные значения:

  • Y — заказ отменен,
  • N — заказ не отменен.

Значение по умолчанию — N || || DATE_CANCELED | datetime | Дата и время отмены заказа || || EMP_CANCELED_ID | int | Идентификатор пользователя, который отменил заказ || || REASON_CANCELED | string | Причина отмены заказа || || MARKED | bool | Флаг проблемы в заказе. Возможные значения:

  • Y — заказ помечен как проблемный,
  • N — заказ не помечен.

Значение по умолчанию — N || || DATE_MARKED | datetime | Дата и время установки флага MARKED || || EMP_MARKED_ID | int | Идентификатор пользователя, который установил флаг MARKED || || REASON_MARKED | string | Причина пометки заказа как проблемного || || RECOUNT_FLAG | bool | Флаг необходимости пересчета заказа. Возможные значения:

  • Y — заказ нужно пересчитать,
  • N — заказ не нужно пересчитывать. || || AFFILIATE_ID | int | Идентификатор аффилиата, если заказ связан с партнерской программой || || DELIVERY_DOC_NUM | string(20) | Номер документа доставки || || DELIVERY_DOC_DATE | datetime | Дата документа доставки || || UPDATED_1C | bool | Флаг обновления из 1С. Возможные значения:

  • Y — заказ обновлен из 1С,

  • N — заказ не обновлен из 1С. || || ORDER_TOPIC | string | Тема заказа. Используется в служебных сценариях и интеграциях || || XML_ID | string | Внешний идентификатор заказа || || ID_1C | string | Идентификатор заказа в 1С || || VERSION_1C | string | Версия данных заказа из обмена с 1С || || VERSION | int | Внутренняя версия записи заказа || || EXTERNAL_ORDER | bool | Флаг внешнего заказа. Возможные значения:

  • Y — заказ внешний,

  • N — заказ не внешний. || || STORE_ID | int | Идентификатор склада, если заказ связан со складом || || BX_USER_ID | string | Идентификатор посетителя или пользователя в служебных сценариях модуля || || SEARCH_CONTENT | text | Текст для поиска по заказу || || RUNNING | bool | Служебный флаг обработки заказа. Возможные значения:

  • Y — заказ находится в обработке,

  • N — заказ не находится в обработке.

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

Корзина

Класс Bitrix\Sale\Internals\BasketTable хранит позиции до оформления и позиции, которые уже связаны с заказом через поле ORDER_ID.

|

|| Поле | Тип данных | Описание || || ID* | int | Идентификатор позиции корзины || || LID* | string(2) | Идентификатор сайта корзины || || FUSER_ID* | int | Идентификатор покупателя из Bitrix\Sale\Fuser. Связывает корзину с посетителем или пользователем || || ORDER_ID | int | Идентификатор заказа. Поле заполнено, когда позиция стала частью заказа || || PRODUCT_ID* | int | Идентификатор товара, торгового предложения или услуги || || PRODUCT_PRICE_ID | int | Идентификатор цены товара, если позиция связана с ценой каталога || || PRICE_TYPE_ID | int | Идентификатор типа цены || || NAME | string | Название позиции корзины || || PRICE | float | Цена позиции после расчета || || BASE_PRICE | float | Базовая цена позиции до скидок || || CURRENCY* | string(3) | Валюта цены позиции || || QUANTITY* | float | Количество товара или услуги в позиции || || WEIGHT | float | Вес позиции || || VAT_INCLUDED | bool | Флаг включения НДС в цену. Возможные значения:

  • Y — НДС включен в цену,
  • N — НДС не включен в цену. || || VAT_RATE | float | Ставка НДС в долях единицы. Например, 0.2 означает 20% || || DATE_INSERT | datetime | Дата и время создания позиции || || DATE_UPDATE | datetime | Дата и время последнего изменения позиции || || DATE_REFRESH | datetime | Дата и время последнего обновления позиции || || DELAY | bool | Флаг отложенной позиции. Возможные значения:

  • Y — позиция отложена,

  • N — позиция не отложена. || || CAN_BUY | bool | Флаг возможности купить позицию. Возможные значения:

  • Y — позицию можно купить,

  • N — позицию нельзя купить. || || MARKING_CODE_GROUP | string | Группа кодов маркировки для позиции корзины || || MODULE | string | Код модуля-поставщика товара. Для товаров каталога обычно используется catalog || || PRODUCT_PROVIDER_CLASS | string | Класс провайдера товара, который проверяет цену, доступность, остатки и другие товарные данные || || NOTES | string | Служебная пометка позиции, например данные типа цены || || DETAIL_PAGE_URL | string | URL детальной страницы товара || || DISCOUNT_PRICE | float | Сумма скидки на единицу позиции. Значение по умолчанию — 0.0 || || DISCOUNT_NAME | string(255) | Название примененной скидки || || DISCOUNT_VALUE | string(32) | Значение скидки в текстовом виде || || DISCOUNT_COUPON | string(32) | Купон, который применился к позиции || || CATALOG_XML_ID | string | Внешний идентификатор каталога || || PRODUCT_XML_ID | string | Внешний идентификатор товара || || SUBSCRIBE | bool | Флаг подписки на отсутствующий товар. Возможные значения:

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

  • N — подписка не включена. || || RESERVED | bool | Флаг резервирования позиции. Возможные значения:

  • Y — позиция зарезервирована,

  • N — позиция не зарезервирована. || || RESERVE_QUANTITY | float | Зарезервированное количество по позиции || || BARCODE_MULTI | bool | Флаг работы с несколькими штрихкодами. Возможные значения:

  • Y — используется несколько штрихкодов,

  • N — используется один штрихкод. || || CUSTOM_PRICE | bool | Флаг ручной цены. Возможные значения:

  • Y — цена задана вручную,

  • N — цена рассчитывается системой. || || DIMENSIONS | string | Сериализованные габариты товара || || TYPE | int | Тип позиции корзины. Используется для товаров, услуг, комплектов и служебных строк || || SET_PARENT_ID | int | Идентификатор родительской позиции комплекта или набора || || MEASURE_CODE | int | Код единицы измерения || || MEASURE_NAME | string | Название единицы измерения || || CALLBACK_FUNC | string | Имя функции обратного вызова для обновления данных позиции || || ORDER_CALLBACK_FUNC | string | Имя функции обратного вызова для оформления заказа || || CANCEL_CALLBACK_FUNC | string | Имя функции обратного вызова для отмены заказа || || PAY_CALLBACK_FUNC | string | Имя функции обратного вызова для обработки оплаты || || RECOMMENDATION | string | Идентификатор рекомендации, по которой товар попал в корзину || || SORT | int | Сортировка позиции. Значение по умолчанию — 100 || || XML_ID | string | Внешний идентификатор позиции || |#

Оплата

Класс Bitrix\Sale\Internals\PaymentTable хранит оплаты заказа. У одного заказа может быть несколько оплат.

|

|| Поле | Тип данных | Описание || || ID* | int | Идентификатор оплаты || || ORDER_ID* | int | Идентификатор заказа, к которому относится оплата || || ACCOUNT_NUMBER | string(100) | Номер оплаты для отображения и поиска || || PAID | bool | Флаг оплаты. Возможные значения:

  • Y — оплата проведена,
  • N — оплата не проведена.

Значение по умолчанию — N || || DATE_PAID | datetime | Дата и время оплаты || || EMP_PAID_ID | int | Идентификатор пользователя, который установил оплату || || PAY_SYSTEM_ID* | int | Идентификатор платежной системы || || PAY_SYSTEM_NAME* | string(128) | Название платежной системы, сохраненное в оплате || || SUM* | float | Сумма оплаты. Значение по умолчанию — 0.0000 || || CURRENCY* | string(3) | Валюта оплаты || || PRICE_COD | float | Сумма наложенного платежа, если сценарий ее использует || || PS_STATUS | bool | Статус платежной системы. Возможные значения:

  • Y — платежная система вернула успешный статус,
  • N — платежная система не вернула успешный статус. || || PS_STATUS_CODE | string(255) | Код статуса, полученный от платежной системы || || PS_INVOICE_ID | string | Идентификатор счета или платежа во внешней платежной системе || || PS_STATUS_DESCRIPTION | string(512) | Описание статуса платежной системы || || PS_STATUS_MESSAGE | string(250) | Сообщение платежной системы || || PS_SUM | float | Сумма, которую вернула платежная система || || PS_CURRENCY | string(3) | Валюта, которую вернула платежная система || || PS_RESPONSE_DATE | datetime | Дата и время ответа платежной системы || || PS_RECURRING_TOKEN | string(255) | Токен рекуррентного платежа || || PS_CARD_NUMBER | string(64) | Маскированный номер карты или другой идентификатор платежного средства || || PAY_VOUCHER_NUM | string(20) | Номер платежного документа || || PAY_VOUCHER_DATE | date | Дата платежного документа || || DATE_PAY_BEFORE | date | Дата, до которой нужно выполнить оплату || || DATE_BILL | datetime | Дата выставления счета на оплату || || XML_ID | string(255) | Внешний идентификатор оплаты || || RESPONSIBLE_ID | int | Идентификатор ответственного пользователя || || EMP_RESPONSIBLE_ID | int | Идентификатор пользователя, который назначил ответственного || || DATE_RESPONSIBLE_ID | datetime | Дата и время назначения ответственного || || COMMENTS | string | Комментарий к оплате || || COMPANY_ID | int | Идентификатор компании, связанной с оплатой || || PAY_RETURN_NUM | string(20) | Номер документа возврата оплаты || || PAY_RETURN_DATE | date | Дата документа возврата оплаты || || EMP_RETURN_ID | int | Идентификатор пользователя, который оформил возврат || || PAY_RETURN_COMMENT | string | Комментарий к возврату оплаты || || IS_RETURN | enum | Состояние возврата. Возможные значения:

  • N — возврата нет,

  • Y — возврат выполнен,
  • P — частичный возврат.

Значение по умолчанию — N || || MARKED | bool | Флаг проблемы в оплате. Возможные значения:

  • Y — оплата помечена как проблемная,
  • N — оплата не помечена.

Значение по умолчанию — N || || DATE_MARKED | datetime | Дата и время установки флага MARKED || || EMP_MARKED_ID | int | Идентификатор пользователя, который установил флаг MARKED || || REASON_MARKED | string(255) | Причина пометки оплаты как проблемной || || UPDATED_1C | bool | Флаг обновления из 1С. Возможные значения:

  • Y — оплата обновлена из 1С,
  • N — оплата не обновлена из 1С. || || ID_1C | string | Идентификатор оплаты в 1С || || VERSION_1C | string | Версия данных оплаты из обмена с 1С || || EXTERNAL_PAYMENT | enum | Признак внешней оплаты. Возможные значения:

  • N — оплата не внешняя,

  • Y — оплата внешняя,
  • F — отдельный режим внешней оплаты. || |#

Привязка оплаты к позициям

Класс Bitrix\Sale\Internals\PayableItemTable связывает оплату с оплачиваемой позицией корзины или отгрузкой.

|

|| Поле | Тип данных | Описание || || ID* | int | Идентификатор записи привязки || || PAYMENT_ID* | int | Идентификатор оплаты из PaymentTable || || ENTITY_ID* | int | Идентификатор оплачиваемого объекта. Значение зависит от поля ENTITY_TYPE || || ENTITY_TYPE* | enum | Тип оплачиваемого объекта. Возможные значения:

  • BASKET_ITEM — позиция корзины,
  • SHIPMENT — отгрузка. || || DATE_INSERT | datetime | Дата и время создания привязки || || QUANTITY* | float | Количество оплачиваемого товара или услуги || || XML_ID | string | Внешний идентификатор записи привязки || |#

Отгрузка

Класс Bitrix\Sale\Internals\ShipmentTable хранит отгрузки заказа. У одного заказа может быть несколько отгрузок.

|

|| Поле | Тип данных | Описание || || ID* | int | Идентификатор отгрузки || || ORDER_ID* | int | Идентификатор заказа, к которому относится отгрузка || || ACCOUNT_NUMBER | string(100) | Номер отгрузки для отображения и поиска || || DATE_INSERT | datetime | Дата и время создания отгрузки || || DATE_UPDATE | datetime | Дата и время последнего изменения отгрузки || || STATUS_ID | string(2) | Идентификатор статуса отгрузки || || DELIVERY_LOCATION | string(50) | Код или идентификатор местоположения доставки || || DELIVERY_ID | int | Идентификатор службы доставки || || DELIVERY_NAME | string(255) | Название службы доставки, сохраненное в отгрузке || || BASE_PRICE_DELIVERY | float | Базовая стоимость доставки до скидок и ручных изменений || || PRICE_DELIVERY | float | Итоговая стоимость доставки || || CUSTOM_PRICE_DELIVERY | bool | Флаг ручной стоимости доставки. Возможные значения:

  • Y — стоимость задана вручную,
  • N — стоимость рассчитывается системой.

Значение по умолчанию — N || || CURRENCY | string(3) | Валюта стоимости доставки || || DISCOUNT_PRICE | float | Сумма скидки на доставку || || WEIGHT | float | Вес отгрузки. Значение по умолчанию — 0 || || ALLOW_DELIVERY | bool | Флаг разрешения доставки. Возможные значения:

  • Y — доставка разрешена,
  • N — доставка не разрешена.

Значение по умолчанию — N || || DATE_ALLOW_DELIVERY | datetime | Дата и время разрешения доставки || || EMP_ALLOW_DELIVERY_ID | int | Идентификатор пользователя, который разрешил доставку || || DEDUCTED | bool | Флаг списания или отгрузки товаров. Возможные значения:

  • Y — товары списаны или отгружены,
  • N — товары не списаны или не отгружены.

Значение по умолчанию — N || || DATE_DEDUCTED | datetime | Дата и время изменения флага DEDUCTED || || EMP_DEDUCTED_ID | int | Идентификатор пользователя, который изменил флаг DEDUCTED || || REASON_UNDO_DEDUCTED | string(255) | Причина отмены списания или отгрузки || || RESERVED | bool | Флаг резервирования отгрузки. Возможные значения:

  • Y — товары отгрузки зарезервированы,
  • N — товары отгрузки не зарезервированы.

Значение по умолчанию — N || || DELIVERY_DOC_NUM | string(20) | Номер документа доставки || || DELIVERY_DOC_DATE | datetime | Дата документа доставки || || TRACKING_NUMBER | string(255) | Трек-номер отправления || || TRACKING_STATUS | int | Статус трекинга || || TRACKING_DESCRIPTION | string(255) | Описание статуса трекинга || || TRACKING_LAST_CHECK | datetime | Дата и время последней проверки трекинга || || TRACKING_LAST_CHANGE | datetime | Дата и время последнего изменения трекинга || || PARAMS | text | Сериализованные параметры отгрузки || || CANCELED | bool | Флаг отмены отгрузки. Возможные значения:

  • Y — отгрузка отменена,
  • N — отгрузка не отменена.

Значение по умолчанию — N || || DATE_CANCELED | datetime | Дата и время отмены отгрузки || || EMP_CANCELED_ID | int | Идентификатор пользователя, который отменил отгрузку || || REASON_CANCELED | string(255) | Причина отмены отгрузки || || MARKED | bool | Флаг проблемы в отгрузке. Возможные значения:

  • Y — отгрузка помечена как проблемная,
  • N — отгрузка не помечена.

Значение по умолчанию — N || || DATE_MARKED | datetime | Дата и время установки флага MARKED || || EMP_MARKED_ID | int | Идентификатор пользователя, который установил флаг MARKED || || REASON_MARKED | string(255) | Причина пометки отгрузки как проблемной || || SYSTEM | bool | Флаг системной отгрузки. Возможные значения:

  • Y — системная отгрузка,
  • N — обычная отгрузка.

Значение по умолчанию — N || || RESPONSIBLE_ID | int | Идентификатор ответственного пользователя || || COMMENTS | string | Комментарий к отгрузке || || COMPANY_ID | int | Идентификатор компании, связанной с отгрузкой || || UPDATED_1C | bool | Флаг обновления из 1С. Возможные значения:

  • Y — отгрузка обновлена из 1С,
  • N — отгрузка не обновлена из 1С. || || XML_ID | string(255) | Внешний идентификатор отгрузки || || ID_1C | string | Идентификатор отгрузки в 1С || || VERSION_1C | string | Версия данных отгрузки из обмена с 1С || || EXTERNAL_DELIVERY | bool | Флаг внешней доставки. Возможные значения:

  • Y — доставка внешняя,

  • N — доставка не внешняя. || |#

Позиции отгрузки

Класс Bitrix\Sale\Internals\ShipmentItemTable связывает отгрузку с позициями корзины и хранит количество товара в конкретной отгрузке.

|

|| Поле | Тип данных | Описание || || ID* | int | Идентификатор позиции отгрузки || || ORDER_DELIVERY_ID* | int | Идентификатор отгрузки из ShipmentTable || || BASKET_ID* | int | Идентификатор позиции корзины из BasketTable || || DATE_INSERT | datetime | Дата и время создания позиции отгрузки || || QUANTITY* | float | Количество позиции корзины, которое входит в отгрузку || || RESERVED_QUANTITY* | float | Зарезервированное количество по позиции отгрузки || || XML_ID | string | Внешний идентификатор позиции отгрузки || |#

Свойства заказа

Класс Bitrix\Sale\Internals\OrderPropsTable хранит настройки свойств заказа и отгрузки. Значения этих свойств для конкретного заказа хранятся отдельно.

|

|| Поле | Тип данных | Описание || || ID* | int | Идентификатор свойства || || PERSON_TYPE_ID* | int | Идентификатор типа плательщика, для которого доступно свойство || || NAME* | string(255) | Название свойства || || TYPE* | string(20) | Тип свойства. Тип определяет формат ввода и хранения значения || || REQUIRED | bool | Флаг обязательного свойства. Возможные значения:

  • Y — свойство обязательно,
  • N — свойство необязательно. || || DEFAULT_VALUE | string | Значение свойства по умолчанию. Массивы сохраняются в сериализованном виде || || SORT | int | Сортировка свойства в списках и формах || || USER_PROPS | bool | Флаг сохранения свойства в профиле покупателя. Возможные значения:

  • Y — свойство сохраняется в профиле покупателя,

  • N — свойство не сохраняется в профиле покупателя. || || IS_LOCATION | bool | Флаг свойства местоположения. Возможные значения:

  • Y — свойство является местоположением,

  • N — свойство не является местоположением. || || PROPS_GROUP_ID* | int | Идентификатор группы свойств || || DESCRIPTION | string(255) | Описание свойства || || IS_EMAIL | bool | Флаг свойства e-mail покупателя. Возможные значения:

  • Y — свойство хранит e-mail покупателя,

  • N — свойство не хранит e-mail покупателя. || || IS_PROFILE_NAME | bool | Флаг свойства имени профиля покупателя. Возможные значения:

  • Y — свойство хранит имя профиля покупателя,

  • N — свойство не хранит имя профиля покупателя. || || IS_PAYER | bool | Флаг свойства плательщика. Возможные значения:

  • Y — свойство относится к плательщику,

  • N — свойство не относится к плательщику. || || IS_LOCATION4TAX | bool | Флаг местоположения для расчета налогов. Возможные значения:

  • Y — местоположение используется для расчета налогов,

  • N — местоположение не используется для расчета налогов. || || IS_FILTERED | bool | Флаг использования свойства в фильтрах. Возможные значения:

  • Y — свойство используется в фильтрах,

  • N — свойство не используется в фильтрах.

Для множественного свойства система сбрасывает этот флаг в N || || CODE | string(50) | Символьный код свойства. Используется для поиска свойства в коде || || IS_ZIP | bool | Флаг свойства почтового индекса. Возможные значения:

  • Y — свойство хранит почтовый индекс,
  • N — свойство не хранит почтовый индекс. || || IS_PHONE | bool | Флаг свойства телефона. Возможные значения:

  • Y — свойство хранит телефон,

  • N — свойство не хранит телефон. || || IS_ADDRESS | bool | Флаг адресного свойства. Возможные значения:

  • Y — свойство хранит адрес,

  • N — свойство не хранит адрес. || || IS_ADDRESS_FROM | bool | Флаг адреса отправления. Возможные значения:

  • Y — свойство хранит адрес отправления,

  • N — свойство не хранит адрес отправления. || || IS_ADDRESS_TO | bool | Флаг адреса получения. Возможные значения:

  • Y — свойство хранит адрес получения,

  • N — свойство не хранит адрес получения. || || ACTIVE | bool | Флаг активности свойства. Возможные значения:

  • Y — свойство активно,

  • N — свойство неактивно. || || UTIL | bool | Флаг служебного свойства. Возможные значения:

  • Y — свойство служебное,

  • N — свойство не служебное. || || INPUT_FIELD_LOCATION | int | Идентификатор поля ввода местоположения, если свойство связано с местоположением || || MULTIPLE | bool | Флаг множественного свойства. Возможные значения:

  • Y — свойство множественное,

  • N — свойство не множественное. || || SETTINGS | string | Сериализованные настройки свойства. При чтении ORM преобразует значение в массив || || ENTITY_REGISTRY_TYPE | string | Область применения свойства. Для свойств заказа используют \Bitrix\Sale\Registry::REGISTRY_TYPE_ORDER || || XML_ID | string | Внешний идентификатор свойства || || ENTITY_TYPE* | enum | Тип объекта, для которого задано свойство. Возможные значения:

  • ORDER — свойство заказа,

  • SHIPMENT — свойство отгрузки.

Значение по умолчанию — ORDER || |#

Значения свойств заказа

Класс Bitrix\Sale\Internals\OrderPropsValueTable хранит значения свойств конкретного заказа или отгрузки.

|

|| Поле | Тип данных | Описание || || ID* | int | Идентификатор значения свойства || || ORDER_ID | int | Идентификатор заказа || || ORDER_PROPS_ID | int | Идентификатор настройки свойства из OrderPropsTable || || NAME* | string(255) | Название свойства, сохраненное вместе со значением || || VALUE | string | Значение свойства. Массивы сохраняются в сериализованном виде, а при чтении ORM может преобразовать их обратно || || CODE | string(50) | Символьный код свойства, сохраненный вместе со значением || || XML_ID | string | Внешний идентификатор значения свойства || || ENTITY_ID | int | Идентификатор объекта, к которому относится значение. Для заказа обычно совпадает с ORDER_ID. Для отгрузки указывает на отгрузку || || ENTITY_TYPE* | enum | Тип объекта, для которого хранится значение. Возможные значения:

  • ORDER — значение свойства заказа,
  • SHIPMENT — значение свойства отгрузки. || |#

Настройки заказа

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

|

|| ORM-класс | Что хранит || || Bitrix\Sale\Internals\PersonTypeTable | Типы плательщиков. Тип плательщика определяет набор свойств заказа и участвует в выборе доступных платежных систем и служб доставки || || Bitrix\Sale\Internals\StatusTable | Коды статусов заказов и отгрузок || || Bitrix\Sale\Internals\StatusLangTable | Названия и описания статусов для языков сайта || || Bitrix\Sale\Internals\OrderPropsGroupTable | Группы свойств заказа для типа плательщика || || Bitrix\Sale\Internals\OrderPropsVariantTable | Варианты значений для свойств заказа со списком значений || || Bitrix\Sale\Internals\OrderPropsRelationTable | Привязки свойств заказа к платежным системам, службам доставки, лендингам и торговым платформам || || Bitrix\Sale\Internals\UserPropsTable | Профили покупателя: сохраненные наборы значений свойств для пользователя и типа плательщика || || Bitrix\Sale\Internals\UserPropsValueTable | Значения свойств внутри профиля покупателя || |#

Типы плательщиков

Класс Bitrix\Sale\Internals\PersonTypeTable предоставляет ORM-доступ к типам плательщиков. В заказе связь с типом плательщика хранится в поле PERSON_TYPE_ID. Тип плательщика определяет, какие свойства нужно заполнить для заказа. Например, для физических и юридических лиц обычно используют разные наборы свойств.

|

|| Поле | Тип | Описание || || ID* | integer | Идентификатор типа плательщика. Первичный ключ, заполняется автоматически || || LID* | string | Идентификатор сайта. Длина до двух символов || || NAME* | string | Название типа плательщика. Длина до 255 символов || || CODE | string | Символьный код типа плательщика || || SORT | integer | Индекс сортировки || || ACTIVE | boolean | Активность типа плательщика. Возможные значения:

  • Y — тип плательщика активен,
  • N — тип плательщика неактивен. || || XML_ID | string | Внешний идентификатор типа плательщика || || ENTITY_REGISTRY_TYPE | string | Область применения типа плательщика. Для заказов используют \Bitrix\Sale\Registry::REGISTRY_TYPE_ORDER || |#

Статусы заказов и отгрузок

Класс Bitrix\Sale\Internals\StatusTable хранит статусы заказов и отгрузок. Назначение статуса задает поле TYPE:

  • O — статус заказа,

  • D — статус отгрузки.

В заказе текущий статус хранится в OrderTable.STATUS_ID, в отгрузке — в ShipmentTable.STATUS_ID.

|

|| Поле | Тип | Описание || || ID* | string | Код статуса. Первичный ключ. Допускаются 1 или 2 латинские буквы || || TYPE | string | Тип статуса. Значение по умолчанию — O. Возможные значения:

  • O — заказ,
  • D — отгрузка. || || SORT | integer | Индекс сортировки. Значение по умолчанию — 100 || || NOTIFY | boolean | Отправлять уведомление при установке статуса. Значение по умолчанию — Y. Возможные значения:

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

  • N — не отправлять уведомление. || || COLOR | string | Цвет статуса в интерфейсе || || XML_ID | string | Внешний идентификатор статуса || |#

ORM-класс Bitrix\Sale\Internals\StatusLangTable хранит названия статусов.

|

|| Поле | Тип | Описание || || STATUS_ID* | string | Код статуса. Часть составного первичного ключа || || LID* | string | Код языка. Часть составного первичного ключа || || NAME* | string | Название статуса на языке LID || || DESCRIPTION | string | Описание статуса || |#

Группы, варианты и привязки свойств

Класс Bitrix\Sale\Internals\OrderPropsGroupTable предоставляет ORM-доступ к группам свойств. Свойства заказа можно группировать по типу плательщика. Группа влияет на организацию свойств в интерфейсе и хранит связь с типом плательщика через PERSON_TYPE_ID.

|

|| Поле | Тип | Описание || || ID* | integer | Идентификатор группы свойств. Первичный ключ, заполняется автоматически || || PERSON_TYPE_ID* | integer | Идентификатор типа плательщика || || NAME* | string | Название группы. Длина от 1 до 255 символов || || CODE | string | Символьный код группы. Длина до 50 символов || || SORT | integer | Индекс сортировки || |#

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

Класс Bitrix\Sale\Internals\OrderPropsVariantTable хранит варианты значений свойств.

|

|| Поле | Тип | Описание || || ID* | integer | Идентификатор варианта. Первичный ключ, заполняется автоматически || || ORDER_PROPS_ID* | integer | Идентификатор свойства заказа || || NAME* | string | Название варианта || || VALUE | string | Значение варианта || || SORT | integer | Индекс сортировки. Значение по умолчанию — 100 || || DESCRIPTION | string | Описание варианта || || XML_ID | string | Внешний идентификатор || |#

Класс Bitrix\Sale\Internals\OrderPropsRelationTable хранит привязки свойств к другим настройкам. Класс использует составной первичный ключ из полей PROPERTY_ID, ENTITY_ID и ENTITY_TYPE.

|

|| Поле | Тип | Описание || || PROPERTY_ID* | integer | Идентификатор свойства заказа. Часть составного первичного ключа || || ENTITY_ID* | string | Идентификатор связанного объекта настройки. Часть составного первичного ключа || || ENTITY_TYPE* | string | Тип связанного объекта настройки. Возможные значения:

  • P — платежная система,
  • D — служба доставки,
  • L — лендинг,
  • T — торговая платформа. || |#

Профили покупателя

Профиль покупателя — сохраненный набор значений свойств заказа для пользователя и типа плательщика. Профили помогают подставлять данные покупателя при следующем оформлении заказа. Текущие значения конкретного заказа при этом хранятся отдельно, в OrderPropsValueTable.

Класс Bitrix\Sale\Internals\UserPropsTable предоставляет ORM-доступ к профилям покупателей.

|

|| Поле | Тип | Описание || || ID* | integer | Идентификатор профиля покупателя. Первичный ключ, заполняется автоматически || || NAME* | string | Название профиля. Длина от 1 до 255 символов || || USER_ID* | integer | Идентификатор пользователя || || PERSON_TYPE_ID* | integer | Идентификатор типа плательщика || || DATE_UPDATE | datetime | Дата изменения профиля || || XML_ID | string | Внешний идентификатор || || VERSION_1C | string | Версия данных обмена с 1С || |#

Класс Bitrix\Sale\Internals\UserPropsValueTable хранит значения свойств профиля покупателя.

|

|| Поле | Тип | Описание || || ID* | integer | Идентификатор значения профиля. Первичный ключ, заполняется автоматически || || USER_PROPS_ID | integer | Идентификатор профиля покупателя || || ORDER_PROPS_ID | integer | Идентификатор свойства заказа || || NAME* | string | Название значения профиля. Длина от 1 до 255 символов || || VALUE | string | Значение свойства в профиле || |#

Свойства добавляют к заказу данные, которых нет в основных полях заказа. Например, через свойства хранят e-mail, телефон, адрес, местоположение и реквизиты плательщика.

У свойства есть настройка и значение.

  • Настройка описывает, какое поле доступно в заказе: для какого типа плательщика, с каким типом ввода, в какой группе, обязательно ли его заполнять и какую роль оно выполняет.

  • Значение хранит данные конкретного заказа или отгрузки.

Класс OrderPropsTable хранит настройки свойств. Класс OrderPropsValueTable хранит значения свойств. В объектной модели значения меняют через PropertyValueCollection, которую возвращает Order::getPropertyCollection(). Коллекция сохраняет значения вместе с заказом и учитывает настройки свойств выбранного типа плательщика.

Тип плательщика определяет набор доступных свойств. Перед заполнением PropertyValueCollection задайте тип плательщика в заказе.

Типы свойств

Тип свойства задает формат значения и способ его обработки. Его указывают в поле OrderPropsTable.TYPE.

|

|| Тип | Когда использовать | Особенности хранения || || STRING | Строковое значение: имя, e-mail, комментарий, простой идентификатор | Значение хранится в VALUE как строка || || NUMBER | Числовое значение | Значение хранится в VALUE; проверка числового формата выполняется на уровне ввода || || Y/N | Логический выбор | Значение обычно хранится как Y или N || || ENUM | Выбор из заранее заданного списка | Варианты списка хранятся в OrderPropsVariantTable. Для множественного свойства значение может преобразовываться в массив || || FILE | Загруженный файл | Для множественного свойства значение может преобразовываться в массив идентификаторов или данных файла || || DATE | Дата | Значение хранится в VALUE; формат ввода обрабатывает тип свойства || || LOCATION | Местоположение для доставки или налогов | Обычно используется вместе с флагами IS_LOCATION или IS_LOCATION4TAX || || ADDRESS | Адрес | Может использоваться вместе с адресными флагами IS_ADDRESS, IS_ADDRESS_FROM, IS_ADDRESS_TO || || UF | Пользовательское поле | Формат значения зависит от настройки пользовательского поля || |#

Флаги свойств

Флаги уточняют роль свойства в сценариях оформления и обработки заказа. Например, модуль может определить, какое свойство хранит e-mail покупателя, телефон, адрес или местоположение для расчета налогов. Одно свойство может использовать несколько флагов.

|

|| Флаг | Что означает || || REQUIRED | Свойство нужно заполнить перед сохранением или оформлением заказа || || USER_PROPS | Значение свойства можно сохранять в профиле покупателя || || IS_LOCATION | Свойство хранит местоположение доставки || || IS_LOCATION4TAX | Свойство хранит местоположение для расчета налогов || || IS_EMAIL | Свойство хранит e-mail покупателя || || IS_PROFILE_NAME | Свойство хранит название профиля покупателя || || IS_PAYER | Свойство хранит имя или название плательщика || || IS_ZIP | Свойство хранит почтовый индекс || || IS_PHONE | Свойство хранит телефон || || IS_ADDRESS | Свойство хранит адрес || || IS_ADDRESS_FROM | Свойство хранит адрес отправления || || IS_ADDRESS_TO | Свойство хранит адрес получения || || IS_FILTERED | Свойство можно использовать в фильтрах. Для множественного свойства модуль сбрасывает этот флаг в N || || ACTIVE | Свойство активно и участвует в сценариях оформления || || UTIL | Свойство служебное || || MULTIPLE | Свойство может хранить несколько значений || |#

Свойства заказа и отгрузки

Одни свойства относятся к заказу, другие — к отгрузке. Поле ENTITY_TYPE показывает, где используется свойство.

  • ORDER — свойство заказа,

  • SHIPMENT — свойство отгрузки.

В OrderPropsTable поле ENTITY_TYPE задает область применения настройки свойства. В OrderPropsValueTable это же поле показывает, к какому объекту относится сохраненное значение.

Как работают оплаты

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

Оплаты создают и меняют через коллекцию PaymentCollection, которую возвращает метод заказа Order::getPaymentCollection().

Платежные системы подключаются классом Bitrix\Sale\PaySystem\Manager. Менеджер возвращает настроенный объект Bitrix\Sale\PaySystem\Service с обработчиком.

|

|| Объект | Роль || || Bitrix\Sale\PaymentCollection | Коллекция оплат заказа. Создает оплаты и считает общую сумму оплат через getSum() || || Bitrix\Sale\Payment | Одна оплата заказа. Хранит сумму, валюту, платежную систему, статус оплаты и идентификаторы платежного документа || || Bitrix\Sale\PaySystem\Manager | Возвращает список платежных систем и объект платежной системы по идентификатору. Может учитывать ограничения платежных систем для заказа или оплаты || || Bitrix\Sale\PaySystem\Service | Настроенная платежная система с обработчиком || || Bitrix\Sale\PaySystem\ServiceHandler | Базовый класс обработчика платежной системы || || Bitrix\Sale\PaySystem\ServiceResult | Результат работы платежной системы. Метод isResultApplied() показывает, применен ли результат к оплате || |#

Для чтения оплат используйте PaymentTable. При изменении оплаты работайте через PaymentCollection и Payment, чтобы заказ сохранил связанные изменения, события и историю.

Оплата может быть связана с оплачиваемыми объектами через PayableItemCollection. Запись привязки указывает, какой объект связан с конкретной оплатой: позиция корзины или отгрузка. Для позиции корзины количество в привязке не должно превышать количество этой позиции в корзине. Для отгрузки количество фиксируется как 1, потому что оплачивается сама отгрузка.

Как работают отгрузки и службы доставки

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

Отгрузки создают и меняют через коллекцию ShipmentCollection, которую возвращает метод заказа Order::getShipmentCollection().

Службы доставки подключаются классом Bitrix\Sale\Delivery\Services\Manager.

|

|| Объект | Роль || || Bitrix\Sale\ShipmentCollection | Коллекция отгрузок заказа. Создает отгрузки и управляет их состоянием || || Bitrix\Sale\Shipment | Одна отгрузка заказа. Хранит службу доставки, стоимость, статус, трекинг и коллекцию позиций отгрузки || || Bitrix\Sale\ShipmentItemCollection | Коллекция позиций отгрузки. Связывает отгрузку с позициями корзины || || Bitrix\Sale\ShipmentItem | Одна позиция отгрузки: ссылка на позицию корзины, количество и резерв || || Bitrix\Sale\Delivery\Services\Manager | Возвращает список служб доставки и объект службы доставки по идентификатору || || Bitrix\Sale\Delivery\Services\Base | Базовый класс службы доставки || |#

Для отчетов по отгрузкам используйте ShipmentTable и ShipmentItemTable. При изменении доставки работайте через ShipmentCollection и Shipment, чтобы состав отгрузок и пересчеты остались согласованными с заказом.

В коллекции отгрузок есть системная отгрузка. Если ее нет, ShipmentCollection создает ее автоматически и помечает полем SYSTEM = 'Y'. Такая отгрузка нужна объектной модели для внутреннего распределения позиций. В пользовательских сценариях доставки обычно работают с несистемными отгрузками, у которых задана служба доставки и состав доставляемых позиций.

Как работают скидки и купоны

Объект Bitrix\Sale\Discount рассчитывает скидки в заказе. В типовом сценарии перед сохранением заказа вызывается метод Order::doFinalAction(true). Внутри этого действия заказ получает объект скидок, запускает расчет через Discount::calculate() и применяет результат к заказу.

Перед расчетом Order::doFinalAction() выполняет накопленные действия заказа. После успешного расчета скидок метод применяет результат к корзине и заказу, а затем обновляет налоговые данные. Если в заказе нет значимых изменений, метод завершается без полного пересчета.

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

|

|| Класс | Что хранит или выполняет || || Bitrix\Sale\Discount | Рассчитывает правила работы с корзиной для корзины или заказа || || Bitrix\Sale\DiscountCouponsManager | Управляет купонами, которые участвуют в расчете скидок || || Bitrix\Sale\OrderDiscount | Сохраняет результат расчета скидок заказа || || Bitrix\Sale\Internals\OrderDiscountTable | Сохраненные скидки заказа || || Bitrix\Sale\Internals\OrderCouponsTable | Купоны, примененные или сохраненные для заказа || || Bitrix\Sale\Internals\OrderModulesTable | Модули, участвующие в сохраненных скидках заказа || || Bitrix\Sale\Internals\OrderDiscountDataTable | Служебные данные сохраненных скидок заказа || || Bitrix\Sale\Internals\OrderRulesTable | Результаты применения правил скидок || || Bitrix\Sale\Internals\OrderRulesDescrTable | Описания примененных правил скидок || |#

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

Связь с каталогом и резервированием

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

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

|

|| Уровень | Что хранит | Где смотреть || || Товар каталога | Товар, торговое предложение, базовые цены, склады и остатки | Модуль catalog || || Позиция корзины | Товар в корзине или заказе: PRODUCT_ID, MODULE, QUANTITY, PRICE, CURRENCY, VAT_RATE, RESERVED, RESERVE_QUANTITY | Классы Basket, BasketItem, BasketTable || || Позиция отгрузки | Какое количество позиции корзины входит в конкретную отгрузку и сколько зарезервировано по отгрузке | ShipmentItem, ShipmentItemTable || |#

Резервирование связано с корзиной и отгрузками. В объектной модели для резервов используются классы ReserveQuantity и сервисы из пространства имен Bitrix\Sale\Reservation.

|

|| Класс | Роль || || Bitrix\Sale\ReserveQuantity | Объект зарезервированного количества. Сохраняется как часть коллекций заказа || || Bitrix\Sale\Reservation\BasketReservationService | Сервис строк резервирования корзины. Добавляет, обновляет и удаляет резерв, а также пишет историю резерва || || Bitrix\Sale\Reservation\AvailableQuantityCalculator | Рассчитывает доступное количество с учетом складских остатков и истории резервирования || || Bitrix\Sale\Helpers\ReservedProductCleaner | Пошагово очищает устаревшие резервы || |#

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

События и пересчеты при сохранении

Сохранение заказа не ограничивается записью через OrderTable. Объект заказа выполняет последовательность операций:

  1. Вызывает событие перед сохранением заказа.

  2. Проверяет данные заказа и дочерних объектов.

  3. Передает позиции корзины провайдеру каталога. Провайдер обрабатывает товарные данные, резервы и списание товаров.

  4. Добавляет или обновляет запись заказа.

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

  6. Сохраняет результат расчета скидок.

  7. Генерирует кассовые документы, если они нужны для заказа, и сохраняет признаки проблем у заказа, оплат или отгрузок.

  8. Вызывает события после сохранения, обрабатывает отложенные события и обновляет историю.

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