Начиная с версии ядра 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);

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

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

$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().

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

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

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

$paymentIds = $order->getPaymentSystemId();

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

$deliveryIds = $order->getDeliverySystemId();

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

Свойства заказа (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();

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

$somePropValue = $propertyCollection->getItemByOrderPropertyId($orderPropertyId);

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

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

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

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

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

$somePropValue->setValue("some value");
$somePropValue->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 предоставляет обширный функционал работы с заказами, с более удобной архитектурой и набором методов.


Полезная статья?
(Голосов: 4, Рейтинг: 3.09)
Netology
Вам также могут понравиться
Английский для программистов

Английский для программистов

Почему IT-специалисту необходимо освоить английский язык? Разбираем в статье.

Как подключить CSS и JS файлы к шаблону 1С Битрикс

Как подключить CSS и JS файлы к шаблону 1С Битрикс

Как правильно подключать стили и скрипты к шаблону 1С Битрикс.

Генерация оглавления статьи

Генерация оглавления статьи

В статье рассмотрен пример функции для генерации оглавления статьи блога или новости


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