תארו לעצמכם מחסן שמעבד 300 הזמנות ביום. כל תווית מודפסת ידנית מתבנית Word: העתקת הכתובת, שם המוצר, המשקל. תווית אחת לוקחת 2–3 שניות. בקנה מידה יומי — מדובר ביותר משעתיים של עבודה מונוטונית בתוספת שגיאות בלתי נמנעות (כ-5% מההזמנות עם כתובות שגויות). כשהנפחים גדלים ל-500 הזמנות, תיוג ידני הופך לצוואר בקבוק קריטי: העובדים מוסחים, אחוז ההחזרות עקב כתובות שגויות גדל. הגדרת יצירת תוויות והדפסה מ-1C-Bitrix הופכת תהליך זה לאוטומטי: יצירה בכפתור אחד מכרטיס ההזמנה או בקבוצה מהרשימה. למהנדסים שלנו יש ניסיון של למעלה מ-10 שנים בפיתוח Bitrix, ולכן אנו פותרים את המשימה "מפתח ביד" תוך התחשבות בציוד שלכם.
פורמטים נתמכים: PDF ו-ZPL
התוויות נוצרות בשני פורמטים עיקריים: PDF — להדפסה תרמית ולמדפסות רגילות — אנו משתמשים בספריית mPDF (הטובה ביותר לקירילית ולעיצוב CSS); ZPL (שפת תכנות Zebra) — למדפסות תעשייתיות Zebra, TSC, Honeywell. אנו שולחים פקודות ZPL ישירות למדפסת דרך TCP/IP ללא יצירת PDF — מהירות הדפסה מקסימלית (עד 4 תוויות בשנייה). בחירת הפורמט תלויה בציוד הזמין: PDF מתאים למדפסות משרדיות, ZPL להדפסת פס ייצור.
התקנת mPDF ומחולל ברקודים דרך Composer:
composer require mpdf/mpdf composer require picqer/php-barcode-generator השוואת פורמטים:
| פרמטר | ZPL | |
|---|---|---|
| תאימות | כל המדפסות | Zebra, TSC, Honeywell |
| מהירות | בינונית (המרת HTML→PDF) | מקסימלית (שליחה ישירה) |
| התאמה אישית | דרך HTML/CSS | דרך פקודות ZPL |
| ברקודים | מוטמעים כ-PNG | נוצרים עם פקודות ^BC |
תבניות תוויות
התווית היא תבנית HTML עם החלפת נתונים. נשמרת ב-composer require mpdf/mpdf composer require picqer/php-barcode-generator :
<!-- 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);
// Generate barcode
$this->generateBarcode($orderId);
return $this->htmlToPdf($html, $orderId);
}
private function generateBarcode(int $orderId): void
{
$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);
}
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;
}
} כיצד להוסיף כפתור הדפסה לפאנל הניהול של Bitrix?
הכפתור "הדפסת תווית" מתווסף לכרטיס ההזמנה דרך ה-handler /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> . בלחיצה, נוצר PDF ונפתח בכרטיסיית דפדפן חדשה.
להדפסה בקבוצה (מספר הזמנות מהרשימה) — פעולה "הדפסת תוויות" דרך בחירת תיבות סימון ב-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); // Generate barcode $this->generateBarcode($orderId); return $this->htmlToPdf($html, $orderId); } private function generateBarcode(int $orderId): void { $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); } 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; } } . נוצר PDF רב-עמודים אחד. דוגמת קוד להוספת הפעולה:
// событие OnAdminSaleOrderListMenu
function addPrintLabelsAction(\Bitrix\Main\Event $event)
{
$items = &$event->getParameter('items');
$items[] = [
'TEXT' => 'Распечатать этикетки',
'ACTION' => 'printLabels()',
'ICON' => 'adm-btn-print',
];
} הדפסה ישירה ללא 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);
} כיצד נוצר הברקוד?
הברקוד נוצר על בסיס מזהה ההזמנה באמצעות ספריית OnAdminContextMenuShow. תומך ב-Code 128, QR, ופורמטים נוספים. קובץ ה-PNG נשמר ב-sale/order_detail.php ומוכנס לתבנית ה-HTML. ב-ZPL, הברקוד נוצר עם פקודות sale/order_list.php, שאינו דורש יצירת תמונה.
מדוע אוטומציה של הדפסת תוויות חוסכת כסף?
שגיאות במילוי ידני של תוויות עולות ביוקר: כתובת שגויה — החזרת סחורה, אובדן לקוח, משלוח מחדש. המקרה שלנו: חנות מקוונת עם 300 הזמנות ביום לפני האוטומציה בילתה שעתיים על תיוג והיו לה 5% פגמים. לאחר היישום, הזמן ירד ל-5 דקות, השגיאות ל-0.5%. החיסכון בלוגיסטיקה הסתכם ב-18% עקב הפחתת החזרות. העלות הממוצעת של החזרה (לוגיסטיקה + אובדן הכנסה) הייתה משמעותית — לאחר היישום, סכום זה ירד פי כמה. אוטומציה של הדפסת תוויות מחזירה את עצמה בממוצע תוך חודשיים.
התקנה שלב אחר שלב לפרויקט שלכם
- איסוף דרישות: נפחי הזמנות, סוגי מדפסות, פורמט תווית, צורך בברקוד.
- פיתוח תבנית תווית HTML לפי העיצוב שלכם (נדרשת פריסה או דוגמה).
- יישום מחולל PDF ו/או ZPL, אינטגרציה עם המדפסות שלכם.
- הוספת כפתור הדפסה לכרטיס ההזמנה ו/או הדפסה בקבוצה.
- בדיקה על 50-100 הזמנות, הדרכת עובדים.
לוח זמנים ליישום
| היקף העבודה | לוח זמנים |
|---|---|
| תבנית HTML + יצירת PDF + כפתור בהזמנה | 1–2 ימים |
| ברקודים + הדפסה בקבוצה | +יום אחד |
| ZPL ל-Zebra + הדפסה ברשת | +יום אחד |
| אינטגרציה עם תוויות משלוח ל-SDEK/דואר רוסי | משימה נפרדת |
מה כלול בעבודה
- פיתוח תבנית תווית HTML לפי העיצוב שלכם
- יצירת PDF ו/או ZPL
- ברקודים (Code 128, QR)
- כפתור הדפסה בכרטיס ההזמנה
- הדפסה בקבוצה מרשימת ההזמנות
- אינטגרציה עם מדפסות רשת (Zebra, TSC וכו')
- תיעוד להתקנה ולתמיכה
- הדרכת עובדים (מרחוק או באתר)
אנו מבטיחים פעולה יציבה של הפתרון לאחר היישום. סיום הפרויקט תוך 3–5 ימים בהתאם למורכבות. צרו קשר להערכת הפרויקט שלכם — נמצא את הפתרון האופטימלי למחסן שלכם. בקשו ייעוץ, ונשלח הצעה מסחרית תוך 24 שעות.

