Налаштування генерації і друку етикеток з 1С-Bitrix
Склад обробляє 200 замовлень на день, і кожну етикетку менеджер друкує вручну з Word-шаблону. Це 2–3 секунди на етикетку плюс помилки при копіюванні адреси. Автоматична генерація етикеток прямо з карточки замовлення у Bitrix скорочує цей час до нуля і виключає помилки.
Формати етикеток і бібліотеки
Етикетки генеруються в двох основних форматах:
PDF — для термопечаті та стандартних принтерів. Бібліотека TCPDF або mPDF. mPDF переважніше: краще підтримує кирилицю та CSS-стилізацію.
ZPL (Zebra Programming Language) — для промислових принтерів Zebra, TSC, Honeywell. Відправляється напряму на принтер без генерації PDF. Максимальна швидкість друку.
Установка mPDF через Composer:
composer require mpdf/mpdf
Шаблони етикеток
Етикетка — це HTML-шаблон з підстановкою даних. Зберігається в /local/templates/.default/labels/:
<!-- shipping_label.html -->
<div class="label" style="width:100mm; height:150mm; font-family: Arial;">
<div class="sender">
<strong>ТОО Магазин</strong><br>
г. Алматы, вул. Ленина, 1
</div>
<div class="barcode">
<img src="barcode_{ORDER_ID}.png" width="200">
</div>
<div class="recipient">
<strong>{RECIPIENT_NAME}</strong><br>
{RECIPIENT_ADDRESS}<br>
{RECIPIENT_PHONE}
</div>
<div class="order-info">
Замовлення #{ORDER_ID} | {ORDER_DATE}<br>
Вага: {WEIGHT} кг | Мест: {ITEMS_COUNT}
</div>
</div>
Генератор етикеток
namespace Custom\Warehouse;
class LabelGenerator {
public function generateShippingLabel(int $orderId): string {
$order = \Bitrix\Sale\Order::load($orderId);
if (!$order) throw new \Exception("Order $orderId not found");
$shipment = $this->getMainShipment($order);
$propertyCollection = $order->getPropertyCollection();
$data = [
'{ORDER_ID}' => $order->getId(),
'{ORDER_DATE}' => $order->getDateInsert()->format('d.m.Y'),
'{RECIPIENT_NAME}' => $propertyCollection->getPayerName()->getValue(),
'{RECIPIENT_PHONE}' => $propertyCollection->getPhone()->getValue(),
'{RECIPIENT_ADDRESS}' => $this->buildAddress($propertyCollection),
'{WEIGHT}' => $this->calculateWeight($order),
'{ITEMS_COUNT}' => $order->getBasket()->count(),
];
$template = file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/local/templates/.default/labels/shipping_label.html');
$html = str_replace(array_keys($data), array_values($data), $template);
return $this->htmlToPdf($html, $orderId);
}
private function htmlToPdf(string $html, int $orderId): string {
$mpdf = new \Mpdf\Mpdf([
'mode' => 'utf-8',
'format' => [100, 150], // 100mm x 150mm
'margin_top' => 5,
'margin_bottom' => 5,
'margin_left' => 5,
'margin_right' => 5,
]);
$mpdf->WriteHTML($html);
$outputPath = '/upload/labels/label-' . $orderId . '.pdf';
$mpdf->Output($_SERVER['DOCUMENT_ROOT'] . $outputPath, 'F');
return $outputPath;
}
}
Штрихкоди на етикетках
Для генерації штрихкодів (Code 128, QR) використовуйте бібліотеку picqer/php-barcode-generator:
composer require picqer/php-barcode-generator
$generator = new \Picqer\Barcode\BarcodeGeneratorPNG();
$barcode = $generator->getBarcode((string)$orderId, $generator::TYPE_CODE_128);
file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/upload/labels/barcode_' . $orderId . '.png', $barcode);
Інтеграція в адміністративну частину
Кнопка «Друк етикетки» додається в карточку замовлення через обробник OnAdminContextMenuShow або через кастомний action у sale/order_detail.php. При нажатті генерується PDF і відкривається в новій вкладці браузера.
Для пакетного друку (кілька замовлень зі списку) — action «Надрукувати етикетки» через checkbox-selection у sale/order_list.php. Генерується один багатосторінковий PDF.
Прямий друк без PDF (ZPL)
Для Zebra-принтерів етикетка формується в ZPL і відправляється напряму:
function printZebraLabel(int $orderId, string $printerIp, int $printerPort = 9100): void {
$zpl = "^XA\n^FO50,50^A0N,30,30^FD Замовлення #$orderId ^FS\n^XZ";
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, $printerIp, $printerPort);
socket_send($socket, $zpl, strlen($zpl), 0);
socket_close($socket);
}
Сроки виконання
| Обсяг робіт | Строк |
|---|---|
| HTML-шаблон + PDF-генерація + кнопка | 1–2 дні |
| Штрихкоди + пакетний друк | +1 день |
| ZPL для Zebra + мережевий друк | +1 день |
| Інтеграція з ярликами CDEK/Пошти | окрема задача |
Автоматизація друку етикеток — один з перших кроків до порядку на складі при зростанні обсягу замовлень.







