Частичная отгрузка в 1С-Битрикс — это когда товары из одного заказа уезжают покупателю разными партиями, а сам состав заказа при этом остаётся неизменным. Ключ к пониманию — модель «одна отгрузка = одна сущность Shipment»: заказ может содержать несколько отгрузок, и каждая закрывает свою часть позиций.
Модель отгрузок в заказе
В ядре D7 (\Bitrix\Sale\Order) заказ хранит коллекцию отгрузок ShipmentCollection, а каждая отгрузка — коллекцию ShipmentItemCollection. Позиция корзины (BasketItem) существует в заказе один раз, но её количество может быть распределено между несколькими отгрузками через объекты ShipmentItem с полем QUANTITY.
Именно поэтому частичная отгрузка не требует правки состава: вы не трогаете корзину и цены, а лишь решаете, сколько единиц каждой позиции уходит в конкретной партии. Первый Shipment в заказе — системный (SYSTEM = Y): это «склад невыгруженного», где лежит всё, что ещё не распределено по реальным отгрузкам.
Как создать вторую отгрузку в админке
В детальной карточке заказа (/bitrix/admin/sale_order_view.php) на вкладке «Отгрузка» нажмите «Добавить отгрузку». Битрикс создаст новый Shipment и предложит выбрать службу доставки. Дальше в блоке товаров вы указываете, сколько единиц каждой позиции кладёте в эту партию — остальное остаётся доступным для следующих отгрузок.
- Открываете заказ, вкладка «Отгрузка».
- «Добавить отгрузку», выбираете службу доставки для партии.
- В списке товаров проставляете количество к отгрузке (меньше или равно доступному остатку).
- Сохраняете отгрузку и, когда партия собрана, ставите флаг «Разрешить отгрузку» и «Отгружено».
Повторяете шаги для каждой следующей партии. Состав заказа, скидки и итоговая сумма при этом не меняются.
Учёт остатка к отгрузке
Сколько ещё можно распределить по новым партиям, Битрикс считает как разницу между количеством позиции в заказе и суммой уже разложенного по несистемным отгрузкам. Этот «доступный остаток» и лежит в системной отгрузке.
| Позиция | В заказе | Отгрузка №1 | Отгрузка №2 | Остаток к отгрузке |
|---|---|---|---|---|
| Товар А | 10 | 4 | 3 | 3 |
| Товар Б | 2 | 2 | 0 | 0 |
Программно доступное количество удобно получать через методы отгрузки и корзины: ShipmentItem::getQuantity() в разрезе всех Shipment против BasketItem::getQuantity(). Пока остаток положительный — заказ отгружен не полностью.
Резерв и списание со склада
Если в модуле sale включён складской учёт (модуль catalog, флаг «Использовать складской учёт»), то отгрузка управляет и резервом, и остатком. Резервирование задаётся флагом RESERVED отгрузки, а списание фактических остатков со склада происходит в момент, когда партия помечается как отгруженная (DEDUCTED = Y).
При частичной отгрузке это работает по каждой партии независимо: отгрузили 4 из 10 — со склада списалось 4, оставшиеся 6 продолжают числиться в резерве под этим заказом (если резерв включён). Это удобно для дропшиппинга и товаров, приезжающих на склад дозаказами.
catalog перед отметкой «Отгружено».Статусы отгрузки и заказа
У каждой отгрузки два ключевых флага: ALLOW_DELIVERY (разрешена доставка) и DEDUCTED (отгружено/списано). Заказ получает признак полной отгрузки только тогда, когда все несистемные Shipment помечены как отгруженные и в системной отгрузке не осталось нераспределённого количества.
- Отгружен частично — часть партий уже
DEDUCTED = Y, но остаток к отгрузке больше нуля. - Отгружен полностью — заказ в целом получает
DEDUCTED = Y, когда закрыты все партии. - Статус заказа (список статусов в
/bitrix/admin/sale_status.php) — отдельная сущность; менять его на «Выполнен» стоит только после полной отгрузки, иначе автоматика и уведомления сработают преждевременно.
Учтите, что флаг оплаты (PAYED) и флаг отгрузки независимы: заказ может быть оплачен целиком, но отгружаться несколькими партиями.
Автоматизация и обмен с 1С
Каждая отгрузка выбрасывает события ядра — например OnSaleDeliveryAllowedByProduct и события сохранения Shipment. На них вешают печать накладных, отправку трек-номера, фискализацию по факту отгрузки партии и постановку транспортных заявок.
При обмене с «1С:Управление торговлей» по стандартному протоколу CommerceML каждая партия выгружается как отдельный документ реализации, а частичная отгрузка на сайте корректно ложится в несколько реализаций в 1С. Важно, чтобы правила обмена не «схлопывали» отгрузки в одну и не пытались переписать состав заказа — иначе распределение по Shipment собьётся.
DEDUCTED партии, а не всего заказа — тогда покупатель получит корректный чек на каждую фактически отгруженную часть.Итог
Частичная отгрузка в 1С-Битрикс — это штатная возможность, а не костыль: заказ хранит несколько объектов Shipment, количество каждой позиции распределяется между ними, а состав заказа и суммы остаются нетронутыми. Достаточно контролировать остаток к отгрузке, флаги ALLOW_DELIVERY и DEDUCTED и не спешить с финальным статусом заказа.
Когда партий много, а логика завязана на склад, оплату и обмен с 1С, ошибки в распределении дорого обходятся. Мы настраиваем отгрузки, резервирование и корректный обмен с 1С так, чтобы частичные поставки работали предсказуемо и без ручной правки заказов.
Частые вопросы
Нужно ли менять состав заказа, чтобы отгрузить часть товаров?
Нет. Состав заказа остаётся прежним, вы лишь распределяете количество позиций между несколькими отгрузками. Корзина, скидки и итоговая сумма не меняются.
Сколько отгрузок может быть в одном заказе?
Ограничения по числу нет: заказ хранит коллекцию отгрузок, и вы создаёте столько несистемных Shipment, сколько нужно партий. Плюс всегда есть одна системная отгрузка-буфер.
Что такое системная отгрузка и зачем она нужна?
Это внутренний Shipment с флагом SYSTEM = Y, в котором лежит ещё не распределённое по реальным партиям количество. Покупателю она не показывается как доставка.
Как понять, что заказ отгружен не полностью?
Если у позиций остаётся положительный остаток к отгрузке или не все несистемные отгрузки помечены как отгруженные, заказ считается отгруженным частично.
Списывается ли товар со склада сразу или по партиям?
По партиям. Списание со склада происходит в момент, когда конкретная отгрузка получает флаг DEDUCTED = Y. Оставшееся количество может продолжать числиться в резерве.
Можно ли отгружать частями оплаченный целиком заказ?
Да. Флаги оплаты (PAYED) и отгрузки независимы. Заказ может быть полностью оплачен и при этом уезжать покупателю несколькими партиями.
Как частичная отгрузка отражается в обмене с 1С?
Каждая партия выгружается как отдельный документ реализации по протоколу CommerceML. Главное — чтобы правила обмена не объединяли отгрузки и не переписывали состав заказа.
Когда ставить заказу статус «Выполнен»?
Только после того, как закрыты все партии и остаток к отгрузке равен нулю. Иначе автоматические уведомления и триггеры сработают раньше времени.
Поможем с настройкой и поддержкой 1С-Битрикс: Управление сайтом
Поможем с настройкой, доработкой и поддержкой 1С-Битрикс: Управление сайтом.