תארו לעצמכם מחסן שמעבד 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 שעות.







