Автоматическое резервирование в MS Dynamics 365 for Finance and operations

Резервирование может происходить не только при резервировании вручную с формы складских проводок, но и при смене статуса расхода складской проводки на другие кроме физически зарезервировано (StatusIssue::ReservPhysical) и в момент комплектации (StatusIssue:: OnOrder и StatusIssue:: Picked) или при автоматическом резервировании. В данной статье будет рассмотрено автоматическое резервирование в MS Dynamics 365 в момент создания строки заказа.
Основные классы, содержащие алгоритмы резервирования и определяющие поведение объектов данных, представлены тремя семействами. Класс, который непосредственно предназначен для резервирования номенклатур и смены статуса складской проводки на физ. зарезервировано — InventUpd_Reservation наследник класса InventUpdate. Для получения параметров и проведения проверок используются классы семейства InventMovement и InventType.

Автоматическое резервирование при вставке записи.

Один из моментов резервирования — это вставка строки заказа (например, SalesLine, PurchLine, InventJournalTrans, ProdBOM, SalesQuotationLine). В методе Insert или Update экземпляр класса InventUpd_Estimated запускает процесс резервирования (метод updateReservation).

Метод canBeReserved класса InventMovement запускает метод семейства классов InventType.canInventBeReserved(). Изначально возвращаемое значение True, но в некоторых наследниках, например, SalesLineType_Journal или PurchLineType_Journal метод перекрыт значением False. Каждый наследник InventMovement в методе new перекрывает создание экземпляра класса InventType. Например, InventMov_Sales

Метод mustBeAutoReserved изначально возвращает false, и перекрыт на многих наследниках. Метод на InventMov_Sales

Метод inventItemType.canBeAutoReserved возвращает true. У класса inventItemType в Dynamics 365 только два наследника для типов «Номенклатура» и «Услуга», наследник для типа «Услуга» возвращает false. Поле salesLine.Reservation наследуется из шапки заказа, в шапке задается вручную, нужно ли автоматически резервировать строки.
Метод updateReqExplodeReservation возвращает false если не перекрыт в наследниках. Для строк продаж в методе проверятся значение поля «Контроль даты поставки» или тип автоматического резервирования.

В методе InventUpdate.setParmAllowDefault задается параметр allowReserveReversed = movement.inventModelGroup().ReserveReversed (метод возвращает InventTable::find(this.itemId()).modelGroup(), для продаж не перекрыт), и movement_Orig = movement.newMovement_Orig(), в этом случае для таблицы буфером является запись до изменений (orig).

FEFO и FIFO при резервировании

«Управление датой по принципу FEFO» (InventModelGroup.PdsCheck) и «FIFO с контролем по дате» (ReserveByDate). От этих флагов зависит какой запрос будет выполняться при поиске доступных для резервирования запасов в методе InventUpd_Reservation.updateReserveMore

Из условия видно, что, если у номенклатуры активна партия и «Управление датой по принципу FEFO» (InventModelGroup.PdsCheck) включено, то в запрос к InventSum добавляется партия метод InventSum::pds_FEFOQuery. Запрос имеет следующий вид

Иначе запрос состоит только из InventSum и InventDim метод InventSum::newQueryReservation, и учет даты идет либо только по FIFO либо по полю InventSum.LastUpdDateExpected ожидаемая дата последней проводки (InventModelGroup.ReserveReversed назад от даты отгрузки), что схоже с LIFO, но дата в обратном порядке учитывается только если разрешено резервировать в заказанных. Метод InventUpd_Reservation.updateReserveMore.

Проверка перед резервированием с помощью формы «Авторезервирование».

Форма «Авторезервирование» вызывается в validateWrite DataSource формы методом InventMovement::setAutoReserving (например, на форме SalesTable в методе SalesLine.validateWrite метод SalesTableForm.salesLine_validateWrite запускает проверку). Форма «Авторезервирование» предназначена для предупреждения о том, что все обновленное количество не может быть зарезервировано полностью, для наглядности выводится доступное количество, и предлагает следующие действия с вновь введенным количеством в заказе: изменить, отменить обновление или оставить без изменений. Если обновление количества не было отменено, то метод InventMovement::setAutoReserving возвращает True и в методе insert/update таблицы происходит резервирование на доступное количество и создается новая складская проводка со статусом «Заказано» для оставшегося количества. Ниже приведен пример кода, как можно запустить все проверки, используемые методом InventMovement::setAutoReserving, перед резервированием без запуска формы «Авторезервирование»

От знака переданного количества в метод InventUpd_Reservation::newMovement зависит будет зарезервировано (отрицательное количество) или наоборот снят резерв (положительное). Если будет передано количество большее чем физически доступно, то резервирование не произойдет. Для проверки доступного количества можно использовать метод InventOnHandQty. availPhysical

Comments

So empty here ... leave a comment!

Добавить комментарий

Sidebar



X

Ищешь разработчика 1С?
Оставь заявку на консультацию

X

Ищешь разработчика?