8 (800) 302-62-68
+7 (499) 348-29-58
sale@rbs-crm.ru

Создание отгрузочной накладной

РосБизнесСофт CRM > База знаний > Создание отгрузочной накладной

Создание отгрузочной накладной

Документ «Отгрузка» (documents.invoice) всегда создается из модуля «Счет» (documents.orders).

При создании отгрузки идет проверка наличия всех товаров на «Складе». Если товара не хватает полностью, то он не добавляется в отгрузку, если хватает частично, то добавляется частично, например в счете «Товар 1» кол-во 10 шт., а в наличии на складе 3 шт., то и в новую «Отгрузку» добавится 3 шт. Также, если по позиции в «Счете» был установлен резерв, то его он автоматически снимается.

Если была отгрузка по счету с резервом, то после удаления документа «Отгрузка» или любой «Номенклатуры» из документа резерв не возвращается по «Счету».

Если по счету всех товаров нет на складе, то документ “Отгрузка” не создается.

При создании “Отгрузки” из “Счета” открывается всплывающее окно формы:

/configurator/documents.invoice/?formname=invoice_small/edit

Рассмотрим код формы:

// перебираем табличную часть счета
foreach($ordObj[0]->products as $product)
{
// получаем количество НЕотгруженного товара
$number = $product->number - self::stockGetCountDispatched($product);
// Если тип товара = товар (не услуга)
if($product->product->type->id == 1 && $this->stockOnlyCheck())
{
//запрашиваем массив доступного кол-ва товара с разбиением по ГТД
$data = Stock::stockGetFIFOLines($product->product->id, $storehouse, $number);
        $toDispatch = $number;
        $break = false;
        foreach($data as $value)
        {
            if(!$toDispatch)
                break;

            if($toDispatch >= $value["number"])
            {
                $toDispatch -= $value["number"];
                $number = $value["number"];
            }
            else
            {
                $number = $toDispatch;
                $toDispatch = 0;
            }
// создаем запись в табличной части отгрузка - (documents.invoice.products)	
$this->createPosition($invoice, $product, $storehouse, $number, $value["gtd"], true);
        }
    }
    else
    {
// если услуга, то создаем запись в табличной части отгрузка без проверки наличия на складе (обратить внимание на последний параметр)
        $this->createPosition($invoice, $product, $storehouse, $number);
    }
}

СreatePosition() — метод создания записей в табличной части «Номенклатура» документа  «Отгрузка». В нем необходимо обратить внимание на параметр stockMove, если он задан true, то будет вызвано товародвижение в регистре остатков, а также снимутся резервы по «Счету» по отгруженной позиции.

protected function createPosition($document, $object, $storehouse, $number, $gtd = null, $stockMove = false)
{
    $ndsPercent = $this->getNdsProduct($object->product, $document);
    $position = $document->products->create()
    ->visible(1)
    ->owner($document->id)
    ->name($object->name)
    ->product($object->product->id)
    ->number($number)
    ->gtd($gtd)
    ->nds_procent((string)$ndsPercent)
    ->price_nds($object->price_nds)
    ->total($object->price_nds * $number)
    ->profit($object->price_nds * $number - self::stockGetProfit($object->product->id, $storehouse, $number, $gtd))
    ->base($object->id)
    ->restore()->sync();
    
    if($stockMove)
    {
        Stock::stockDecrease($position, $position->product->id, $document->storehouse->id, $position->number, null, $position->gtd->id);
        Stock::reserveOut($object, $object->reserve);
        $object->reserve(0)->sync();
    }
    return $position;
}

Если отгрузка товара была частичной, то товар можно добавить в отгрузку вручную (после поступления новой партии на склад).

Для этого используется форма:

/configurator/documents.invoice/?formname=companies/invoice/products/edit

Логика добавления товара в документ точно такая же,  как и при создании документа «Отгрузки» из «Счета».

При удалении товара  из “Отгрузки” он возвращается обратно на склад (форма редактирования табличной части «Номенклатура» документа «Отгрузка») :

public static function onWipe($object) {
            
            if($object->owner->storekeeper_flag)
            {
                throw new \Exception("Для удаления товара снимите галочку Отгружено");
            }
            
            Stock::delete($object);
        }

При удалении всего документа “Отгрузка” все товары из нее должны вернуться на склад (основная форма редактирования «Отгрузки») :

public static function onWipe($object) {
     if ($object->storekeeper_flag == 1) {
       throw new \Exception("Отгруженные накладные нельзя удалить");
     }
     
     if ($object->visible == 1) {
       foreach ($object->products as $product) {
         Stock::delete($product);
       }
       
       $inv_sum = Kernel::Data()->Documents->Invoice->filter("order=".$object->order->id)->filter("visible=1")->sum("total") - $object->total;
       $object->order->invoice_sum($inv_sum)->sync();
     }
Как проверить, что товар отгружен со склада корректно?
  • Зайти в в раздел “Номенклатура” (/products/).
    Найти нужный товар и выбрать склад (по умолчанию “Основной”), в столбце “Количество” будет показано количество товара.  Если оно изменилось в меньшую сторону, то товара успешно отгружен со склада.
  • Зайти в отчет “По движению товаров по складам” (/olap/products_movement/)
    Построить отчет по выбранному товару и складу. В отчете в таблице будут показаны документы движения. Если новый документ “Отгрузка”  присутствует в списке, то товар был списан со склада успешно.