Настройка автоматического формирования отгрузочных документов 1С-Битрикс
Менеджер меняет статус заказа на «Отгружен» — накладная должна сформироваться сама. Вместо этого он открывает отдельный интерфейс, вручную вводит данные, которые уже есть в заказе. Это дублирование работы, которое убирается одним обработчиком события.
Событие смены статуса заказа
Точка входа — событие OnSaleStatusOrderChange модуля sale. Оно вызывается при каждой смене статуса. Параметры: ORDER_ID, STATUS_ID (новый статус), OLD_STATUS_ID.
Обработчик регистрируется в /bitrix/php_interface/init.php или в модуле:
AddEventHandler('sale', 'OnSaleStatusOrderChange', 'generateShipmentDoc');
function generateShipmentDoc($orderId, $newStatus, $oldStatus) {
// Генерировать документ только при переходе в статус отгрузки
if ($newStatus !== 'S') return; // 'S' - пример статуса отгрузки
$order = \Bitrix\Sale\Order::load($orderId);
if (!$order) return;
generateInvoiceForOrder($order);
}
В новом API Битрикса (D7) событие называется OnSaleOrderSaved и передаёт объект заказа — рекомендуется использовать его вместо устаревшего.
Структура отгрузки в модуле sale
Отгрузка в Битриксе — объект \Bitrix\Sale\Shipment. Каждый заказ может иметь несколько отгрузок. Таблица b_sale_shipment хранит отгрузки с полями: ORDER_ID, DELIVERY_ID, STATUS_ID, PRICE_DELIVERY, CURRENCY, DEDUCTED (Y — товары списаны со склада).
Строки отгрузки — b_sale_shipment_item: SHIPMENT_ID, BASKET_ID, QUANTITY, RESERVED_QUANTITY.
При формировании отгрузочного документа нужно читать именно из b_sale_shipment_item, а не из b_sale_basket — при частичной отгрузке количества могут различаться.
Генерация PDF-накладной
Для генерации PDF используется внешняя библиотека — mpdf или tcpdf. В Битриксе нет встроенного PDF-генератора для документов, но есть механизм печатных форм через компонент bitrix:sale.order.invoice.
Программное создание PDF через mpdf:
function generateInvoiceForOrder(\Bitrix\Sale\Order $order) {
$shipmentCollection = $order->getShipmentCollection();
$items = [];
foreach ($shipmentCollection as $shipment) {
if ($shipment->isSystem()) continue;
foreach ($shipment->getShipmentItemCollection() as $shipmentItem) {
$basketItem = $shipmentItem->getBasketItem();
$items[] = [
'name' => $basketItem->getField('NAME'),
'quantity' => $shipmentItem->getQuantity(),
'price' => $basketItem->getPrice(),
'sum' => $basketItem->getPrice() * $shipmentItem->getQuantity(),
];
}
}
ob_start();
include __DIR__ . '/templates/invoice.php'; // шаблон с $items, $order
$html = ob_get_clean();
$mpdf = new \Mpdf\Mpdf(['utf-8', 'A4']);
$mpdf->WriteHTML($html);
$pdfContent = $mpdf->Output('', 'S');
// Сохранить файл
$fileId = \CFile::SaveFile([
'name' => 'invoice_' . $order->getId() . '.pdf',
'type' => 'application/pdf',
'content' => $pdfContent,
], 'sale/invoices');
// Привязать к заказу через свойство или кастомную таблицу
saveInvoiceFile($order->getId(), $fileId);
}
Прикрепление документа к заказу
Битрикс не имеет стандартного места для хранения файлов заказа. Варианты:
- Свойство заказа типа "Файл" — добавляется через
b_sale_order_propsс типомFILE. - Кастомная таблица
sale_order_documentsс полямиORDER_ID,FILE_ID,DOC_TYPE,DATE_CREATE. - Сохранение в свойство инфоблока CRM-сделки если включён модуль
crm.
Рекомендуется кастомная таблица — она не зависит от изменений в структуре свойств заказа.
Отправка документа менеджеру
После генерации документ отправляется на email менеджера или в CRM. Через событие OnSaleOrderSaved доступен ORDER_ID — по нему берётся ответственный менеджер из b_sale_order (поле RESPONSIBLE_ID) и отправляется письмо через \Bitrix\Main\Mail\Event::send() с шаблоном типа SALE_NEW_ORDER или кастомным.
Альтернатива — интеграция с модулем tasks: при смене статуса создаётся задача менеджеру со ссылкой на документ.







