События связанные с заказом
[OnBeforeOrderApiCreate] Событие перед созданием заказа в МС
Событие вызывается перед созданием заказа в МС по API. Необходимо, если нужно модифицировать отправляемый запрос в МС на создание заказа.
- Описание события
- Пример вызова события
- Примеры использования
Параметры события
| Параметр | Тип | Описание |
|---|---|---|
orderId | int | ID заказа в БУС |
orderBx | \Bitrix\Sale\Order | Объект заказа Битрикс |
orderChangesStack | array|null | Массив данных, отправляемых в МС как запрос на создание заказа |
Возвращаемое значение
Верните EventResult::SUCCESS с модифицированным массивом данных. Массив заменит orderChangesStack перед отправкой в МС.
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $orderChangeStack);
//Пример вызова события нужно вставить в файл init.php
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moysklad',
'OnBeforeOrderApiCreate',
'OnBeforeOrderApiCreateHandler'
);
function OnBeforeOrderApiCreateHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$orderId = $eventParams['orderId']; //ID заказа в БУС
// $orderChangesStack — массив данных для создания заказа в МС
// $orderChangesStack = [
// 'name' => '123', // string — номер заказа
// 'externalCode' => '123', // string — внешний код (ID заказа БУС)
// 'description' => 'Комментарий', // string — описание заказа
// 'moment' => '2025-01-01 12:00:00', // string — дата заказа
// 'agent' => (object)[ // object — контрагент
// 'meta' => (object)[
// 'href' => 'https://api.moysklad.ru/api/remap/1.2/entity/counterparty/...',
// 'type' => 'counterparty',
// 'mediaType' => 'application/json'
// ]
// ],
// 'organization' => (object)[ // object — организация
// 'meta' => (object)[...]
// ],
// 'store' => (object)[ // object — склад (если настроен)
// 'meta' => (object)[...]
// ],
// 'state' => (object)[ // object — статус заказа (если настроен)
// 'meta' => (object)[...]
// ],
// 'positions' => [ // array — позиции заказа
// [
// 'quantity' => 1.0,
// 'price' => 10000, // цена в копейках
// 'discount' => 0.0,
// 'assortment' => (object)[
// 'meta' => (object)[...]
// ]
// ]
// ],
// 'attributes' => [ // array — дополнительные поля (если настроены)
// ['id' => '...', 'value' => '...']
// ]
// ];
$orderChangeStack = $eventParams['orderChangesStack']; // массив, который отправляется в МС как запрос на создание заказа
if($orderId > 0){
if($order = \Bitrix\Sale\Order::load($orderId)){
#WORK_AREA#
//здесь работаем с заказом БУС и если нужно меняем массив $orderChangeStack
}
}
//Отправляем \Bitrix\Main\EventResult::SUCCESS только в случае, если нужно поменять данные перед отправкой
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $orderChangeStack);
}
Данным событием можно, например, поменять склад заказа в МС в зависимости от службы доставки. Пример #WORK_AREA# для смены склада от службы доставки:
if ($shipmentCollection = $order->getShipmentCollection()) {
//проходимся по отгрузкам
foreach($shipmentCollection as $shipment){
if(!$shipment->isSystem()){
$deliveryId = (int)$shipment->getField('DELIVERY_ID');
switch($deliveryId){
case 1: //если ID службы доставки = 1
$orderChangeStack['store'] = \Rbs\Moysklad\ApiNew::get('/entity/store/59a4c826-3c54-11ea-0a80-025d0009d1f1', [], 86400 * 365);
break;
case 2: //если ID службы доставки = 2
$orderChangeStack['store'] = \Rbs\Moysklad\ApiNew::get('/entity/store/b36e8e98-713e-11eb-0a80-024f00003b1c', [], 86400 * 365);
break;
}
//ВАЖНО! ID склада можно узнать в самом МС в адресной строке. ID вводится после строки /entity/store/#ID#
break;
}
}
}
Смена организации, проекта и канала продаж по условиям заказа
Подставляем нужную организацию, проект и канал продаж в МойСклад в зависимости от сайта, службы доставки или других свойств заказа Битрикс.
function OnBeforeOrderApiCreateHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$orderId = $eventParams['orderId'];
$orderChangeStack = $eventParams['orderChangesStack'];
if ($orderId > 0 && $order = \Bitrix\Sale\Order::load($orderId)) {
$siteId = $order->getField('LID');
// Маппинг сайтов на UUID сущностей МойСклад
$siteConfig = [
's1' => [
'organization' => 'uuid-организации-для-s1',
'project' => 'uuid-проекта-для-s1',
'salesChannel' => 'uuid-канала-продаж-для-s1',
],
's2' => [
'organization' => 'uuid-организации-для-s2',
'project' => 'uuid-проекта-для-s2',
'salesChannel' => 'uuid-канала-продаж-для-s2',
],
];
if (isset($siteConfig[$siteId])) {
$cfg = $siteConfig[$siteId];
// Организация
$orderChangeStack['organization'] = (object)[
'meta' => (object)[
'href' => 'https://api.moysklad.ru/api/remap/1.2/entity/organization/' . $cfg['organization'],
'type' => 'organization',
'mediaType' => 'application/json',
]
];
// Проект
$orderChangeStack['project'] = (object)[
'meta' => (object)[
'href' => 'https://api.moysklad.ru/api/remap/1.2/entity/project/' . $cfg['project'],
'type' => 'project',
'mediaType' => 'application/json',
]
];
// Канал продаж
$orderChangeStack['salesChannel'] = (object)[
'meta' => (object)[
'href' => 'https://api.moysklad.ru/api/remap/1.2/entity/saleschannel/' . $cfg['salesChannel'],
'type' => 'saleschannel',
'mediaType' => 'application/json',
]
];
}
}
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $orderChangeStack);
}
Назначение организации по типу плательщика
Если в заказе указан юрлицо — отправляем заказ на одну организацию, если физлицо — на другую.
function OnBeforeOrderApiCreateHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$orderId = $eventParams['orderId'];
$orderChangeStack = $eventParams['orderChangesStack'];
if ($orderId > 0 && $order = \Bitrix\Sale\Order::load($orderId)) {
$personTypeId = $order->getPersonTypeId();
// 1 — физлицо, 2 — юрлицо (ID зависят от настроек вашего сайта)
$orgMap = [
1 => 'uuid-организации-для-физлиц',
2 => 'uuid-организации-для-юрлиц',
];
if (isset($orgMap[$personTypeId])) {
$orderChangeStack['organization'] = (object)[
'meta' => (object)[
'href' => 'https://api.moysklad.ru/api/remap/1.2/entity/organization/' . $orgMap[$personTypeId],
'type' => 'organization',
'mediaType' => 'application/json',
]
];
}
}
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $orderChangeStack);
}
[OnAfterOrderApiCreate] Событие после успешного создания заказа в МС
Событие вызывается после успешного создания заказа в МС по API. Необходимо для действий с заказом после создания в МС.
- Описание события
- Пример вызова события
- Примеры использования
Параметры события
| Параметр | Тип | Описание |
|---|---|---|
orderId | int | ID заказа в БУС |
orderMs | object | Объект созданного заказа в МойСклад (ответ API) |
Возвращаемое значение
Ничего возвращать не нужно. Событие информационное — результат не влияет на дальнейшую работу.
//Пример вызова события нужно вставить в файл init.php
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moysklad',
'OnAfterOrderApiCreate',
'OnAfterOrderApiCreateHandler'
);
function OnAfterOrderApiCreateHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$orderId = $eventParams['orderId']; //ID заказа в БУС
// $orderMs — объект заказа, который вернул API МойСклад после создания
// $orderMs = (object)[
// 'id' => '00000000-0000-0000-0000-000000000000', // UUID заказа в МС
// 'name' => '00001', // номер заказа в МС
// 'externalCode' => '123', // внешний код
// 'moment' => '2025-01-01 12:00:00',
// 'sum' => 1000000, // сумма в копейках
// 'meta' => (object)[
// 'href' => 'https://api.moysklad.ru/api/remap/1.2/entity/customerorder/...',
// 'type' => 'customerorder'
// ],
// 'agent' => (object)['meta' => (object)[...]],
// 'organization' => (object)['meta' => (object)[...]],
// 'state' => (object)['name' => 'Новый', 'meta' => (object)[...]],
// 'positions' => (object)['meta' => (object)[...]]
// ];
$orderMs = $eventParams['orderMs']; // объект созданного заказа в МС
if($orderId > 0){
if($order = \Bitrix\Sale\Order::load($orderId)){
#WORK_AREA#
}
}
//возвращать ничего не нужно, т.к. это ни на что не влияет.
}
Сохранение UUID заказа МС в свойство заказа Битрикс
После создания заказа в МойСклад сохраняем его UUID в кастомное свойство заказа БУС для последующего использования в интеграциях.
function OnAfterOrderApiCreateHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$orderId = $eventParams['orderId'];
$orderMs = $eventParams['orderMs'];
if ($orderId > 0 && $order = \Bitrix\Sale\Order::load($orderId)) {
$propertyCollection = $order->getPropertyCollection();
foreach ($propertyCollection as $property) {
if ($property->getField('CODE') === 'MS_ORDER_UUID') {
$property->setValue($orderMs->id);
break;
}
}
$order->save();
}
}
Отправка уведомления менеджеру после создания заказа в МС
Уведомляем ответственного менеджера по email о том, что заказ успешно создан в МойСклад.
function OnAfterOrderApiCreateHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$orderId = $eventParams['orderId'];
$orderMs = $eventParams['orderMs'];
if ($orderId > 0 && $order = \Bitrix\Sale\Order::load($orderId)) {
$responsibleId = $order->getField('RESPONSIBLE_ID');
if ($responsibleId) {
$user = \Bitrix\Main\UserTable::getById($responsibleId)->fetch();
if ($user && $user['EMAIL']) {
\Bitrix\Main\Mail\Event::send([
'EVENT_NAME' => 'MS_ORDER_CREATED',
'LID' => $order->getSiteId(),
'C_FIELDS' => [
'ORDER_ID' => $orderId,
'MS_ORDER_NAME' => $orderMs->name,
'EMAIL_TO' => $user['EMAIL'],
],
]);
}
}
}
}
[OnBeforeSaveOrderChanges] Событие перед изменением заказа из БУС в МС
Событие вызывается каждый раз, когда модуль отправляет данные заказа в МС при обновлении заказа в БУС. Можно применять для модификации отправляемых данных в МС.
- Описание события
- Пример вызова события
- Примеры использования
Параметры события
| Параметр | Тип | Описание |
|---|---|---|
orderId | int | ID заказа в БУС |
orderBx | \Bitrix\Sale\Order | Объект заказа Битрикс |
orderMs | object | Объект заказа МойСклад (текущее состояние в МС) |
orderChangesStack | array | Массив изменений, отправляемых в МС |
Возвращаемое значение
Верните EventResult::SUCCESS с модифицированным массивом изменений. Массив заменит orderChangesStack перед отправкой в МС.
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $orderChangeStack);
//Пример вызова события нужно вставить в файл init.php
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moysklad',
'OnBeforeSaveOrderChanges',
'OnBeforeSaveOrderChangesHandler'
);
function OnBeforeSaveOrderChangesHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$orderId = $eventParams['orderId']; //ID заказа в БУС
// $orderChangesStack — массив изменённых полей для отправки в МС
// Содержит только те поля, которые были изменены
// $orderChangesStack = [
// 'state' => (object)[ // object — новый статус (если изменился)
// 'meta' => (object)[
// 'href' => 'https://api.moysklad.ru/api/remap/1.2/entity/customerorder/metadata/states/...',
// 'type' => 'state'
// ]
// ],
// 'description' => '...', // string — описание (если изменилось)
// 'positions' => [...], // array — позиции (если изменились)
// 'attributes' => [...], // array — дополнительные поля (если изменились)
// ];
$orderChangeStack = $eventParams['orderChangesStack']; // массив, который отправляется в МС как запрос на изменение заказа
if($orderId > 0){
if($order = \Bitrix\Sale\Order::load($orderId)){
#WORK_AREA#
//здесь работаем с заказом БУС и если нужно меняем массив $orderChangeStack
}
}
//Отправляем \Bitrix\Main\EventResult::SUCCESS только в случае, если нужно поменять данные перед отправкой
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $orderChangeStack);
}
Блокировка изменения статуса для определённых заказов
Не даём менять статус в МС для заказов, у которых стоит флаг «Ручное управление» в Битрикс.
function OnBeforeSaveOrderChangesHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$orderId = $eventParams['orderId'];
$orderChangeStack = $eventParams['orderChangesStack'];
if ($orderId > 0 && $order = \Bitrix\Sale\Order::load($orderId)) {
$props = $order->getPropertyCollection();
foreach ($props as $prop) {
if ($prop->getField('CODE') === 'MANUAL_MS_CONTROL' && $prop->getValue() === 'Y') {
// Убираем статус из массива изменений — он не будет отправлен в МС
unset($orderChangeStack['state']);
break;
}
}
}
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $orderChangeStack);
}
Автоматическое обновление описания заказа при смене статуса
При каждом изменении заказа дописываем в описание дату и время последнего обновления.
function OnBeforeSaveOrderChangesHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$orderId = $eventParams['orderId'];
$orderChangeStack = $eventParams['orderChangesStack'];
$orderMs = $eventParams['orderMs'];
// Если меняется статус — добавляем отметку времени в описание
if (isset($orderChangeStack['state'])) {
$currentDescription = $orderMs->description ?? '';
$timestamp = date('d.m.Y H:i');
$orderChangeStack['description'] = $currentDescription . "\nОбновлено: " . $timestamp;
}
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $orderChangeStack);
}
[OnBeforeImportBxOrder] Событие перед началом импорта заказа в БУС из МС
Событие вызывается перед тем, как модуль начнёт создавать заказ в Битриксе из заказа МойСклад. Позволяет остановить импорт конкретного заказа.
- Описание события
- Пример вызова события
- Примеры использования
Параметры события
| Параметр | Тип | Описание |
|---|---|---|
msOrder | object | Объект заказа МойСклад, который планируется импортировать |
Возвращаемое значение
Для остановки импорта — верните new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::ERROR)
Если импорт продолжать — ничего не возвращайте
//Пример вызова события нужно вставить в файл init.php
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moysklad',
'OnBeforeImportBxOrder',
'OnBeforeImportBxOrderHandler'
);
function OnBeforeImportBxOrderHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
// $msOrder — объект заказа МойСклад
// $msOrder = (object)[
// 'id' => '00000000-0000-0000-0000-000000000000',
// 'name' => '00001',
// 'externalCode' => '...',
// 'moment' => '2025-01-01 12:00:00',
// 'sum' => 1000000,
// 'agent' => (object)[
// 'meta' => (object)[...],
// 'name' => 'Контрагент'
// ],
// 'state' => (object)[
// 'name' => 'Новый'
// ],
// 'positions' => (object)[
// 'meta' => (object)[...],
// 'rows' => [
// (object)[
// 'quantity' => 1,
// 'price' => 10000,
// 'assortment' => (object)[
// 'name' => 'Товар',
// 'externalCode' => '...'
// ]
// ]
// ]
// ]
// ];
$msOrder = $eventParams['msOrder']; //объект заказа МС
//Отправляем \Bitrix\Main\EventResult::ERROR только в случае, если нужно остановить импорт заказа
//return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::ERROR);
}
Пропуск заказов с нулевой суммой
Не импортируем в Битрикс заказы из МойСклад, у которых сумма равна нулю — это могут быть тестовые или служебные заказы.
function OnBeforeImportBxOrderHandler(\Bitrix\Main\Event $event)
{
$msOrder = $event->getParameters()['msOrder'];
if (isset($msOrder->sum) && $msOrder->sum == 0) {
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::ERROR);
}
}
Импорт только заказов с определённым статусом
Импортируем в Битрикс только заказы, которые находятся в статусе «Подтверждён» в МойСклад.
function OnBeforeImportBxOrderHandler(\Bitrix\Main\Event $event)
{
$msOrder = $event->getParameters()['msOrder'];
$allowedState = 'Подтверждён';
if (!isset($msOrder->state) || $msOrder->state->name !== $allowedState) {
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::ERROR);
}
}
[OnBeforeCreateBxOrder] Событие перед созданием заказа в БУС из МС
Событие отличается от события [OnCreateWebhookOrder] тем, что вызывается перед тем, как модуль сохранит заказ в Битриксе и позволяет редактировать его перед созданием.
- Описание события
- Пример вызова события
- Примеры использования
Параметры события
| Параметр | Тип | Описание |
|---|---|---|
bxOrder | \Bitrix\Sale\Order | Объект заказа БУС (ещё не сохранён в БД) |
msOrder | object | Объект заказа МойСклад |
Возвращаемое значение
Ничего возвращать не нужно. Объект $bxOrder передаётся по ссылке — вы можете напрямую модифицировать его через методы Bitrix API.
//Пример вызова события нужно вставить в файл init.php
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moysklad',
'OnBeforeCreateBxOrder',
'OnBeforeCreateBxOrderHandler'
);
function OnBeforeCreateBxOrderHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
// $bxOrder — объект заказа Bitrix, который ещё НЕ сохранён в базу данных
// Можно редактировать поля: $bxOrder->setField('USER_DESCRIPTION', 'текст');
// Можно работать с корзиной, свойствами, оплатами через стандартные методы Bitrix API
// $msOrder — объект заказа МойСклад (аналогичен структуре в OnBeforeImportBxOrder)
$bxOrder = $eventParams['bxOrder']; //объект созданного заказа в БУС (ещё не сохранён)
$msOrder = $eventParams['msOrder']; //объект заказа МС
//можете редактировать объект $bxOrder тем, самым изменяя заказ перед его созданием
}
Установка ответственного менеджера по контрагенту
Назначаем ответственного менеджера в заказе Битрикс на основе данных контрагента из МойСклад.
function OnBeforeCreateBxOrderHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$bxOrder = $eventParams['bxOrder'];
$msOrder = $eventParams['msOrder'];
// Маппинг контрагентов МС на менеджеров в Битрикс
$managerMap = [
'Розничный покупатель' => 1, // ID пользователя-менеджера
'Оптовый клиент' => 5,
];
if (isset($msOrder->agent->name) && isset($managerMap[$msOrder->agent->name])) {
$bxOrder->setField('RESPONSIBLE_ID', $managerMap[$msOrder->agent->name]);
}
}
Заполнение свойства заказа номером из МойСклад
Сохраняем номер заказа МойСклад в свойство заказа Битрикс для отображения менеджерам.
function OnBeforeCreateBxOrderHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$bxOrder = $eventParams['bxOrder'];
$msOrder = $eventParams['msOrder'];
$propertyCollection = $bxOrder->getPropertyCollection();
foreach ($propertyCollection as $property) {
if ($property->getField('CODE') === 'MS_ORDER_NUMBER') {
$property->setValue($msOrder->name);
break;
}
}
}
[OnFilterOrder] Событие для кастомной фильтрации заказов
Событие вызывается при проверке заказа на соответствие фильтрам модуля. Позволяет добавить собственные правила фильтрации заказов, которые могут запрещать или разрешать экспорт заказа в МС.
- Описание события
- Пример вызова события
- Примеры использования
Параметры события
| Параметр | Тип | Описание |
|---|---|---|
orderId | int | ID заказа в БУС |
isFiltred | bool | Текущее состояние фильтрации (true = заказ отфильтрован и НЕ будет отправлен в МС) |
Возвращаемое значение
Верните EventResult::SUCCESS с массивом ['isFiltred' => true/false]:
true— заказ будет отфильтрован (НЕ отправится в МС)false— заказ пройдёт фильтр (отправится в МС)
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, ['isFiltred' => true]);
//Пример вызова события нужно вставить в файл init.php
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moysklad',
'OnFilterOrder',
'OnFilterOrderHandler'
);
function OnFilterOrderHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$orderId = $eventParams['orderId'];
$isFiltred = $eventParams['isFiltred'];
// Пример: не отправлять заказы с определённого сайта
if($orderId > 0){
if($order = \Bitrix\Sale\Order::load($orderId)){
if($order->getSiteId() === 'en'){
$isFiltred = true; // заказ НЕ будет отправлен в МС
}
}
}
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, ['isFiltred' => $isFiltred]);
}
Фильтрация заказов по минимальной сумме
Не отправляем в МойСклад заказы с суммой ниже порога — например, тестовые заказы на 1 рубль.
function OnFilterOrderHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$orderId = $eventParams['orderId'];
$isFiltred = $eventParams['isFiltred'];
if ($orderId > 0 && $order = \Bitrix\Sale\Order::load($orderId)) {
if ($order->getPrice() < 100) {
$isFiltred = true; // заказы дешевле 100 руб. не отправляем
}
}
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, ['isFiltred' => $isFiltred]);
}
Исключение заказов определённой платёжной системы
Заказы, оплаченные через внутренний счёт, не нужно синхронизировать с МойСклад.
function OnFilterOrderHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$orderId = $eventParams['orderId'];
$isFiltred = $eventParams['isFiltred'];
if ($orderId > 0 && $order = \Bitrix\Sale\Order::load($orderId)) {
$paymentCollection = $order->getPaymentCollection();
foreach ($paymentCollection as $payment) {
if (!$payment->isInner() && $payment->getPaymentSystemId() == 15) {
$isFiltred = true; // ID 15 — внутренний счёт, не отправляем
break;
}
}
}
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, ['isFiltred' => $isFiltred]);
}