+7 (987) 026-06-36
Написать в Telegram

Оставить заявку
stanislav_web

Как реализовать отгрузку конкретных товаров с конкретного склада в шаблоне заказов в 1С-Битрикс

Как реализовать отгрузку конкретных товаров с конкретного склада в шаблоне заказов в 1С-Битрикс Узнайте, как реализовать отгрузку конкретных товаров с выбранного склада в шаблоне заказов в 1С-Битрикс. В статье подробно разбирается процесс, при котором продавец может отгружать только свои товары, выбирая склады с наличием. Пошаговое руководство с объяснением логики работы и примером реализации.

Как реализовать отгрузку конкретных товаров с конкретного склада в шаблоне заказов в 1С-Битрикс

Узнайте, как реализовать отгрузку конкретных товаров с выбранного склада в шаблоне заказов в 1С-Битрикс. В статье подробно разбирается процесс, при котором продавец может отгружать только свои товары, выбирая склады с наличием. Пошаговое руководство с объяснением логики работы и примером реализации.

📅 29 января 2025

👁‍🗨 77

🔥 0

Как реализовать отгрузку конкретных товаров с конкретного склада в шаблоне заказов в 1С-Битрикс

В этой статье мы рассмотрим, как реализовать функционал отгрузки конкретных товаров с выбранного склада в шаблоне заказов в 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>";
        }
        ?>
    <? } ?>
<? } ?>
Теперь у вас есть четкое понимание, как реализовать отгрузку конкретных товаров с выбранного склада в шаблоне заказов в 1С-Битрикс. Этот функционал поможет упростить процесс работы с заказами и улучшить взаимодействие между продавцами и покупателями.