Базовые настройки интернет-магазина

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

Модель заказа описана в статье Схема работы интернет-магазина и основные объекты.

Чтобы работать с API интернет-магазина, подключите модуль sale. Для сценариев с валютами нужен модуль currency, а для цен товаров, НДС, единиц измерения и округления — модуль catalog.

Настроить магазин с нуля

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

Последовательность подготовки:

  1. Определите сайт для оформления заказа и укажите сайт-магазин в настройках модуля. Идентификатор сайта понадобится в заказе, типах плательщиков, свойствах заказа, доставках и оплатах.

  2. Настройте каталог: товары, типы цен, НДС, единицы измерения и доступ к ценам. Если заказ должен учитывать остатки, резервирование или списание, подготовьте склады. Настройки каталога относятся к модулю catalog и описаны в статьях Базовые настройки каталога и Складской учет.

  3. Подготовьте товар с ценой в нужной валюте. Валюта товара попадет в корзину и дальше перейдет в заказ.

  4. Создайте тип плательщика. Он определит, какие свойства заказа нужно заполнять покупателю.

  5. Создайте группы и свойства заказа. Добавьте свойства, обязательные для выбранного типа плательщика и сценария. Для доставки обычно нужны адрес или местоположение.

  6. Настройте хотя бы одну службу доставки, если заказ должен содержать отгрузку.

  7. Настройте хотя бы одну платежную систему, если заказ должен содержать оплату.

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

  9. Проверьте, что код может получить идентификаторы, которые использует сценарий: тип плательщика, свойства заказа, а при необходимости — службу доставки, платежную систему и компанию.

Товары, доставки, оплаты, кассы и налоги настраиваются в отдельных сценариях: Доставка и отгрузки, Оплаты и платежные системы, Кассы и чеки и Местоположения и налоги.

Указать сайт-магазин и валюту по умолчанию

Перед созданием заказов проверьте параметры модуля 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 с типом плательщика. Пример не сохраняет заказ: перед сохранением добавьте корзину и заполните обязательные свойства. Если сценарий создает пользовательскую отгрузку или оплату, выберите соответствующую службу доставки или платежную систему.

Продолжить изучение