Как добавить свойства товара в заказ Bitrix перед отправкой в 1С
При интеграции интернет-магазина на Bitrix с 1С нередко возникает необходимость передавать дополнительные данные о товарах в заказе. Например, это может быть номенклатура товара, артикул, специальные свойства, изменение цены в корзине или работа со складами перед оформлением заказа.
В этой статье рассмотрим, как добавить свойства товара в заказ Bitrix перед его созданием с помощью события OnSaleComponentOrderResultPrepared.
Когда это может понадобиться
Событие OnSaleComponentOrderResultPrepared удобно использовать в следующих случаях:- передача дополнительных свойств товаров в 1С;
- изменение цены товара в корзине;
- пересчет скидок;
- изменение количества товара;
- работа с остатками и складами;
- добавление служебных данных в заказ;
- кастомизация оформления заказа в Bitrix.
Создание обработчика события в Bitrix
Для начала необходимо создать файл:
/local/php_interface/init.php
Если файл уже существует — просто добавьте в него следующий код.
Код добавления свойства товара в корзину Bitrix
use Bitrix\Main\Diag\Debug;
use Bitrix\Main\EventManager;
use Bitrix\Sale\Location\LocationTable;
use Bitrix\Sale\Order;
use Bitrix\Sale;
$eventManager = EventManager::getInstance();
$eventManager->addEventHandler(
'sale',
'OnSaleComponentOrderResultPrepared',
'OnSaleComponentOrderResultPrepared'
);
function OnSaleComponentOrderResultPrepared(
&$order,
&$arUserResult,
$request,
&$arParams,
&$arResult
)
{
// Получаем корзину текущего пользователя
$basket = Sale\Basket::loadItemsForFUser(
Sale\Fuser::getId(),
Bitrix\Main\Context::getCurrent()->getSite()
);
foreach ($basket as $basketItem) {
// Получаем данные товара из инфоблока
$els = CIBlockElement::GetList(
array(),
array("ID" => $basketItem->GetProductID()),
false,
false,
array("ID", "IBLOCK_ID", "PROPERTY_CODE")
);
if ($el = $els->GetNext()) {
// Получаем коллекцию свойств товара в корзине
$basketPropertyCollection = $basketItem->getPropertyCollection();
// Добавляем новое свойство
$basketPropertyCollection->setProperty(array(
array(
'NAME' => 'Номенклатура',
'CODE' => 'CODE',
'VALUE' => $el['PROPERTY_CODE_VALUE'],
'SORT' => 100,
),
));
// Сохраняем свойства
$basketPropertyCollection->save();
}
}
}Как работает событие OnSaleComponentOrderResultPrepared
Событие OnSaleComponentOrderResultPrepared вызывается после подготовки всех данных компонента оформления заказа в Bitrix, но до фактического создания заказа.На этом этапе:
- объект заказа уже существует;
- ID заказа еще отсутствует;
- можно изменять содержимое корзины;
- доступны товары заказа и их свойства.
Это позволяет гибко модифицировать заказ перед его сохранением и отправкой в 1С.
Что делает данный код
В приведенном примере:
- Получается корзина текущего пользователя;
- Перебираются все товары корзины;
-
Для каждого товара запрашивается свойство
PROPERTY_CODE; - Создается новое свойство корзины — «Номенклатура»;
- Значение свойства сохраняется в заказе.
После оформления заказа это свойство будет передано в 1С вместе с остальными данными заказа.
Какие данные можно изменять через событие
Через OnSaleComponentOrderResultPrepared можно:- изменять свойства товаров;
- менять цену товара;
- изменять количество;
- добавлять кастомные параметры;
- работать со складами;
- добавлять данные для CRM и 1С;
- выполнять дополнительные проверки перед оформлением заказа.
Заключение
Событие OnSaleComponentOrderResultPrepared в Bitrix — мощный инструмент для кастомизации оформления заказа и интеграции с 1С. С его помощью можно передавать дополнительные свойства товаров, изменять параметры корзины и реализовывать сложную бизнес-логику без изменения ядра системы.Такой подход особенно полезен для проектов с нестандартной интеграцией Bitrix и 1С, где требуется гибкое управление данными заказа перед его созданием.