Начиная с версии ядра 16.x используется новая версия магазина 1C Битрикс, являющаяся частью ядра Битрикс D7, при этом все классы для работы с интернет-магазином собраны в модуле sale, подключите пространство имён модуля интернет-магазин чтобы заработали примеры ниже.


use Bitrix\Sale;

Заказ (Sale\Order)

Заказ представляет собой объект класса Bitrix\Sale\Order. Нужно запомнить, что пока не вызван метод save() этот объект необязательно связан с сохранённым заказом. Также пока вы не вызовете save(), изменения в заказе не будут сохранены в базе данных.

Существующий заказ можно получить по ID или номеру заказа (они могут отличаться):


/** int $orderId идентификатор заказа */
$order = Sale\Order::load($orderId);

/** mixed $orderNumber номер заказа */
$order = Sale\Order::loadByAccountNumber($orderNumber);

Если вам нужно получить список заказа, воспользуйтесь методом getList()

$days = 10;
$limit = 10;
$arOrders = \Bitrix\Sale\Order::getList([
	'select' => ['ID'],
	'filter' => [
		'>=DATE_INSERT' => date('d.m.Y', time() - (60 * 60 * 24 * $days)),
		'CANCELED' =>'N', //Заказ не отменён
		'PROPERTY.ORDER_PROPS_ID' => ORDER_PROPERTY_ID,
		'!PROPERTY.VALUE' => 'Y', //Свойство заказа ORDER_PROPERTY_ID имеет значение Y
	],
	'order' => ['ID' => 'DESC'],
	'limit' => $limit
])->fetchAll();

В данном примере, мы получаем 10 заказов, за последние 10 дней, у которых свойство CANCELED = N , т.е. заказ не отменён, а так же не стандартное свойство ORDER_PROPERTY_ID имеет значение Y. В фильтре нельзя указать код свойства, поэтому приходится выкручиваться и хранить например в константе (как в примере) идентификатор нужного свойства.

Доступ к полям заказа

Ключевые поля заказа можно получить используя следующие методы:

$order->getId(); // ID заказа
$order->getSiteId(); // ID сайта
$order->getDateInsert(); // объект Bitrix\Main\Type\DateTime
$order->getPersonTypeId(); // ID типа покупателя
$order->getUserId(); // ID пользователя

$order->getPrice(); // Сумма заказа
$order->getDiscountPrice(); // Размер скидки
$order->getDeliveryPrice(); // Стоимость доставки
$order->getSumPaid(); // Оплаченная сумма
$order->getCurrency(); // Валюта заказа

$order->isPaid(); // true, если оплачен
$order->isAllowDelivery(); // true, если разрешена доставка
$order->isShipped(); // true, если отправлен
$order->isCanceled(); // true, если отменен


Так же есть универсальный метод getField() при помощи которого поле заказа можно получить по имени:

$order->getField("ORDER_WEIGHT"); // Вес заказа
$order->getField('PRICE'); // Сумма заказа

Для изменения поля, применяется "обратный" метод setField():
//Задаём пользовательский комментарий к заказу
$order->setField('USER_DESCRIPTION', 'Комментарий к текущему заказу заказу');

//Обязательно сохраняем все изменения заказа
$order->save();

Список всех доступных полей можно получить методом getAvailableFields(). Ниже дана таблица с существующими полями заказа, с которыми вы можете работать методами getField() и setField().

Список полей заказа

Код поля заказа Описание.
ID Идентификатор заказа.
LID Код сайта
ACCOUNT_NUMBER Код заказа
TRACKING_NUMBER Трек-номер заказа
PAY_SYSTEM_ID Идентификатор платежной системы
DELIVERY_ID Идентификатор службы доставки
DATE_INSERT Дата добавления заказа в формате текущего сайта
DATE_UPDATE Дата последнего изменения заказа в формате текущего сайта
PERSON_TYPE_ID Идентификатор плательщика
USER_ID Идентификатор пользователя, за кем закреплен заказ
PAYED Признак оплаты заказа (Y/N)
DATE_PAYED Дата оплаты заказа
DATE_INSERT Дата добавления заказа в формате текущего сайта
DATE_UPDATE Дата последнего изменения заказа в формате текущего сайта
EMP_PAYED_ID Идентификатор пользователя оплатившего заказ
DEDUCTED Признак отгрузки заказа (заказ перешёл в статус отгружено и с остатков списался товар) (Y/N).
DATE_DEDUCTED Дата отгрузки заказа.
EMP_DEDUCTED_ID Идентификатор пользователя, отгрузившего заказ
REASON_UNDO_DEDUCTED Комментарий причины отмены отгрузки заказа
STATUS_ID Идентификатор статуса заказа
DATE_STATUS Дата изменения статуса заказа
EMP_STATUS_ID ID пользователя, изменивший статус заказа
MARKED Признак «Проблемы с заказом» (Y/N)
DATE_MARKED Дата выставления флага проблемности заказа
EMP_MARKED_ID Идентификатор пользователя, установивший флаг «Проблемы с заказом»
REASON_MARKED Комментарий причины проблемности заказа
PRICE_DELIVERY Стоимость доставки
ALLOW_DELIVERY Флаг разрешена ли отгрузка заказа (Y/N)
DATE_ALLOW_DELIVERY Дата выставления флага разрешения отгрузки заказа
EMP_ALLOW_DELIVERY_ID Идентификатор пользователя, установивший флаг разрешение отгрузки заказа
RESERVED Признак, товар в заказе зарезервирован (Y/N)
PRICE Стоимость заказа
CURRENCY Валюта заказа
DISCOUNT_VALUE Значение скидки заказа
TAX_VALUE Размер налога на заказ
SUM_PAID Сумма оплаченного заказа
USER_DESCRIPTION Комментарий пользователя оформившего заказ
PAY_VOUCHER_NUM Номер документа оплаты
PAY_VOUCHER_DATE Дата оплаты документа
ADDITIONAL_INFO Дополнительная информация заказа
COMMENTS Комментарии к заказу
COMPANY_ID Идентификатор компании, к которой привязан заказ
CREATED_BY Идентификатор пользователя, кто создал заказ
RESPONSIBLE_ID Идентификатор ответственного пользователя
STAT_GID Код статистики
DATE_PAY_BEFORE Дата предоплаты
DATE_BILL Дата выставления счета
LOCKED_BY Флаг, кто заблокировал заказ
DATE_LOCK Дата, когда был заблокирован заказ
AFFILIATE_ID Идентификатор аффилиата
DELIVERY_DOC_NUM Номер документа отгрузки
DELIVERY_DOC_DATE Дата документа отгрузки
UPDATED_1C Флаг обновления данных в 1C
ORDER_TOPIC Идентификатор темы на форуме, к которому привязан заказ
XML_ID Внешний код заказа
ID_1C Код в 1С
VERSION_1C Версия обмена.
EXTERNAL_ORDER Флаг, определяющий является ли заказ внешним.
STORE_ID Код склада.
CANCELED Флаг отмены заказа.
EMP_CANCELED_ID Идентификатор пользователя, кто отменил заказ.
DATE_CANCELED Дата отмены заказа.
REASON_CANCELED Причина отмены заказа.
DATE_INSERT_FORMAT Дата добавления заказа в формате региональных настроек.
DATE_UPDATE_SHORT Дата обновления заказа в формате региональных настроек.
DATE_STATUS_SHORT Дата смены статуса заказа в формате региональных настроек.
DATE_CANCELED_SHORT Дата отмены заказа в формате региональных настроек.
BY_RECOMMENDATION Флаг оформлен ли заказ по рекомендации.
LOCK_STATUS Код блокировка(green/yelow/green).
LOCK_USER_NAME Имя пользователя, блокирующего заказ.
RESPONSIBLE_LOGIN Логин ответственного за заказ пользователя.
RESPONSIBLE_NAME Имя ответственного за заказ пользователя.
RESPONSIBLE_LAST_NAME Фамилия ответственного за заказ пользователя.
RESPONSIBLE_SECOND_NAME Отчество ответственного за заказ пользователя.
RESPONSIBLE_EMAIL Email ответственного за заказ пользователя.
RESPONSIBLE_WORK_POSITION Должность ответственного за заказ пользователя.
RESPONSIBLE_PERSONAL_PHOTO Фото ответственного за заказ пользователя.
USER_LOGIN Логин пользователя, сделавшего заказ.
USER_NAME Имя пользователя, сделавшего  заказ.
USER_LAST_NAME Фамилия пользователя, сделавшего  заказ
USER_EMAIL Email пользователя, сделавшего  заказ

Связь заказа с другим сущностями

Заказ имеет связь один-ко-многим с несколькими объектами в виде коллекций - коллекция товаров в корзине (Sale\Basket), коллекция отгрузок (Sale\ShipmentCollection), коллекция оплат (Sale\PaymentCollection) и коллекция свойств заказа (Sale\PropertyValueCollection).

Следовательно есть набор методов чтобы получить способы доставки и оплаты указанные в заказе. Вызов:

$paymentIds = $order->getPaymentSystemId();

вернёт массив идентификаторов способов оплаты заказа. Вызов:

$deliveryIds = $order->getDeliverySystemId();

вернёт массив идентификаторов способов доставки. Работу со свойствами заказа следует рассмотреть подробнее.

Корзина заказа (Sale\Basket)

Для получения корзины заказ или связи объекта корзины с текущим заказом используйте следующие методы


/** Sale\Basket $basket */

//Связываем корзину с текущим заказом
$order->setBasket($basket);

//Получить объект корзины из текущего заказа
$basket = $order->getBasket();

Подробнее о работе с корзиной в 1С Битрикс D7 читайте в отдельной статье.

Свойства заказа (Sale\PropertyValueCollection)

Свойства заказа представляют собой объекты класса Bitrix\Sale\PropertyValue, собранные в коллекции propertyCollection объекта заказ. Получить коллекцию можно следующим образом:

$propertyCollection = $order->getPropertyCollection();

Чтобы получить значения всех свойств и групп свойств в коллекции доступны метод:

$commonArray = $propertyCollection->getArray(); // массив ['properties' => [..], 'groups' => [..] ];
$groupArray = $propertyCollection->getGroups(); // массив групп свойства
$arPropertyByGroup = $propertyCollection->getGroupProperties($groupId); // массив свойств, относящихся к определённой группе

Часть свойств заказа в 1С Битрикс имеет предопределённое значение. Например email пользователя, адрес доставки и т.п. в мастере создания свойств, такие специальные свойства помечаются соответствующими атрибутами (вкладка Магазин -> Настройки -> Свойства заказа -> Список свойств):

Параметры свойства заказа

На уровне данных, это атрибуты  IS_EMAIL, IS_PAYER, IS_LOCATION, IS_LOCATION4TAX, IS_PROFILE_NAME, IS_ZIP, IS_PHONE, IS_ADDRESS. Для получения таких свойств заказа, предусмотренны специальные методы:


$email = $propertyCollection->getUserEmail();
$name  = $propertyCollection->getPayerName();
$loc   = $propertyCollection->getDeliveryLocation();
$taxLoc = $propertyCollection->getTaxLocation();
$profName = $propertyCollection->getProfileName();
$zip   = $propertyCollection->getDeliveryLocationZip();
$phone = $propertyCollection->getPhone();
$addr  = $propertyCollection->getAddress();

Если вы знаете идентификатор свойства, вы можете получить его значение общим методом:
//Получение свойства по ID
$someProp = $propertyCollection->getItemByOrderPropertyId($orderPropertyId);

Хотя удобнее получать свойство из коллекции не по ID, а по его коду

//Получение свойства по коду
$someProp = $propertyCollection->getItemByOrderPropertyCode('PROPERTY_CODE');

где PROPERTY_CODE - символьный код свойства заказа.

Значение свойства, это экземпляр класса Bitrix\Sale\PropertyValue, так же имеет набор полезных методов для работы:

$someProp->getValue(); // значение свойства
$someProp->getViewHtml(); // представление значения в читаемом виде

И метаданные свойства:

$arProp  = $somePropValue->getProperty(); // массив данных о самом свойстве
$propId  = $somePropValue->getPropertyId(); // ID свойства
$propName = $somePropValue->getName(); // Название
$isRequired = $somePropValue->isRequired(); // true, если свойство обязательное
$propPerson = $somePropValue->getPersonTypeId(); // Тип плательщика
$propGroup  = $somePropValue->getGroupId(); // ID группы

Если вам нужно изменить значение какого-либо свойства, воспользуйтесь методом setValue()

$someProp->setValue("some value");
$someProp->save();
После манипуляций со свойствами заказа, обязательно нужно сохранить сам заказ иначе он не будет перерассчитан.

$order->save();

Рассмотрим возможности оплаты заказа.

Оплаты заказа (Sale\PaymentCollection)

Получить коллекцию можно следующим образом:

$paymentCollection = $order->getPaymentCollection();

Из полученного объекта коллекции мы можете получить информацию об оплатах и объекте заказа. А именно:

$paymentCollection->isPaid(); // true, если все оплаты оплачены
$paymentCollection->hasPaidPayment(); // true, если хотя бы одна оплата оплачена
$paymentCollection->getPaidSum(); // оплаченная сумма
$paymentCollection->isExistsInnerPayment(); // true, если осуществлена оплата с внутреннего счета

Коллекция состоит из объектов оплаты Sale\Payment и содержит информацию об оплатах, получить доступ к объектам можно перебрав объект коллекции циклом или по индексу массива:
 
//Перебираем объект коллекции
foreach ($paymentCollection as $payment) {

    $sum = $payment->getSum(); // сумма к оплате
    $isPaid = $payment->isPaid(); // true, если оплачена
    $isReturned = $payment->isReturn(); // true, если возвращена

    $ps = $payment->getPaySystem(); // платежная система (объект Sale\PaySystem\Service)
    $psID = $payment->getPaymentSystemId(); // ID платежной системы
    $psName = $payment->getPaymentSystemName(); // название платежной системы
    $isInnerPs = $payment->isInner(); // true, если это оплата с внутреннего счета
}
//Получение объекта оплаты по индексу 
$onePayment = $paymentCollection[0];

Изменить оплату или сделать возврат можно следующими методами:

$onePayment->setPaid("N"); // отмена оплаты
$onePayment->setPaid("Y"); // оплата

/*возврат (деньги возвращаются на внутренний счет или в платежную 
систему, если обработчик реализует интерфейс Sale\PaySystem\IRefund)*/

$onePayment->setReturn("Y"); 

После всех манипуляций нужно сохранять сущность заказа:

$order->save();

Если в вашем компоненте нужно вывести форму оплаты (информацию об оплате и кнопку «Оплатить»), можно воспользоваться следующим способом:
/* $onePayment объект класса Sale\Payment */
$service = Sale\PaySystem\Manager::getObjectById($onePayment->getPaymentSystemId());
$context = \Bitrix\Main\Application::getInstance()->getContext();
$service->initiatePay($onePayment, $context->getRequest());

Вывод

Ядро D7 предоставляет обширный функционал работы с заказами, с более удобной архитектурой и набором методов. Пример создания заказа описан в этой статье.


Читайте также
Создание заказа в 1С Битрикс D7

Создание заказа в 1С Битрикс D7

Рассмотрим пример создания произвольного заказа средствами ядра D7

Работа с корзиной 1С Битрикс D7

Работа с корзиной 1С Битрикс D7

В статье описан процесс работы с объектом корзины в 1С Битрикс D7

Собственный тип пользовательских полей в 1С Битрикс

Собственный тип пользовательских полей в 1С Битрикс

Для решения некоторых задач порой не хватает стандартного набора пользовательских полей поставляемых из «коробки» 1С Битрикс Управление сайтом. Однако вы можете создать свой собственный тип пользовательского поля, определить его внешний вид и даже подключить какие-нибудь сторонние jQuery плагины.


Комментарии
Защита от автоматических сообщений
CAPTCHA
Введите слово на картинке