Налаштування автоматичного формування відправних документів 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: при зміні статусу створюється завдання менеджеру зі посиланням на документ.







