Закажите бесплатную презентацию продуктов РосБизнесСофт прямо сейчас!
Документ «Отгрузка» (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(); }