Перейти к содержимому

Состав заказа и контрагенты при обмене - позиции, покупатели, дубли

Разбираем вторую половину обмена заказами: из чего собираются позиции и как в учётной системе появляются покупатели сайта.

Решение

Смотрим, чем позиция заказа связана с каталогом:

$order = \Bitrix\Sale\Order::load($orderId);
foreach ($order->getBasket() as $item) {
printf("%-30s товар=%d внешний код=%s количество=%s\n",
$item->getField('NAME'), $item->getProductId(),
CIBlockElement::GetByID($item->getProductId())->Fetch()['XML_ID'] ?: '-',
$item->getQuantity());
}

Позиция хранит идентификатор товара на сайте, а в файл обмена уходит его внешний код. Учётная система ищет номенклатуру именно по этому коду, и позиция без него приезжает туда как строка без привязки к номенклатуре.

Разбираем, что делает правка состава в учётной системе:

$basket = $order->getBasket();
foreach ($basket as $item) {
printf("%s: %s x %s\n", $item->getField('NAME'), $item->getQuantity(), $item->getPrice());
}
// после встречной выгрузки набор позиций заменяется тем, что пришло из 1С
// снятые с продажи позиции при этом просто исчезают из заказа

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

Смотрим, что уезжает как контрагент:

foreach ($order->getPropertyCollection() as $prop) {
printf("%-28s код=%-16s значение=%s\n",
$prop->getField('NAME'), $prop->getField('CODE'), $prop->getValue());
}
// в контрагента едут свойства заказа: имя, телефон, почта, реквизиты

Контрагент собирается из свойств заказа, а не из профиля пользователя. Пустое обязательное свойство означает контрагента без реквизитов, и документ в учётной системе получается непроводимым.

Проверяем внешний код покупателя:

SELECT ID, LOGIN, XML_ID FROM b_user WHERE ID IN (SELECT USER_ID FROM b_sale_order WHERE ID = 1234);
-- пустой XML_ID означает, что при следующем обмене создастся новый контрагент

Сопоставление контрагентов при обмене идёт по внешнему коду пользователя сайта. Пустое поле даёт нового контрагента при каждом заказе, и в учётной системе один покупатель оказывается размноженным на десятки карточек.

Заказы без регистрации усложняют эту картину ещё сильнее прочего. Покупатель без учётной записи не имеет внешнего кода вовсе, и разведение таких контрагентов делается уже в учётной системе по телефону или почте.

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

Типичные проблемы

Позиции заказа приезжают строками без номенклатуры.

У товаров на сайте пустой внешний код для обмена данными. Сопоставление номенклатуры идёт именно по этому коду, а не по названию позиции.

После обмена из заказа пропали товары.

Встречная выгрузка из учётной системы переписала состав заказа целиком. Позиции, снятые менеджером в учётной системе, исчезают и на сайте.

Контрагент создаётся заново на каждый заказ.

У пользователя на сайте пустой внешний код для обмена. Без него учётная система не узнаёт прежнего покупателя и каждый раз заводит нового.

Документ в учётной системе не проводится.

У контрагента не заполнены его обязательные реквизиты в карточке. Они собираются из свойств заказа, и пустое свойство даёт пустой реквизит в документе.

Сумма заказа на сайте и в 1С разная.

Скидка применена правилом корзины и не выгружена отдельной строкой. В учётную систему уходит итоговая цена позиции после скидки.

Частые вопросы

Можно ли запретить правку состава заказа из 1С?

Да, встречную выгрузку заказов отключают в настройках узла. Тогда состав меняется только на сайте.

Как выгрузить в 1С реквизиты юридического лица?

Свойствами заказа с нужными кодами. Обмен переносит их в реквизиты контрагента по сопоставлению кодов.

Что делать с уже размноженными контрагентами?

Свести их в учётной системе и записать внешний код на сайт. Без второго шага дубли появятся снова.

Почему в заказе появилась позиция доставки?

Доставка выгружается отдельной строкой документа. Так учётная система видит её сумму и ставку налога.

Смежное

Первоисточник