Как реализовать отгрузку конкретных товаров с конкретного склада в шаблоне заказов в 1С-Битрикс
Как реализовать отгрузку конкретных товаров с конкретного склада в шаблоне заказов в 1С-Битрикс
Узнайте, как реализовать отгрузку конкретных товаров с выбранного склада в шаблоне заказов в 1С-Битрикс. В статье подробно разбирается процесс, при котором продавец может отгружать только свои товары, выбирая склады с наличием. Пошаговое руководство с объяснением логики работы и примером реализации.
📅 29 января 2025
👁🗨 77
В этой статье мы рассмотрим, как реализовать функционал отгрузки конкретных товаров с выбранного склада в шаблоне заказов в 1С-Битрикс. Каждый продавец сможет отгружать только свои товары из заказа, выбирая склады с наличием. Мы разберем, как правильно обрабатывать статусы отгрузок, создавать новые отгрузки и обновлять данные о складах. Это руководство будет полезно для интеграторов и разработчиков, работающих с 1С-Битрикс.
<?
// Проверяем, принадлежит ли пользователь к группе с ID 9 и есть ли параметр 'product' в GET-запросе со значением 'shipment'
if (CSite::InGroup([9]) && $_GET['product'] == 'shipment') {
// Проверяем, есть ли параметр 'product' в GET-запросе со значением 'shipment' и отсутствует ли параметр 'event' со значением 'start'
if ($_GET['product'] == 'shipment' && !$_GET['event'] == 'start') {
// Форма для начала отгрузки
?>
<form action="/personal/orders/<?= $arResult['ID']; ?>?product=shipment&event=start" method="post">
<?
// Получаем массив ID товаров из корзины заказа
$productIds = array_column($arResult['BASKET'], 'PRODUCT_ID');
// Запрашиваем информацию о складах, где находятся товары из корзины
$storeRes = CCatalogStoreProduct::GetList(
[],
['PRODUCT_ID' => $productIds],
false,
false,
['PRODUCT_ID', 'STORE_ID', 'AMOUNT']
);
// Формируем массив складов по товарам
$storesByProduct = [];
while ($store = $storeRes->Fetch()) {
$storesByProduct[$store['PRODUCT_ID']][] = $store;
}
// Получаем названия складов
$storeNames = [];
$storeIds = array_unique(array_column((array)$storeRes->arResult, 'STORE_ID'));
$storeNameRes = CCatalogStore::GetList(
[],
['ID' => $storeIds],
false,
false,
['ID', 'TITLE']
);
while ($store = $storeNameRes->Fetch()) {
$storeNames[$store['ID']] = $store['TITLE'];
}
// Выводим информацию о каждом товаре в корзине
foreach ($arResult['BASKET'] as $basketId => $basket) {
$productId = $basket['PRODUCT_ID'];
$stores = $storesByProduct[$productId] ?? [];
?>
<div>
<img src="<?= CFile::GetPath($basket['PREVIEW_PICTURE']); ?>" alt="<?= $basket['NAME']; ?>" width="40">
<div><?= $basket['NAME']; ?> id:<?= $basket['ID']; ?></div>
<? if (!empty($stores)) { ?>
<select name="store[<?= $basketId; ?>]" id="store_<?= $basketId; ?>">
<? foreach ($stores as $store) { ?>
<option value="<?= $store['STORE_ID']; ?>">
<?= $storeNames[$store['STORE_ID']]; ?> id:<?= $store['STORE_ID']; ?> (<?= $store['AMOUNT']; ?> шт.)
</option>
<? } ?>
</select>
<? } else { ?>
<div>Товар отсутствует на складах</div>
<? } ?>
</div>
<? } ?>
<button type="submit">Отгрузить</button>
</form>
<? } else { ?>
<?
// Если параметр 'event' равен 'start', начинаем процесс отгрузки
$orderId = $arResult['ID'];
// Загружаем заказ по ID
$order = Sale\Order::load($orderId);
if ($order) {
// Получаем коллекцию отгрузок заказа
$shipmentCollection = $order->getShipmentCollection();
$oldShipmentData = null;
// Удаляем старую отгрузку, если она существует
foreach ($shipmentCollection as $shipment) {
if (!$shipment->isSystem()) {
$oldShipmentData = [
'STATUS_ID' => $shipment->getField('STATUS_ID'),
'ALLOW_DELIVERY' => $shipment->getField('ALLOW_DELIVERY'),
'DEDUCTED' => $shipment->getField('DEDUCTED'),
'DELIVERY_NAME' => $shipment->getField('DELIVERY_NAME'),
'DELIVERY_ID' => $shipment->getField('DELIVERY_ID'),
];
$shipment->delete();
echo "Старая отгрузка удалена.<br>";
break;
}
}
// Создаем новую отгрузку
$newShipment = $shipmentCollection->createItem();
// Получаем корзину заказа и коллекцию товаров отгрузки
$basket = $order->getBasket();
$shipmentItemCollection = $newShipment->getShipmentItemCollection();
// Добавляем товары в отгрузку на основе выбранных складов
foreach ($_POST['store'] as $basketId => $storeId) {
$basketItem = $order->getBasket()->getItemById($basketId);
$shipmentItem = $shipmentItemCollection->createItem($basketItem);
if (!$shipmentItem) {
echo "Ошибка при добавлении товара в отгрузку: " . $basketItem->getField('NAME') . "<br>";
continue;
}
echo "Товар добавлен в отгрузку: " . $basketItem->getField('NAME') . "<br>";
$shipmentItem->setQuantity($basketItem->getQuantity());
// Удаляем старые записи о складах для товара
$shipmentItemStoreCollection = $shipmentItem->getShipmentItemStoreCollection();
if (!$shipmentItemStoreCollection) {
echo "Ошибка: коллекция складов не инициализирована для товара: " . $basketItem->getField('NAME') . "<br>";
continue;
}
foreach ($shipmentItemStoreCollection as $shipmentItemStore) {
$shipmentItemStore->delete();
}
// Создаем новую запись о складе для товара
$shipmentItemStore = $shipmentItemStoreCollection->createItem($basketItem);
if ($shipmentItemStore) {
$shipmentItemStore->setFields([
'STORE_ID' => $storeId,
'QUANTITY' => $basketItem->getQuantity(),
]);
echo "STORE_ID установлен для товара: " . $basketItem->getField('NAME') . "<br>";
} else {
echo "Ошибка при создании записи о складе для товара: " . $basketItem->getField('NAME') . "<br>";
}
}
// Устанавливаем свойства новой отгрузки
$newShipment->setFields([
'STATUS_ID' => 'DF', //$oldShipmentData['STATUS_ID'],
'ALLOW_DELIVERY' => 'Y', //$oldShipmentData['ALLOW_DELIVERY'],
'DEDUCTED' => 'Y', // $oldShipmentData['DEDUCTED'],
'DELIVERY_NAME' => $oldShipmentData['DELIVERY_NAME'],
'DELIVERY_ID' => $oldShipmentData['DELIVERY_ID'],
]);
echo "Свойства отгрузки восстановлены из старой отгрузки.<br>";
// Сохраняем заказ
$result = $order->save();
if ($result->isSuccess()) {
echo "Новая отгрузка успешно создана для заказа #" . $orderId . ".<br>";
LocalRedirect('/personal/orders/' . $orderId);
} else {
echo "Ошибка при создании отгрузки: " . implode(", ", $result->getErrorMessages()) . "<br>";
}
} else {
echo "Заказ с ID #" . $orderId . " не найден.<br>";
}
?>
<? } ?>
<? } ?>