Базовые настройки задают контекст заказа: где оформляется покупка, кто покупатель, как принять оплату и доставить товар. При программном оформлении заказа код использует идентификаторы этих настроек вместо ручного выбора в административном интерфейсе.
Модель заказа описана в статье Схема работы интернет-магазина и основные объекты.
Примечание
Чтобы работать с API интернет-магазина, подключите модуль sale. Для сценариев с валютами нужен модуль currency, а для цен товаров, НДС, единиц измерения и округления — модуль catalog.
Настроить магазин с нуля
Перед созданием заказа настройте данные, от которых зависят оформление, оплата и доставка. Если настройка уже есть в административном интерфейсе, не создавайте запись повторно из кода. Получите существующую настройку и используйте ее идентификатор.
Последовательность подготовки:
-
Определите сайт для оформления заказа и укажите сайт-магазин в настройках модуля. Идентификатор сайта понадобится в заказе, типах плательщиков, свойствах заказа, доставках и оплатах.
-
Настройте каталог: товары, типы цен, НДС, единицы измерения и доступ к ценам. Если заказ должен учитывать остатки, резервирование или списание, подготовьте склады. Настройки каталога относятся к модулю
catalogи описаны в статьях Базовые настройки каталога и Складской учет. -
Подготовьте товар с ценой в нужной валюте. Валюта товара попадет в корзину и дальше перейдет в заказ.
-
Создайте тип плательщика. Он определит, какие свойства заказа нужно заполнять покупателю.
-
Создайте группы и свойства заказа. Добавьте свойства, обязательные для выбранного типа плательщика и сценария. Для доставки обычно нужны адрес или местоположение.
-
Настройте хотя бы одну службу доставки, если заказ должен содержать отгрузку.
-
Настройте хотя бы одну платежную систему, если заказ должен содержать оплату.
-
Создайте компанию, если оплаты, доставки, кассы или документы должны работать от имени конкретного юридического лица продавца.
-
Проверьте, что код может получить идентификаторы, которые использует сценарий: тип плательщика, свойства заказа, а при необходимости — службу доставки, платежную систему и компанию.
Товары, доставки, оплаты, кассы и налоги настраиваются в отдельных сценариях: Доставка и отгрузки, Оплаты и платежные системы, Кассы и чеки и Местоположения и налоги.
Указать сайт-магазин и валюту по умолчанию
Перед созданием заказов проверьте параметры модуля sale в разделе Настройки > Настройки продукта > Настройки модулей > Интернет-магазин.
-
Указать сайты, которые являются магазинами — отметьте сайты, на которых оформляются заказы. Сайт нужно указать даже в системе с одним сайтом.
-
Валюта по умолчанию — задает валюту для представления стоимости товаров, суммы продаж и других данных в административном разделе. Настройка не заменяет валюту цены товара.
-
Валюта в дополнительных параметрах сайта — задает валюту публичной части сайта. Если цена товара задана в другой валюте, модуль использует настройки валют для пересчета.
Эти параметры можно задать через код. В примере:
-
$siteId— идентификатор сайта, -
$currency— код валюты для настройки магазина.
Замените s1 и RUB на собственные значения.
if (!\Bitrix\Main\Loader::includeModule('sale'))
{
throw new \RuntimeException('Модуль sale не установлен');
}
$siteId = 's1';
$currency = 'RUB';
\Bitrix\Main\Config\Option::set('sale', 'default_currency', $currency);
\Bitrix\Main\Config\Option::set('sale', 'SHOP_SITE_' . $siteId, $siteId);
$siteCurrency = \Bitrix\Sale\Internals\SiteCurrencyTable::getByPrimary($siteId)->fetch();
if ($siteCurrency)
{
$result = \Bitrix\Sale\Internals\SiteCurrencyTable::update($siteId, [
'CURRENCY' => $currency,
]);
}
else
{
$result = \Bitrix\Sale\Internals\SiteCurrencyTable::add([
'LID' => $siteId,
'CURRENCY' => $currency,
]);
}
if (!$result->isSuccess())
{
throw new \RuntimeException(implode('; ', $result->getErrorMessages()));
}
Параметр default_currency задает валюту по умолчанию, SHOP_SITE_s1 отмечает сайт s1 как магазин, а SiteCurrencyTable сохраняет валюту публичной части сайта.
Методы Option::set() не возвращают объект результата, поэтому код проверяет результат только после сохранения валюты сайта.
Учесть валюту цены товара
Цена товара хранит свою валюту в модуле catalog. Заказ не получает ее из настроек магазина напрямую. Код берет значение из цены товара или торгового предложения.
При добавлении товара в корзину позиция получает цену и валюту товара. Затем это значение участвует в суммах заказа, оплате и доставке.
Если корзина создана, берите значение из ее позиции. Если корзины нет, передайте в Order::create() код из цены товара. При отличии от валюты публичной части сайта модуль выполнит пересчет по настройкам валют.
Совет
Товары, цены и валюты описаны в материале Базовые настройки каталога.
Определить обязательный минимум
Не все настройки нужны каждому магазину. Для создания заказа подготовьте сайт, валюту, тип плательщика и товар с ценой. Заполните только те свойства заказа, которые обязательны для выбранного типа плательщика и текущего сценария.
Платежная система нужна, если на текущем этапе создается оплата. Служба доставки и адресные свойства нужны, если заказ содержит пользовательскую отгрузку с доставкой. Заказ можно впервые сохранить без оплаты и пользовательской отгрузки, а затем добавить их отдельным изменением через коллекции заказа.
Варианты первого сохранения описаны в разделе Создать оплату и отгрузку независимо.
|
|| Сценарий | Что добавить к общему минимуму | Что можно отложить || || Цифровой товар с немедленной оплатой | Платежную систему и обязательные свойства выбранного типа плательщика | Службы доставки, адресные свойства, заявки в транспортные службы || || Заказ с отложенной оплатой и доставкой | Обязательные свойства выбранного типа плательщика | Платежную систему, службу доставки и адресные свойства до этапа, когда появятся оплата и отгрузка || || Физический товар с доставкой | Службу доставки, адрес или местоположение. Если заказ должен учитывать остатки или списание, нужны склады | Собственные обработчики доставки, дополнительные услуги доставки, сложные статусы || || Заказ юридического лица | Тип плательщика для юридического лица, реквизиты в свойствах заказа, компанию продавца | Правила компаний, кассы, печатные формы и документы, если они не нужны в первом сценарии || || Магазин с доставкой, кассами и фискализацией | Службу доставки, компанию, кассу и правила печати чеков | Собственные платежные обработчики, собственные обработчики доставки и сложные правила компаний || |#
Создать тип плательщика
Тип плательщика определяет набор свойств заказа, ограничения оплат и доставок, бизнес-смыслы платежных документов. Для физического и юридического лица обычно создают разные типы плательщиков.
Создайте тип плательщика через \Bitrix\Sale\Internals\PersonTypeTable::add(). Перед созданием проверьте, нет ли типа плательщика с таким кодом.
Поля типа плательщика:
-
LID— сайт, для которого создается тип плательщика. -
NAME— название типа плательщика в административном интерфейсе. -
CODE— код типа плательщика. Используйте код, чтобы повторно найти настройку. -
SORT— порядок показа в списках. -
ACTIVE— активность типа плательщика. ЗначениеYвключает тип. -
ENTITY_REGISTRY_TYPE— область применения. Для заказов передайте\Bitrix\Sale\Registry::REGISTRY_TYPE_ORDER.
$personTypeCode = 'PERSON';
$personType = \Bitrix\Sale\Internals\PersonTypeTable::getList([
'select' => ['ID'],
'filter' => [
'=CODE' => $personTypeCode,
'=ENTITY_REGISTRY_TYPE' => \Bitrix\Sale\Registry::REGISTRY_TYPE_ORDER,
],
'limit' => 1,
])->fetch();
if ($personType)
{
$personTypeId = (int)$personType['ID'];
}
else
{
$result = \Bitrix\Sale\Internals\PersonTypeTable::add([
'LID' => $siteId,
'NAME' => 'Физическое лицо',
'CODE' => $personTypeCode,
'SORT' => 100,
'ACTIVE' => 'Y',
'ENTITY_REGISTRY_TYPE' => \Bitrix\Sale\Registry::REGISTRY_TYPE_ORDER,
]);
if (!$result->isSuccess())
{
throw new \RuntimeException(implode('; ', $result->getErrorMessages()));
}
$personTypeId = (int)$result->getId();
}
В результате переменная $personTypeId содержит идентификатор типа плательщика. Он нужен для групп свойств, свойств заказа, ограничений оплат и доставок.
После создания привяжите тип плательщика к сайту через \Bitrix\Sale\Internals\PersonTypeSiteTable. Без этой связи \Bitrix\Sale\PersonType::load($siteId) не вернет тип для сайта.
Для привязки передайте PERSON_TYPE_ID — идентификатор типа плательщика и SITE_ID — идентификатор сайта.
$personTypeSite = \Bitrix\Sale\Internals\PersonTypeSiteTable::getList([
'select' => ['PERSON_TYPE_ID', 'SITE_ID'],
'filter' => [
'=PERSON_TYPE_ID' => $personTypeId,
'=SITE_ID' => $siteId,
],
'limit' => 1,
])->fetch();
if (!$personTypeSite)
{
$result = \Bitrix\Sale\Internals\PersonTypeSiteTable::add([
'PERSON_TYPE_ID' => $personTypeId,
'SITE_ID' => $siteId,
]);
if (!$result->isSuccess())
{
throw new \RuntimeException(implode('; ', $result->getErrorMessages()));
}
}
После привязки тип плательщика доступен для сайта.
Чтобы проверить результат, получите активные типы плательщиков для сайта через \Bitrix\Sale\PersonType::load(). Метод возвращает массив записей, отсортированных по SORT и ID.
$personTypes = \Bitrix\Sale\PersonType::load($siteId);
if (!$personTypes)
{
throw new \RuntimeException('Для сайта не настроены типы плательщиков');
}
Создать группу свойств заказа
Свойства заказа нужно привязать к группе. Группа помогает разделить контактные данные, адрес доставки, реквизиты юридического лица и служебные поля.
Создайте группу через \Bitrix\Sale\Internals\OrderPropsGroupTable::add(). Перед созданием найдите группу по коду внутри нужного типа плательщика.
В метод передайте параметры:
-
PERSON_TYPE_ID— идентификатор типа плательщика, для которого создается группа. -
NAME— название группы в форме заказа и административном интерфейсе. -
CODE— символьный код группы. Используйте его, чтобы повторно найти группу и не создать дубль.
$propertyGroupCode = 'CONTACTS';
$propertyGroup = \Bitrix\Sale\Internals\OrderPropsGroupTable::getList([
'select' => ['ID'],
'filter' => [
'=PERSON_TYPE_ID' => $personTypeId,
'=CODE' => $propertyGroupCode,
],
'limit' => 1,
])->fetch();
if ($propertyGroup)
{
$propertyGroupId = (int)$propertyGroup['ID'];
}
else
{
$result = \Bitrix\Sale\Internals\OrderPropsGroupTable::add([
'PERSON_TYPE_ID' => $personTypeId,
'NAME' => 'Контактные данные',
'CODE' => $propertyGroupCode,
'SORT' => 100,
]);
if (!$result->isSuccess())
{
throw new \RuntimeException(implode('; ', $result->getErrorMessages()));
}
$propertyGroupId = (int)$result->getId();
}
В результате переменная $propertyGroupId содержит идентификатор группы. Передайте идентификатор группы в свойства заказа через PROPS_GROUP_ID.
Создать свойства заказа
Свойства заказа хранят контактные, адресные и служебные данные оформления: телефон, email, адрес доставки, ИНН, комментарии. Набор свойств зависит от типа плательщика.
Не смешивайте свойства заказа с товарными свойствами. Свойства заказа относятся к оформлению в sale, а характеристики товара относятся к iblock и catalog.
Создайте свойство с помощью \Bitrix\Sale\Internals\OrderPropsTable::add(). Минимально нужны PERSON_TYPE_ID, NAME, TYPE и PROPS_GROUP_ID. Перед созданием найдите свойство по коду внутри типа плательщика.
Поля свойства заказа:
-
PERSON_TYPE_ID— тип плательщика, для которого создается свойство. -
PROPS_GROUP_ID— группа свойств. -
NAME— название свойства в форме заказа и административном интерфейсе. -
CODE— символьный код группы. -
TYPE— тип значения свойства. В примерах используется строкаSTRING. -
REQUIRED— обязательность заполнения, значениеYделает свойство обязательным. -
ENTITY_REGISTRY_TYPE— область применения. Для свойств заказа передайте\Bitrix\Sale\Registry::REGISTRY_TYPE_ORDER. -
IS_EMAIL,IS_PHONE,IS_ADDRESS,IS_ADDRESS_TO,IS_FILTERED— служебные флаги роли свойства. Они показывают системе, что свойство хранит email, телефон, адрес, адрес доставки или доступно для фильтрации.
$emailProperty = \Bitrix\Sale\Internals\OrderPropsTable::getList([
'select' => ['ID'],
'filter' => [
'=PERSON_TYPE_ID' => $personTypeId,
'=CODE' => 'EMAIL',
],
'limit' => 1,
])->fetch();
if ($emailProperty)
{
$emailPropertyId = (int)$emailProperty['ID'];
}
else
{
$result = \Bitrix\Sale\Internals\OrderPropsTable::add([
'PERSON_TYPE_ID' => $personTypeId,
'PROPS_GROUP_ID' => $propertyGroupId,
'NAME' => 'Email',
'CODE' => 'EMAIL',
'TYPE' => 'STRING',
'REQUIRED' => 'Y',
'ACTIVE' => 'Y',
'SORT' => 100,
'IS_EMAIL' => 'Y',
'IS_FILTERED' => 'Y',
'ENTITY_REGISTRY_TYPE' => \Bitrix\Sale\Registry::REGISTRY_TYPE_ORDER,
]);
if (!$result->isSuccess())
{
throw new \RuntimeException(implode('; ', $result->getErrorMessages()));
}
$emailPropertyId = (int)$result->getId();
}
В результате переменная $emailPropertyId содержит идентификатор свойства email. Значение email покупателя заполняется в PropertyValueCollection для найденного свойства.
Для телефона создайте отдельное свойство. Флаг IS_PHONE сообщает системе, что свойство хранит телефон покупателя.
$phoneProperty = \Bitrix\Sale\Internals\OrderPropsTable::getList([
'select' => ['ID'],
'filter' => [
'=PERSON_TYPE_ID' => $personTypeId,
'=CODE' => 'PHONE',
],
'limit' => 1,
])->fetch();
if (!$phoneProperty)
{
$result = \Bitrix\Sale\Internals\OrderPropsTable::add([
'PERSON_TYPE_ID' => $personTypeId,
'PROPS_GROUP_ID' => $propertyGroupId,
'NAME' => 'Телефон',
'CODE' => 'PHONE',
'TYPE' => 'STRING',
'REQUIRED' => 'Y',
'ACTIVE' => 'Y',
'SORT' => 110,
'IS_PHONE' => 'Y',
'ENTITY_REGISTRY_TYPE' => \Bitrix\Sale\Registry::REGISTRY_TYPE_ORDER,
]);
if (!$result->isSuccess())
{
throw new \RuntimeException(implode('; ', $result->getErrorMessages()));
}
}
В типе плательщика появится активное обязательное свойство телефона с кодом PHONE.
Если магазин продает физические товары с доставкой, добавьте свойства для адреса или местоположения. Без адресных данных служба доставки не сможет проверить ограничения и рассчитать стоимость для покупателя.
Совет
Подробно о местоположениях читайте в статье Местоположения и налоги.
Минимальное адресное свойство можно создать как контактные свойства. Флаг IS_ADDRESS сообщает системе, что свойство хранит адрес покупателя.
$addressProperty = \Bitrix\Sale\Internals\OrderPropsTable::getList([
'select' => ['ID'],
'filter' => [
'=PERSON_TYPE_ID' => $personTypeId,
'=CODE' => 'ADDRESS',
],
'limit' => 1,
])->fetch();
if (!$addressProperty)
{
$result = \Bitrix\Sale\Internals\OrderPropsTable::add([
'PERSON_TYPE_ID' => $personTypeId,
'PROPS_GROUP_ID' => $propertyGroupId,
'NAME' => 'Адрес доставки',
'CODE' => 'ADDRESS',
'TYPE' => 'STRING',
'REQUIRED' => 'Y',
'ACTIVE' => 'Y',
'SORT' => 120,
'IS_ADDRESS' => 'Y',
'IS_ADDRESS_TO' => 'Y',
'ENTITY_REGISTRY_TYPE' => \Bitrix\Sale\Registry::REGISTRY_TYPE_ORDER,
]);
if (!$result->isSuccess())
{
throw new \RuntimeException(implode('; ', $result->getErrorMessages()));
}
}
После создания адресное свойство доступно по PERSON_TYPE_ID и CODE.
Для заказа юридического лица добавьте отдельные свойства: название компании, ИНН, адрес и контактное лицо. Создайте их аналогично, как email и телефон. Задайте CODE, название, тип и группу свойств.
Совет
Как заполнить значения, настроить пользовательские типы и отличить свойства заказа от товарных свойств, читайте в статье Свойства заказа.
Добавить собственный статус заказа или доставки
Статусы задают этапы обработки. Для заказа используйте тип \Bitrix\Sale\Internals\StatusTable::TYPE_ORDER, для доставки — \Bitrix\Sale\Internals\StatusTable::TYPE_SHIPMENT.
Статус не обязателен для первого заказа, если хватает стандартных статусов. Добавьте собственный статус, если бизнес-процессу нужен отдельный этап обработки.
В метод \Bitrix\Sale\Internals\StatusTable::add() передайте параметры:
-
ID— код статуса. В примере используетсяVP. -
TYPE— тип статуса: заказ или доставка. -
NOTIFY— признак отправки уведомления при смене статуса. -
COLOR— цвет статуса в интерфейсе.
$statusId = 'VP';
$status = \Bitrix\Sale\Internals\StatusTable::getById($statusId)->fetch();
if (!$status)
{
$result = \Bitrix\Sale\Internals\StatusTable::add([
'ID' => $statusId,
'TYPE' => \Bitrix\Sale\Internals\StatusTable::TYPE_ORDER,
'SORT' => 200,
'NOTIFY' => 'Y',
'COLOR' => '#F2C94C',
]);
if (!$result->isSuccess())
{
throw new \RuntimeException(implode('; ', $result->getErrorMessages()));
}
}
Код создает статус с кодом $statusId. Статус и его название хранятся отдельно. Чтобы статус отображался в интерфейсе, добавьте языковую запись через \Bitrix\Sale\Internals\StatusLangTable.
Передайте параметры:
-
STATUS_ID— код статуса, -
LID— код языка, -
NAME— название статуса, -
DESCRIPTION— описание статуса.
$statusLang = \Bitrix\Sale\Internals\StatusLangTable::getByPrimary([
'STATUS_ID' => $statusId,
'LID' => 'ru',
])->fetch();
if (!$statusLang)
{
$result = \Bitrix\Sale\Internals\StatusLangTable::add([
'STATUS_ID' => $statusId,
'LID' => 'ru',
'NAME' => 'Проверяется менеджером',
'DESCRIPTION' => 'Заказ ожидает проверки менеджером',
]);
if (!$result->isSuccess())
{
throw new \RuntimeException(implode('; ', $result->getErrorMessages()));
}
}
После добавления языковой записи статус отображается на русском языке с названием Проверяется менеджером.
Совет
О правах на смену статусов и событиях обработки читайте в статье Статусы и события. Общие права доступа к операциям модуля sale описаны в материале Права доступа.
Создать компанию
Компания в модуле sale описывает юридическое лицо продавца. Компания может участвовать в правилах доступности оплат, доставок и касс.
Создайте компанию через \Bitrix\Sale\Internals\CompanyTable::add(). Минимально нужно передать название. Если используете код компании, заранее проверьте, нет ли такой записи.
В метод передайте параметры:
-
NAME— название юридического лица продавца. -
CODE— символьный код компании. Используйте его, чтобы повторно найти компанию и не создать дубль. -
ADDRESS— адрес компании для документов и связанных сценариев.
Поля CODE, ACTIVE и SORT уже описаны выше.
$companyCode = 'romashka';
$company = \Bitrix\Sale\Internals\CompanyTable::getList([
'select' => ['ID'],
'filter' => ['=CODE' => $companyCode],
'limit' => 1,
])->fetch();
if ($company)
{
$companyId = (int)$company['ID'];
}
else
{
$result = \Bitrix\Sale\Internals\CompanyTable::add([
'NAME' => 'ООО Ромашка',
'CODE' => $companyCode,
'ACTIVE' => 'Y',
'SORT' => 100,
'ADDRESS' => 'Москва, ул. Примерная, д. 1',
]);
if (!$result->isSuccess())
{
throw new \RuntimeException(implode('; ', $result->getErrorMessages()));
}
$companyId = (int)$result->getId();
}
В результате переменная $companyId содержит идентификатор компании.
Чтобы использовать компанию в оплате или отгрузке, проверьте доступность через \Bitrix\Sale\Services\Company\Manager. Метод getAvailableCompanyIdByEntity() возвращает первую активную компанию, которая проходит правила для переданного объекта. В примере $payment содержит объект оплаты из заказа.
Передайте в метод объект оплаты или отгрузки и режим проверки ограничений. В примере используется клиентский режим MODE_CLIENT.
$availableCompanyId = \Bitrix\Sale\Services\Company\Manager::getAvailableCompanyIdByEntity(
$payment,
\Bitrix\Sale\Services\Company\Restrictions\Manager::MODE_CLIENT
);
if ($availableCompanyId > 0)
{
$payment->setField('COMPANY_ID', $availableCompanyId);
}
Положительное число в результате — идентификатор доступной компании. Код записывает идентификатор в поле COMPANY_ID объекта оплаты.
Совет
Правила компаний для оплат, доставок и касс описаны в статьях Оплаты и платежные системы, Доставка и отгрузки и Кассы и чеки.
Настроить службы доставки
Служба доставки описывает способ доставки. В заказе выбранная служба сохраняется в отгрузке. Для базовой подготовки достаточно одной доступной службы.
Активность службы не гарантирует доступность для конкретной отгрузки. Ограничения могут учитывать сайт, местоположение, сумму заказа, вес, тип плательщика и другие условия. На этом шаге проверьте наличие активной службы, а доступность для отгрузки проверяйте при создании доставки.
Метод getActiveList() возвращает активные службы доставки. Первый аргумент $calculatingOnly ограничивает список службами, которые подходят для расчета. В примере true помогает проверить, есть ли доставка для расчета стоимости.
$deliveryServices = \Bitrix\Sale\Delivery\Services\Manager::getActiveList(true);
if (!$deliveryServices)
{
throw new \RuntimeException('Активные службы доставки не найдены');
}
Пустой массив $deliveryServices означает, что активные службы доставки не найдены. Если список не пустой, используйте идентификатор выбранной службы как DELIVERY_ID при создании отгрузки.
Совет
Про создание собственной службы доставки, расчет стоимости, ограничения, дополнительные услуги и отгрузки читайте в статье Доставка и отгрузки. Заявки в транспортные службы описаны в статье Заявки на доставку.
Настроить платежные системы
Платежная система описывает способ оплаты. В заказе выбранная платежная система сохраняется в объекте оплаты. Если сценарий создает оплату при оформлении заказа, заранее проверьте, что доступен хотя бы один активный способ оплаты.
В примере $order — заказ с корзиной, выбранным сайтом, валютой и типом плательщика. Код создает оплату $payment, задает сумму заказа и передает оплату в getListWithRestrictions(). Метод возвращает платежные системы, которые проходят ограничения.
$paymentCollection = $order->getPaymentCollection();
$payment = $paymentCollection->createItem();
$payment->setField('SUM', $order->getPrice());
$paySystems = \Bitrix\Sale\PaySystem\Manager::getListWithRestrictions(
$payment,
\Bitrix\Sale\Services\PaySystem\Restrictions\Manager::MODE_CLIENT
);
if (!$paySystems)
{
throw new \RuntimeException('Для заказа нет доступных платежных систем');
}
$paySystem = reset($paySystems);
$payment->setFields([
'PAY_SYSTEM_ID' => (int)$paySystem['ID'],
'PAY_SYSTEM_NAME' => $paySystem['NAME'],
]);
В оплату записываются PAY_SYSTEM_ID и PAY_SYSTEM_NAME первой доступной платежной системы. В этом сценарии значения задают до сохранения оплаты в составе заказа.
Совет
Про создание обработчиков платежных систем, ограничения, возвраты, частичную оплату и связь с кассами читайте в материале Оплаты и платежные системы. Работа касс и чеков описана в статье Кассы и чеки.
Получить данные для дальнейшей работы
После настройки код создания заказа получает нужные идентификаторы и значения.
|
|| Данные | Как получить | Где использовать ||
|| SITE_ID — идентификатор сайта | Задается в коде сценария или берется из текущего контекста сайта | Order::create(), фильтры типов плательщика, свойства заказа, доступность доставок и оплат ||
|| Валюта цены товара | Из цены товара или из позиции корзины после добавления товара | Order::create(), позиции корзины, оплаты и доставки ||
|| PERSON_TYPE_ID — тип плательщика | PersonType::load($siteId) или PersonTypeTable::getList() по коду | Order::setPersonTypeId(), фильтр свойств заказа, ограничения оплат и доставок ||
|| PROPS_GROUP_ID — группа свойств | OrderPropsGroupTable::getList() по PERSON_TYPE_ID и CODE | Создание и группировка свойств заказа ||
|| Идентификаторы свойств заказа | OrderPropsTable::getList() по PERSON_TYPE_ID и CODE | Заполнение PropertyValueCollection в заказе ||
|| DELIVERY_ID — служба доставки | Delivery\Services\Manager::getActiveList() или проверка доступности для отгрузки | Отгрузка заказа, расчет доставки ||
|| PAY_SYSTEM_ID — платежная система | PaySystem\Manager::getListWithRestrictions() для объекта оплаты | Объект оплаты в PaymentCollection ||
|| COMPANY_ID — компания продавца | Services\Company\Manager::getAvailableCompanyIdByEntity() | Оплата, отгрузка, касса, правила компаний ||
|| Статус заказа или доставки | OrderStatus::getList(), DeliveryStatus::getList() или собственный код статуса | Смена состояния заказа или отгрузки, проверка прав на операции ||
|#
Проверить настройки перед созданием заказа
После сбора идентификаторов проверьте, что код читает настройки из таблицы выше и не подставляет произвольные значения. Если настройка не найдена, вернитесь к нужному блоку.
|
|| Что не найдено | Что проверить | Куда перейти ||
|| Валюта цены товара | Задана ли цена товара в нужной валюте, не расходится ли валюта позиции корзины с суммами заказа, оплаты и доставки | раздел Учесть валюту цены товара и статья Базовые настройки каталога ||
|| Тип плательщика | Активен ли тип плательщика, привязан ли он к сайту через PersonTypeSiteTable | раздел Создать тип плательщика ||
|| Свойство заказа | Есть ли группа свойств и активное свойство с нужным CODE для выбранного типа плательщика | раздел Создать свойства заказа и статья Свойства заказа ||
|| Служба доставки | Есть ли активная служба доставки и проходят ли ограничения для отгрузки | материал Доставка и отгрузки ||
|| Платежная система | Активна ли платежная система и проходит ли ограничения для оплаты | материал Оплаты и платежные системы ||
|| Компания | Активна ли компания и проходит ли она правила для оплаты, отгрузки или кассы | раздел Создать компанию ||
|| Товар, цена или НДС | Создан ли товар, задана ли цена, доступен ли тип цены пользователю, настроен ли НДС | Статья Базовые настройки каталога ||
|| Склад и остатки | Создан ли склад, есть ли остаток товара, если сценарий использует складской учет, резервирование или списание | Статья Складской учет ||
|#
Пример для короткой проверки создания заказа:
$siteId = 's1'; // идентификатор сайта, для которого создается заказ
$userId = 1; // идентификатор пользователя, на которого создается заказ
$currency = 'RUB'; // валюта цены товара или позиции корзины
$personTypes = \Bitrix\Sale\PersonType::load($siteId); // идентификатор активного типа плательщика для сайта
if (!$personTypes)
{
throw new \RuntimeException('Для сайта не настроены типы плательщиков');
}
$personType = reset($personTypes);
$personTypeId = (int)$personType['ID'];
$order = \Bitrix\Sale\Order::create($siteId, $userId, $currency);
$personTypeResult = $order->setPersonTypeId($personTypeId);
if (!$personTypeResult->isSuccess())
{
throw new \RuntimeException(implode('; ', $personTypeResult->getErrorMessages()));
}
В результате есть объект заказа $order с типом плательщика. Пример не сохраняет заказ: перед сохранением добавьте корзину и заполните обязательные свойства. Если сценарий создает пользовательскую отгрузку или оплату, выберите соответствующую службу доставки или платежную систему.