Автоматически отгрузить заказ и сменить статус отгрузки, при выполнении заказа.

Просмотров: 3912

Проблема: Заказы, на сайте, обрабатываются только в 1С. При этом 1С не работает с отгрузками и обменивается только статусами: "Принят", "Оплачен" и "Выполнен". Но, по закону, после выполнения заказа нужно отправлять на печать второй чек (чек отгрузки). Что бы сайт напечатал второй чек- статус отгрузки заказа должен быть переведен в "Отгружено".

Задача: так как менеджеры не хотят заходить на сайт и вручную переключать статус отгрузки, нужно делать это автоматически, при переходе статуса заказа в "Выполнен", который приходит из 1С.

Переключам статус доставки в "Разрешена" и "Отгружена"

Тут все штатно: переходим в "Настройки -> Настройки продукта -> Настройки модулей -> Интернет-магазин" и на вкладке Автоматизация процессов выставляем разрешение доставки при переводе заказа в статус "Оплачен" и смену отгрузки на "Отгружен" при отгрузке заказа.

Автоматически отгрузить заказ и сменить статус отгрузки, при выполнении заказа.

Отгружаем заказ при выполнении

А теперь, осталось только отгрузить заказ при смене статуса на "Выполнен". Для этого создаем или добавляем в /local/php_interface/init.php (если уже есть):

use Bitrix\Main\Loader;
AddEventHandler("sale", "OnSaleStatusOrder", "OrderComplete");
function OrderComplete($orderID, &$arFields)
{
    if ($arFields == 'F') {
        Loader::includeModule("sale");
        $order = \Bitrix\Sale\Order::load($orderID);
        $collection = $order->getShipmentCollection()->getNotSystemItems();
        foreach ($collection as $shipment)
        {
            $shipment->setField('DEDUCTED', 'Y');
        }
        $order->save();
    }
}  
  • С помощью события OnSaleStatusOrder отслеживаем изменение статуса заказа.
  • Если заказ перешел в статус "Выполнен" $arFields == 'F'
  • Загружаем заказ по его ID, получаем все отгрузки заказа и в цикле переключаем статус на "Отгружен" $shipment->setField('DEDUCTED', 'Y');
  • Сохраняем заказ $order->save();

Обратите внимание: у каждого заказа есть скрытая, системная отгрузка и ее нельзя изменять (в общем-то и не получится, выдаст исключение). Отгрузки получаем с помощью $order->getShipmentCollection()->getNotSystemItems(); что бы в переборе не было этой системной отгрузки. Она не влияет на смену статуса и печать чека.

На этом все. Выполненные заказы будут сами отгружаться и переводиться в статус "Отгружен", с последующей печатью второго чека.

Михаил Базаров 25.09.2022
В заметке использовано старое событие, оно работает немного быстрее.
Но, тоже самое на D7

Код
\Bitrix\Main\EventManager::getInstance()->addEventHandler('sale', 'OnSaleStatusOrderChange', ['Handler', 'OnSaleStatusOrderChange']);
class Handler {
    function OnSaleStatusOrderChange($event)
    {
        $parameters = $event->getParameters();
        if ($parameters['VALUE'] === 'F')
        {
            Loader::includeModule("sale");
            $order = \Bitrix\Sale\Order::load($orderID);
            $collection = $order->getShipmentCollection()->getNotSystemItems();
            foreach ($collection as $shipment)
            {
                $shipment->setField('DEDUCTED', 'Y');
            }
            $order->save();
        }
        return new \Bitrix\Main\EventResult(
            \Bitrix\Main\EventResult::SUCCESS
        );
    }
}
Гость 23.07.2024
Цитата
написал:
В заметке использовано старое событие, оно работает немного быстрее.
Но, тоже самое на D7

Код
 \Bitrix\Main\EventManager::getInstance()->addEventHandler('sale', 'OnSaleStatusOrderChange', ['Handler', 'OnSaleStatusOrderChange']);
class Handler {
    function OnSaleStatusOrderChange($event)
    {
        $parameters = $event->getParameters();
        if ($parameters['VALUE'] === 'F')
        {
            Loader::includeModule("sale");
            $order = \Bitrix\Sale\Order::load($orderID);
            $collection = $order->getShipmentCollection()->getNotSystemItems();
            foreach ($collection as $shipment)
            {
                $shipment->setField('DEDUCTED', 'Y');
            }
            $order->save();
        }
        return new \Bitrix\Main\EventResult(
            \Bitrix\Main\EventResult::SUCCESS
        );
    }
} 

Выдаст ошибку, $orderID не определен
Михаил Базаров 25.07.2024
Да, само собой. Позже поправлю кооментарий свой, нужно получить ID заказа.
где-то в событии он должен быть.

Блог-note: заметки разработчика

Установка поиска Sphinx на Ubuntu 22.04 для 1С-Битрикс

Задача: установить и сконфигурировать поиск Sphinx под управлением Ubuntu 22.04 и панели управления HestiaCP для использ...

Создание агента в 1С-Битрикс, на реальном примере

Задача: Каждый час нужно обновлять свойство элементов/товаров с типом строка "В наличии", вписывать в него либ...

Сортировка элементов по индексу сортировки значений типа список

Внутри любого компонента есть заранее заложенные поля для сортировки элементов. Можно сортировать элементы в разных напр...

Заполнить картинки разделов каталога из картинок товаров

Задача: в каталоге, разделы и подразделы выводятся в виде плитки над товарами, с картинками разделов. Так как разделов и...

Скопировать номер телефона из поля пользователя в телефон для регистрации

Задача, на конкретном сайте: раньше все пользователи регистрировались по стандартному режиму, через логин(e-mail) и паро...

Получить цены товаров с помощью D7-ORM в 1С-Битрикс

Веб-разработка часто требует работы с базой данных для получения и обработки информации о товарах, в том числе и их цен...

Вывести все разделы в которых находится элемент инфоблока

Если нужно вывести все разделы, со всей доступной информацией о них, внутри элемента инфоблока, например в карточке това...

Хостинг панель BrainyCp: оптимизация под 1С-битрикс

В этой видео-заметке расскажу как установить и оптимизировать панель управления сервером BrainyCp для использования в св...

Следующая/предыдущая новость/статья при просмотре подробной в Битрикс

Странное дело, в Битрикс по умолчанию, отсутсвует функционал для навигации внутри новостей или статей типа: "Следующая/...