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());