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

Работа со складом

Работа со складом

Складской учет позволяет вести количественный учет товара на складах организации. Количественный учет в Системе ведется только по «Номенклатуре» с видом «Товар» (НЕ УСЛУГА).

После добавления новой «Номенклатуры» поменять ее вид уже нельзя.

Активация функций складского учета происходит в меню “Настройки”“Общие настройки”“Складской учет” (галочка). По умолчанию данная галочка стоит в Системе.

Менять количество товара в любом складском документе через редактирование “Табличной части” нельзя и заменять товар тоже. Редактирование строки “Табличной части” идет только путем удалением и добавление заново товара табличную часть документа. Это необходимо для корректной работы складских регистров.

Чтобы завести остатки товара на склад необходимо создать новую «Приходную накладную» и добавить товар.

Если остатки товара загружаются в систему, например через CSV, то разработчик должен через код создать новый документ «Приходная накладная», далее строку в табличную часть «Номенклатура», а также запись в регистр «Складского учета» методом stockIncrease (см. ниже).

Общая схема работы склада


Увеличить

Общие методы работы со складом

Чтобы работать со складом необходимо подключить trait Stock в классе на закладке “Сценарий (PHP-код)» в любой форме:

use \Applications\Stock\Enlist as Stock;

С версии Системы 21.06 класс, отвечающий за работу склада, находится в «Форме списка» в справочнике «Склад» по адресу:

/configurator/references.storehouses/?formname=stock/list

Пример использования класса для версии 21.06 и выше:

Stock::getNumber();

В более ранних версиях класс находится в ядре Системы и подключается:

use \Kernel\Actions\Stock;

Пример использования класса для версии 20.09 и ниже:

$this->getNumber();

или

self::getNumber();

Для более быстрого знакомство с модулем «Склад» рекомендуем искать интересующий метод по формам в Конфигураторе (в шапке находится поисковая строка).

Запрос остатков на складе

stockGetNumber ($product, $storehouse = null, $gtd = null, $count = false)

Где:

  • (id) product — ID товара
  • (int) storehouse — ID склада, если не указать — вернет остатки товара на всех складах
  • (int) gtd — ID ГТД, справочник ГТД. Если не заполнено, то не будет учитываться ГТД в фильтре
  • (bool) count — Если параметр  = “true”, то вернет свободное количество на складе (int) (количество на складе  минус количество товара в резерве), если оставить false, то вернет массив (см. ниже)

Возвращаемый результат:

(int) или массив: [0 => количество на складе, 1 => всего в резерве]

Пример использования:

Stock::stockGetNumber($productID, $storehouseId);

Добавление товара на склад

stockIncrease ($object, $product, $storehouse, $number, $price, $gtd = null)

Увеличение товара на складе складским документом.

Где:

  • (Entry) object — объект строки табличной части, который отвечает за сдвиг регистра склада («positions.table»)
  • (int) product — ID товара
  • (int) storehouse — ID склада
  • (int) number — количество для добавления товара склад (положительное число)
  • (float) price — цена прихода (нужна для расчета профита)
  • (int) gtd — ID ГДТ (Справочник «Серии ГТД»).

Результат вызова:

["status" => "success", "message" => ""];

Пример использования:

Stock::stockIncrease ($this->structure,
  $this->structure->product->id, 
  $this->structure->owner->storehouse->id, 
  $this->structure->number, 
  $this->structure->price_nds, $this->structure->gtd->id);

Списание товара со склада

stockDecrease ($object, $product, $storehouse, $number, $price, $gtd = null)

Уменьшение товара на склада складским документом.

Где:

  • (Entry) object — объект строки табличной части, который отвечает за сдвиг регистра склада (“positions.table”)
  • (int) product — ID товара
  • (int) storehouse — ID склада
  • (int) number — количество для списания товара со склада (положительное число)
  • (float) price — цена прихода (нужна для расчета профита). Если не указать price, то будет произведен расчет себестоимость списываемого товара по методу FIFO
  • (int) gtd — ID ГДТ (Справочник «Серии ГТД»).

Результат вызова:

["status" => "success", "message" => ""];

Пример использования:

Stock::stockDecrease($this->structure,
  $this->structure->product->id, 
  $this->structure->owner->storehouse->id, 
  $this->structure->number, 
  $this->structure->price_nds, $this->structure->gtd->id);

Удаление из регистра склада

Используется при удалении строки из «Табличной части» складского документа (Отгрузки, Прихода и т.д.). Также вызывается при удалении документа целиком (по каждой строке табличной части). По факту количество товара на складе автоматически добавляется или уменьшается (запись в «Складском регистре» принимаем флаг visible=»0″).

stockDelete($object)

Где:

  • (Entry) $object — объект строки табличной части, который отвечает за сдвиг регистра склада («positions.table»)

Результат вызова:

["status" => "success", "message" => ""];

Пример использования:

Stock::stockDetele($object);

Расчет профита по товару

Данный метод позволяет рассчитать себестоимость продаваемого (списанного, перемещенного) товара по методу FIFO.

stockGetProfit($product, $storehouse, $number, $gtd = null, $price = 0)

Где:

  • (int) product — ID товара
  • (int) storehouse — ID склада
  • (int) number — количество (положительное)
  • (int) gtd — ID ГДТ (справочник серии ГТД)
  • (float) price — искать только определенную цена прихода (редко используется)

Возвращаемый результат:

(double)

Пример использования:

Stock::stockGetProfit($position, $storehouse, $number, $gtd, $price);

Проверка наличия определенного количества товара  на складе

stockCheckControl($product, $storehouse, $number, $gtd = null)

Где:

  • (int) product — ID товара
  • (int) storehouse — ID склада
  • (int) number —  количество (положительное) товара для проверки наличия
  • (int) gtd  — ID ГДТ товара (Справочник “Серии ГТД”)

Возвращаемый результат:

true или false

Где:

  • true — на выбранном складе есть запрошенное количество товара
  • false — нет такого количества  товара на указанном складе.

Пример использования:

Stock::stockCheckControl($productId, $storehouseId, $number, $gtdId);

Проверка активности складского учета

Позволяет узнать, ведется ли складской учет в системе или нет.

stockOnlyCheck()

Возвращаемый результат:

true или false

Пример использования:

Stock::stockOnlyCheck();

Проверить активность функции контроля минимальных остатков

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

stockCheckBalance()

Возвращаемый результат:

true или false

Пример использования:

Stock::stockCheckBalance();

Пересчет суммы, НДС и профита для всех записей в табличной части документа

Автоматически рассчитывает значения полей документа, если такие есть (total, nds, profit) и для табличных частей если такие есть (nds, nds_procent, profit, total).

recountDocument($document, $ndsCustom = false, $tableName = «products»)

Где:

  • (Entry) document  — Объект документа (например, documents.orders)
  • (bool) ndsCustom — Если true, то НДС рассчитывается исходя из значения поля “НДС” из “Организации” из Документа. Если false, то НДС не пересчитывается, он задается вручную, например в приходной накладной
  • (string) tableName — Название табличной части для расчета.

Пример использования:

Stock::recountDocument($this->structure);
Stock::recountDocument($this->structure, true, "sets");

Получить количество уже отгруженного товара

Этот метод используется в документе «Счет», когда в счете товара «А» 10 шт, а отгружено 3 шт, то выводится поле в таб. части  «10/3″. Значение «3» — результат работы данной функции.

GetCountDispatched($position)

Где:

  • (object) position — Объект табличной части счета (position.table)

Возвращаемый результат: количество отгруженного уже товара

(int)

Пример использования:

Stock::stockGetCountDispatched($position);

Получить массив товаров для отгрузки с разбиением по ГТД

Метод используется для получения массива доступного товара с разбиением по ГТД (Группировка по «ГТД»), основная логика списания прописана в каждом документе.

stockGetFIFOLines ($product, $storehouse, $number = null, $gtd = null)

Где:

  • (int) product — ID товара
  • (int) storehouse — ID склада
  • (float) number — количество нужного для списания товара (положительное)
  • (int) gtd  — id ГТД (Справочник — Серии ГТД)

Возвращаемый результат:

(Array)

Пример использования:

Stock::stockGetFIFOLines($productId, $storehouseId, $number)

Резервирование товара

Для резервирования товара на складе используется объект «Резервы» (registers.reserve). При создании нового резерва необходимо учитывать доступное количество товара на выбранном складе. В резерв ставиться только определенный товар и на определенном складе. Резерв товара по умолчанию присутствует в модуле «Счета» (documents.orders). При постановке товара в резерв в «Счете» создается также  запись в регистре «Резервы» (registers.reserve) с необходимым количеством товара (положительное число).

Если резерв по товару в «Счете» был изменен в большую сторону, то в регистре появляется новая запись со знаком «плюс» на измененное количество (было «2», сделали «5», в резерв попадает «+3»). Если резерв был изменен в меньшую сторону, то в регистр должна попасть запись со знаком «минус» (было «5», сделали «3», в регистр попадет «-2»). Если товар был в счете изменен, то резерв со старого товара снимается, а на новый товар резерв ставиться. Если происходит отгрузка по «Счету», то резерв снимается с отгруженных позиций.

Важно! Если по счету был резерв, счет отгрузили, и потом отгрузку удалили, то резерв в «Счете» автоматически не восстанавливается!

Добавление товара на склад в резерв

Добавление товара в резерв на определенном складе. Обычно резервирование товара происходит в документе “Счет” или “Ремонте”.

reserveAdd($position, $number, $storehouse = null)

Где:

  • (Entry) position — объект табличной части документа, на основе которой создается резерв товара. Например, табличная часть “Номенклатура” документа “Счет” (positions.table_1)
  • (int) number — число для резерва (положительное)
  • (int) storehouse — ID склада если не указан, то возьмет из документа резервирования

Возвращаемый результат:

Объект новой записи из регистра “Reserve” (“Registers.reserve”)

Пример использования:

Stock::reserveAdd($this->structure, $this->structure->number);

Снять резерв товара со склада

Удаление резерва товара со склада. Обычно резерв снимается при отгрузки товара.

Важно: При удалении отгрузки или строки табличной части резерв обратно не ставится.

reserveOut($position, $number, $storehouse = null, $product = null)

Где:

  • (Entry) position — объект табличной части документа, на основе которой создается резерв товара. Например, табличная часть “Номенклатура” документа “Счет” (positions.table_1)
  • (int) number — число для резерва (положительное)
  • (int) storehouse — ID склада если не указан, то возьмет из документа резервирования
  • (int) product — ID товара, если не указан, то возьмет из объекта табличной части

Возвращаемый результат:

Возвращает объект записи из registers.reserve.

Пример использования:

Stock::reserveOut($this->structure, $this->structure->number);

Показать все резервы товара по строке табличной части на складе

reserveSearch($position, $storehouse, $product = null)

Где:

  • (Entry) position — объект табличной части, на основе которой сделан резерв (positions.table_1)
  • (int) storehouse — ID склада
  • (int) product — ID товара, если не указан, то возьмет из объекта табличной части

Возвращаемый результат:

(int) — количество зарезервированного товара

Пример использования:

Stock::reserveSearch($this->structure, $this->structure->owner->storehouse->id, $this->structure->product->id)

Показать все счета с резервами по номенклатуре и складу

reserveGetOrders($product = null, $storehouse = null)

Где:

  • (int) product — ID товара, если не указан, то метод вернет массив резервов по всем товарам
  • (int) storehouse — ID склада, если не указан,  то метод вернет массив резервов по всем складам

Возвращаемый результат:

Возвращает массив резервов.

Пример использования:

Stock::reserveGetOrders($this->structure->id, $storehouseId);

Пример использования представлен на форме:

/products_reserve/edit