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

Несколько баз и организаций - разведение заказов при обмене

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

Решение

Заводим отдельного пользователя обмена на каждую базу:

$user = new CUser();
$user->Add([
'LOGIN' => 'exchange_ut', // вторая база - второй пользователь
'PASSWORD' => $password,
'CONFIRM_PASSWORD' => $password,
'EMAIL' => 'exchange_ut@example.com',
'GROUP_ID' => [$exchangeGroupId],
'ACTIVE' => 'Y',
]);

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

Отмечаем организацию в самом заказе:

use Bitrix\Sale\Internals\OrderPropsTable;
OrderPropsTable::add([
'PERSON_TYPE_ID' => 1,
'NAME' => 'Организация-исполнитель',
'TYPE' => 'ENUM',
'CODE' => 'COMPANY',
'UTIL' => 'Y', // служебное: покупателю показывать не нужно
]);

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

Настраиваем отбор заказов на стороне каждой базы:

// признак ставится при оформлении: по разделу каталога, складу или сайту
$order->getPropertyCollection()->getItemByOrderPropertyCode('COMPANY')
->setValue($companyCode);
$order->save();

Отбор по этому свойству настраивают в узле обмена каждой базы. Без отбора все базы забирают все заказы, и один и тот же документ появляется в трёх местах.

Разделяем заказы по складам отгрузки:

$shipment = $order->getShipmentCollection()->getNotSystemItems()->current();
foreach ($shipment->getShipmentItemCollection() as $item) {
// склад отгрузки хранится у позиции отгрузки, а не у заказа целиком
printf("позиция=%s склад=%s\n", $item->getBasketItem()->getProductId(),
$shipment->getStoreId());
}

Склад отгрузки определяет исполнителя точнее, чем организация. На магазинах с самовывозом из разных точек именно он и становится признаком разделения.

Два сайта в одной базе - зеркальная задача. Там разводить нужно уже не заказы, а сайты: у каждого свой узел обмена и свой префикс номеров, иначе документы с одинаковыми номерами перетирают друг друга.

Схему разделения выбирают по тому, что реально различает заказы. Организация подходит там, где юрлица разные, склад - там, где отгружают из разных точек, узел обмена - там, где базы вообще не связаны между собой. Смешивать два признака в одном отборе не стоит: разбирать такую настройку через год будет некому.

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

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

Один заказ появился в двух базах.

В узлах обмена не настроен отбор. Без него каждая база забирает все доступные документы.

Заказ уехал не в ту организацию.

Признак организации не проставлен при оформлении. Пустое свойство отбор не различает.

Заказы двух сайтов перепутались.

Совпали номера заказов. Каждому сайту задают свой префикс нумерации или разводят их по узлам.

В заказе позиции с неизвестными кодами.

Каталог ведётся в нескольких базах сразу. Внешние коды товаров разъехались между ними.

Обмен второй базы отключает первую.

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

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

Можно ли обойтись одним узлом на две организации?

Только если обе живут в одной базе: тогда организация - это поле документа. Разные базы всегда требуют разных узлов.

Как задать префикс номера заказа для второго сайта?

Настройкой нумерации в модуле продаж: у каждого сайта свой шаблон номера. Это дешевле, чем разбирать пересечения потом.

Что делать, если товар продают обе организации?

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

Как проверить настройку до запуска?

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

Смежное

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