Состав заказа и контрагенты при обмене - позиции, покупатели, дубли
Разбираем вторую половину обмена заказами: из чего собираются позиции и как в учётной системе появляются покупатели сайта.
Решение
Смотрим, чем позиция заказа связана с каталогом:
$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С реквизиты юридического лица?
Свойствами заказа с нужными кодами. Обмен переносит их в реквизиты контрагента по сопоставлению кодов.
Что делать с уже размноженными контрагентами?
Свести их в учётной системе и записать внешний код на сайт. Без второго шага дубли появятся снова.
Почему в заказе появилась позиция доставки?
Доставка выгружается отдельной строкой документа. Так учётная система видит её сумму и ставку налога.
Смежное
- Обмен заказами с 1С - оглавление подтемы
- Обмен заказами с 1С: выгрузка на сайт и возврат статусов - настройка обмена целиком
- Не выгружаются заказы в 1С: разбор причин - когда заказы не уезжают вовсе
- Свойства заказа: свои поля, обязательность и вывод - откуда берутся реквизиты
- Обмен с 1С и HTTP - устройство обмена целиком
- Обмен заказами изнутри: документ, связь, перезапись - как позиции сопоставляются при разборе