События связанные с контрагентом
[OnCustomCounterPartySearch] Событие перед началом поиска контрагента в МС
Событие вызывается перед началом поиска контрагента в МС при создании заказа. Позволяет прервать поиск контрагента полностью и вернуть нужного контрагента модулю для его дальнейшего использования в создаваемом заказе.
- Описание события
- Пример кода
- Примеры использования
Параметры события
| Параметр | Тип | Описание |
|---|---|---|
orderId | int | ID заказа в БУС |
Возвращаемое значение
Верните EventResult::SUCCESS с объектом контрагента МС. Если контрагент найден и возвращён — стандартный поиск будет пропущен.
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $counterParty);
Объект контрагента должен быть стандартным объектом из API МойСклад (результат запроса /entity/counterparty/...).
//Пример кода нужно вставить в файл init.php
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moysklad',
'OnCustomCounterPartySearch',
'OnCustomCounterPartySearchHandler'
);
function OnCustomCounterPartySearchHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$orderId = $eventParams['orderId']; //ID заказа в БУС
/**
* $orderId - теперь вы знаете номер заказа Битрикса и можете рабоать с ним как угодно
*/
/**
* готовим объект контрагента если хотим его поменять в текущем заказа
*/
$counterParty = null;
/**
* Ищем контрагента в МойСклад через API модуля.
*
* \Rbs\Moysklad\ApiNew::get() — обёртка над API МойСклад.
* Первый аргумент — endpoint API, второй — массив query-параметров.
*
* Фильтрация контрагентов:
*
* Точное совпадение:
* 'filter' => 'externalCode=BX_USER' — по внешнему коду
* 'filter' => 'name=ООО Рога и Копыта' — по точному имени
* 'filter' => 'companyType=legal' — по типу: legal | individual | entrepreneur
*
* Частичное совпадение:
* 'filter' => 'name~=Фёдор Пет' — имя содержит подстроку (оператор ~=)
*
* Полнотекстовый поиск (аналог поиска в интерфейсе МойСклад):
* 'search' => 'ООО Рога'
*
* Комбинация нескольких условий (через точку с запятой):
* 'filter' => 'name=ООО Рога;companyType=legal'
*
* Дополнительные параметры:
* 'limit' => 1 — количество возвращаемых результатов (по умолчанию до 1000)
* 'offset' => 0 — смещение для постраничной навигации
*/
$cp = \Rbs\Moysklad\ApiNew::get('/entity/counterparty', [
'filter' => 'externalCode=BX_USER',
'limit' => 1,
]);
if (!$cp->hasErrors) {
if (property_exists($cp, 'rows') && is_array($cp->rows) && count($cp->rows) > 0) {
$counterParty = $cp->rows[0];
}
}
if($counterParty !== null){
//возвращяем найденного контрагента
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $counterParty);
}
}
Подмена контрагента на основе свойства заказа
Если в заказе есть кастомное свойство с ID контрагента МойСклад — можно подставить нужного контрагента напрямую, минуя стандартный поиск.
function OnCustomCounterPartySearchHandler(\Bitrix\Main\Event $event)
{
$orderId = $event->getParameters()['orderId'];
$order = \Bitrix\Sale\Order::load($orderId);
// Получаем значение свойства заказа с ID контрагента МС
$propertyCollection = $order->getPropertyCollection();
$msCounterPartyId = null;
foreach ($propertyCollection as $property) {
if ($property->getField('CODE') === 'MS_COUNTERPARTY_ID') {
$msCounterPartyId = $property->getValue();
break;
}
}
if ($msCounterPartyId) {
// Запрашиваем контрагента напрямую по ID
$cp = \Rbs\Moysklad\ApiNew::get('/entity/counterparty/' . $msCounterPartyId);
if (!$cp->hasErrors) {
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $cp);
}
}
}
Привязка всех заказов к одному контрагенту
Все заказы с определённого сайта отправляются на одного контрагента-«агрегатора».
function OnCustomCounterPartySearchHandler(\Bitrix\Main\Event $event)
{
$orderId = $event->getParameters()['orderId'];
$order = \Bitrix\Sale\Order::load($orderId);
// Если заказ с конкретного сайта — привязываем к фиксированному контрагенту
if ($order->getField('LID') === 's2') {
$cp = \Rbs\Moysklad\ApiNew::get('/entity/counterparty', [
'filter' => 'externalCode=AGGREGATOR_S2',
'limit' => 1,
]);
if (!$cp->hasErrors && !empty($cp->rows)) {
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $cp->rows[0]);
}
}
}
[OnBeforeCreateCounterParty] Событие перед созданием контрагента в МС
Событие вызывается после поиска контрагента в МС (согласно настройкам модуля) и в случае, если контрагент не найден, модуль его создает и вызывает перед созданием контрагента в МС это событие. Можно использовать для модификации данных контрагента перед созданием в МС.
- Описание события
- Пример кода
- Примеры использования
Параметры события
| Параметр | Тип | Описание |
|---|---|---|
orderId | int | ID заказа в БУС |
counterPartyCreateArray | array | Массив данных для создания контрагента, отправляемый в API МС |
Возвращаемое значение
Верните EventResult::SUCCESS с модифицированным массивом данных. Массив заменит counterPartyCreateArray перед отправкой в МС.
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $counterPartyCreateArray);
//Пример кода нужно вставить в файл init.php
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moysklad',
'OnBeforeCreateCounterParty',
'OnBeforeCreateCounterPartyHandler'
);
function OnBeforeCreateCounterPartyHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$orderId = $eventParams['orderId']; //ID заказа в БУС
// $counterPartyCreateArray — массив данных для создания контрагента в МС
// Структура массива:
// [
// 'externalCode' => '123', // string — внешний код (XML_ID пользователя БУС)
// 'phone' => '+79001234567', // string — телефон
// 'email' => 'user@example.com', // string — email
// 'code' => 'code_65a1b2c3d4e5f', // string — уникальный код (генерируется автоматически)
// 'companyType' => 'legal', // string — тип контрагента (legal/entrepreneur/individual)
// 'name' => 'Иванов Иван', // string — имя контрагента
// 'tags' => ['tag1', 'tag2'], // array — теги (если настроены)
// 'state' => (object)[ // object — статус контрагента (если настроен)
// 'meta' => [
// 'href' => 'https://api.moysklad.ru/api/remap/1.2/entity/counterparty/metadata/states/...',
// 'type' => 'state',
// 'mediaType' => 'application/json'
// ]
// ],
// // + дополнительные поля из свойств заказа (если настроена синхронизация свойств)
// ];
$counterPartyCreateArray = $eventParams['counterPartyCreateArray'];
if($orderId > 0){
if($order = \Bitrix\Sale\Order::load($orderId)){
#WORK_AREA#
//здесь работаем с заказом БУС и если нужно меняем массив $counterPartyCreateArray
}
}
//Отправляем \Bitrix\Main\EventResult::SUCCESS только в случае, если нужно поменять данные перед отправкой
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $counterPartyCreateArray);
}
Добавление юридических реквизитов из заказа
При создании контрагента-юрлица подтягиваем ИНН и КПП из свойств заказа.
function OnBeforeCreateCounterPartyHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$orderId = $eventParams['orderId'];
$counterPartyCreateArray = $eventParams['counterPartyCreateArray'];
if ($orderId > 0 && $order = \Bitrix\Sale\Order::load($orderId)) {
$props = $order->getPropertyCollection();
$inn = null;
$kpp = null;
foreach ($props as $prop) {
if ($prop->getField('CODE') === 'INN') $inn = $prop->getValue();
if ($prop->getField('CODE') === 'KPP') $kpp = $prop->getValue();
}
if ($inn) {
$counterPartyCreateArray['inn'] = $inn;
$counterPartyCreateArray['companyType'] = 'legal';
}
if ($kpp) {
$counterPartyCreateArray['kpp'] = $kpp;
}
}
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $counterPartyCreateArray);
}
Назначение тега по источнику заказа
Автоматически проставляем тег контрагенту в зависимости от того, откуда пришёл заказ.
function OnBeforeCreateCounterPartyHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$orderId = $eventParams['orderId'];
$counterPartyCreateArray = $eventParams['counterPartyCreateArray'];
if ($orderId > 0 && $order = \Bitrix\Sale\Order::load($orderId)) {
$siteId = $order->getField('LID');
$siteTags = [
's1' => 'Основной сайт',
's2' => 'Маркетплейс',
's3' => 'Оптовый портал',
];
if (isset($siteTags[$siteId])) {
$counterPartyCreateArray['tags'] = array_merge(
$counterPartyCreateArray['tags'] ?? [],
[$siteTags[$siteId]]
);
}
}
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $counterPartyCreateArray);
}