Представьте: интернет-магазин с 200 заказами в день. Каждая отгрузка требует формирования накладной, акта, счета-фактуры. Менеджеры тратят на ручной ввод данных от 10 до 20 минут на заказ. Умножив на количество заказов, получаем до 67 часов в месяц — почти две рабочие недели одного сотрудника. Автоматическое формирование отгрузочных документов в 1С-Битрикс сокращает это время до секунд, исключая ошибки ввода. Экономия на одном магазине составляет от 100 000 до 500 000 рублей в год — это в 10 раз быстрее ручного процесса. Мы — команда с опытом разработки на 1С-Битрикс (CMS и Битрикс24) более 8 лет. За это время реализовали свыше 120 проектов, включая интеграции с 1С, CRM и платёжными шлюзами. Настройка автоматического формирования отгрузочных документов — одна из частых задач, которую мы решаем за 3-5 дней. Получите консультацию по вашему проекту — свяжитесь с нами, автоматизация окупается за 2-3 недели.
Согласно документации Битрикс, событие OnSaleStatusOrderChange вызывается при каждой смене статуса заказа.
Зачем автоматизировать формирование отгрузочных документов?
Ручное создание документов при отгрузке — источник ошибок и потерь времени. Менеджер вводит данные из заказа в Excel или 1С, ошибается в артикулах или ценах, переделывает. Система Битрикс позволяет исключить человеческий фактор: документы генерируются по заданным правилам в момент смены статуса. Это особенно важно для магазинов с большим потоком заказов — от 50 в день и выше. Ошибки в документах приводят к возвратам и недовольству клиентов.
Как настроить автоматическое формирование отгрузочных документов?
Точка входа — событие 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;
$order = \Bitrix\Sale\Order::load($orderId);
if (!$order) return;
generateInvoiceForOrder($order);
}
В новом API Битрикса (D7) событие называется OnSaleOrderSaved и передаёт объект заказа — рекомендуется использовать его вместо устаревшего. Оно срабатывает при любом сохранении заказа, поэтому нужно дополнительно проверять изменение статуса.
Почему проверка DEDUCTED критична?
Не все отгрузки со статусом «Отгружен» имеют фактическое списание. Критично проверять флаг DEDUCTED='Y', иначе документ может быть сгенерирован для отгрузки, которая ещё не обработана складом. Это частая ошибка — мы её исправляем на этапе аудита.
Структура отгрузки в модуле 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 — при частичной отгрузке количества могут различаться.
| Поле | Назначение |
|---|---|
ORDER_ID |
Идентификатор заказа |
DELIVERY_ID |
Служба доставки |
STATUS_ID |
Статус отгрузки |
DEDUCTED |
Флаг списания товаров |
Генерация PDF-накладной
Для генерации PDF используется внешняя библиотека mpdf. В Битриксе нет встроенного 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';
$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);
}
Как сохранять сгенерированные PDF?
Битрикс не имеет стандартного места для хранения файлов заказа. Сравним варианты:
| Способ хранения | Преимущества | Недостатки |
|---|---|---|
| Свойство заказа типа «Файл» | Простая настройка | Может потеряться при обновлении |
Кастомная таблица sale_order_documents |
Независимость от ядра, расширяемость | Требует SQL-миграции |
| Инфоблок CRM-сделки | Интеграция с CRM | Зависимость от модуля crm |
Мы рекомендуем кастомную таблицу — она не теряет данные при обновлениях и не требует дополнительных модулей.
Отправка документа менеджеру
После генерации документ отправляется на email менеджера или в CRM. Через событие OnSaleOrderSaved доступен ORDER_ID — по нему берётся ответственный менеджер из b_sale_order (поле RESPONSIBLE_ID) и отправляется письмо через \Bitrix\Main\Mail\Event::send() с шаблоном типа SALE_NEW_ORDER или кастомным. Альтернатива — интеграция с модулем tasks: при смене статуса создаётся задача менеджеру со ссылкой на документ. Задача висит до выполнения, а письмо может потеряться.
Что входит в работу по настройке
- Аудит текущих статусов заказов и схем отгрузок
- Разработка обработчика под вашу логику (статусы, частичная отгрузка)
- Шаблон PDF-документа с макетом (название, цены, артикулы, подписи)
- Выбор и настройка места хранения файлов (свойство, таблица, CRM)
- Настройка уведомлений (email, задачи) для менеджеров
- Документирование решения и обучение сотрудников
- Техническая поддержка после запуска — гарантия 1 месяц
Этапы внедрения
- Аналитика — изучаем цепочку заказ-отгрузка, определяем точки входа (статусы, пользовательские поля)
- Проектирование — выбираем событие, таблицу хранения, способ генерации PDF
- Реализация — пишем код, тестируем на тестовом заказе
- Тестирование — прогоняем частичные, полные и возвратные отгрузки
- Деплой — выкатываем на бой, настраиваем логирование ошибок
- Приёмка — показываем результат, получаем обратную связь
Сроки ориентировочно
Типовой проект на один-два статуса отгрузки — от 3 до 5 рабочих дней. Сложные схемы с несколькими отгрузками, интеграцией с 1С и кастомными шаблонами — до 2 недель. Стоимость рассчитывается индивидуально после аудита текущей системы. Свяжитесь с нами — оценим проект бесплатно и предложим оптимизацию без скрытых доплат.
Типичные ошибки и как их избежать
Наиболее частая ошибка — отсутствие проверки флага DEDUCTED. В результате документ генерируется для отгрузок без фактического списания. Мы всегда проверяем этот флаг перед генерацией. Другая распространённая проблема — чтение данных из b_sale_basket вместо b_sale_shipment_item при частичной отгрузке. Количество товаров в корзине может не совпадать с отгружаемым количеством, поэтому используйте таблицу b_sale_shipment_item. Также важно привязывать шаблон документа к типу отгрузки, иначе разные службы доставки получат одинаковый формат. Логирование всех ошибок — обязательное требование для быстрой диагностики. При высокой нагрузке необходима блокировка по ID заказа, чтобы избежать повторной генерации.
Мы используем эти практики во всех проектах — более 120 внедрений подтверждают их эффективность. Закажите настройку автоматического формирования отгрузочных документов — получите готовое решение с документацией и поддержкой.







