События связанные с отгрузками
Событие сопоставления позиций отгрузки МС с корзиной БУС при импорте отгрузок — [OnBeforeFindBasketItemFromPosition] — описано в разделе События связанные с корзиной.
[OnAfterBuildDemandPushData] Событие после подготовки данных отгрузки для отправки в МС
Событие вызывается при выгрузке отгрузок из БУС в МС, когда модуль уже собрал данные документа отгрузки (demand) для конкретной отгрузки БУС и ещё не отправил их в МС. Работает только в режиме полного обмена отгрузками: вкладка «Отгрузки», «Тип обмена документами отгрузок» — «Полное соответствие отгрузок БУС-МС», обмен включён в направлении из БУС в МС.
Событие срабатывает:
- при сохранении отгрузки в БУС;
- при выгрузке всех отгрузок заказа — в агентах модуля (после создания заказа в МС и при повторной отправке изменений заказа) и после импорта нового заказа из МС по веб-хуку.
Если отгрузка уже есть в МС (найдена по внешнему коду), модуль готовит данные для её обновления, иначе — для создания новой отгрузки. Системные отгрузки БУС не выгружаются, и для них событие не вызывается.
- Описание события
- Пример вызова события
Параметры события
| Параметр | Тип | Описание |
|---|---|---|
order | \Bitrix\Sale\Order | Объект заказа БУС |
orderMs | object | Объект заказа МойСклад, к которому относится отгрузка |
shipment | \Bitrix\Sale\Shipment | Объект отгрузки БУС, для которой подготовлены данные |
result | array | Подготовленный массив данных отгрузки МС. Для существующей отгрузки содержит ключ meta — ссылку на неё в МС (по нему МС поймёт, что документ нужно обновить, а не создать) |
Возвращаемое значение
Верните EventResult::SUCCESS с модифицированным массивом. Массив заменит result перед отправкой в МС.
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $result);
Если вернуть пустой массив, отгрузка не будет отправлена в МС. Возвращаемое значение обязательно должно быть массивом.
//Пример кода нужно вставить в файл init.php
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moysklad',
'OnAfterBuildDemandPushData',
'OnAfterBuildDemandPushDataHandler'
);
function OnAfterBuildDemandPushDataHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$order = $eventParams['order']; // \Bitrix\Sale\Order — заказ БУС
$orderMs = $eventParams['orderMs']; // object — заказ МС
$shipment = $eventParams['shipment']; // \Bitrix\Sale\Shipment — отгрузка БУС
// $result — данные документа отгрузки для МС
// При создании новой отгрузки:
// [
// 'customerOrder' => (object)['meta' => ...], // заказ МС
// 'agent' => (object)['meta' => ...], // контрагент заказа
// 'organization' => (object)['meta' => ...], // организация заказа
// 'vatEnabled' => true,
// 'vatIncluded' => true,
// 'externalCode' => 'XML_ID отгрузки БУС',
// 'store' => ['meta' => ...], // склад
// 'applicable' => true, // проведена, если отгрузка БУС отгружена
// 'description' => 'Комментарий отгрузки',
// 'positions' => [...], // позиции отгрузки
// 'state' => ..., // статус (если настроено соответствие)
// 'attributes' => [...], // доп. поля (если настроены)
// ...
// ]
// При обновлении существующей отгрузки массив содержит ключ 'meta'
// и только изменяемые поля (applicable, description, positions, state и т.д.)
$result = $eventParams['result'];
// Пример: не выгружать в МС отгрузки службы доставки с ID 5
if ((int)$shipment->getField('DELIVERY_ID') === 5) {
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, []);
}
// Пример: дописать в комментарий отгрузки номер заказа сайта
$result['description'] = trim(($result['description'] ?? '') . "\nЗаказ №" . $order->getField('ACCOUNT_NUMBER'));
//Отправляем \Bitrix\Main\EventResult::SUCCESS только в случае, если нужно поменять данные перед отправкой
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $result);
}