Принтер етикеток Zebra — потужний пристрій, але без правильної інтеграції його потенціал не використовується. Оператори вручну копіюють дані з Бітрікс у Excel, потім друкують через ZDesigner. Це повільно та загрожує помилками: штрихкоди плутаються, ціни застарівають. Наша команда — сертифіковані розробники Бітрікс із 10+ роками досвіду та понад 40 реалізованими проєктами — автоматизує друк етикеток безпосередньо з вашого сайту. При зміні ціни, надходженні товару або відвантаженні етикетка формується та надсилається на принтер Zebra без участі людини. Ми використовуємо ZPL — промислову мову керування принтерами Zebra. Передача відбувається за протоколом TCP/IP RAW (порт 9100).
Як працює друк через ZPL
Принтери Zebra працюють у мережі за протоколами TCP/IP (порт 9100 — RAW print) або через веб-інтерфейс. ZPL-команди надсилаються як текст у TCP-сокет.
function printZpl(string $printerIp, int $printerPort, string $zpl): bool { $socket = fsockopen($printerIp, $printerPort, $errno, $errstr, 5); if (!$socket) { \Bitrix\Main\Diag\Debug::writeToFile("Zebra: $errstr ($errno)", '', '/bitrix/zebra_errors.log'); return false; } fwrite($socket, $zpl); fclose($socket); return true; } Для Windows-середовищ із shared-принтером — альтернативний підхід через локальний агент на Python або Node.js, який приймає завдання від Бітрікс по HTTP та надсилає на принтер через WinSpool.
Генерація ZPL-етикетки товару
Етикетка товару (ціна + штрихкод + артикул) генерується класом ZebraLabelGenerator:
class ZebraLabelGenerator { public function generatePriceLabel(array $product, string $priceType = 'BASE'): string { $price = \CCatalogProduct::GetOptimalPrice($product['ID'])['PRICE']['PRICE'] ?? 0; $barcode = $this->getBarcode($product['ID']); $name = mb_substr($product['NAME'], 0, 30); return implode("\n", [ '^XA', '^CI28', '^PW464', '^LL200', '^FO20,10^A0N,24,24^FD' . $name . '^FS', '^FO20,40^A0N,18,18^FD' . ($product['PROPERTY_ARTICLE_VALUE'] ?? '') . '^FS', '^FO20,65^A0N,36,36^FD' . number_format($price, 2, '.', ' ') . ' руб.^FS', '^FO20,110^BY2^BCN,50,Y,N,N^FD' . $barcode . '^FS', '^XZ', ]); } private function getBarcode(int $productId): string { $row = \Bitrix\Catalog\ProductBarcodeTable::getList([ 'filter' => ['PRODUCT_ID' => $productId], 'limit' => 1, ])->fetch(); return $row['BARCODE'] ?? str_pad($productId, 12, '0', STR_PAD_LEFT); } } Шаблони етикеток у базі даних
Шаблони ZPL зберігаються в таблиці bl_zebra_templates, а не в коді. Це дозволяє змінювати макет без деплою. Плейсхолдери типу {{NAME}}, {{PRICE}}, {{BARCODE}} замінюються на реальні дані класом ZebraTemplateEngine.
Як автоматизувати друк при зміні ціни?
При зміні ціни через подію OnProductUpdate запускається автоматичний друк:
AddEventHandler('catalog', 'OnProductUpdate', function($productId) { $needPrint = \Bitrix\Main\Config\Option::get('zebra_module', 'auto_print_price_change', 'N'); if ($needPrint !== 'Y') return; $product = \CIBlockElement::GetByID($productId)->GetNext(); $printerIp = \Bitrix\Main\Config\Option::get('zebra_module', 'default_printer_ip'); $zpl = (new ZebraLabelGenerator())->generatePriceLabel($product); ZebraPrinter::send($printerIp, 9100, $zpl); }); При прийманні товару — після обробки документа надходження формується черга завдань:
foreach ($receiptItems as $item) { for ($i = 0; $i < $item['qty']; $i++) { $jobs[] = [ 'product_id' => $item['product_id'], 'copies' => 1, 'template' => 'warehouse_label', 'printer_id' => $item['warehouse_printer_id'], ]; } } ZebraPrintQueue::push($jobs); Черга та повтори
Черга друку bl_zebra_print_queue обробляється агентом кожну хвилину. Це надійніше за прямий друк в обробнику події — принтер може бути тимчасово недоступний.
CREATE TABLE bl_zebra_print_queue ( id SERIAL PRIMARY KEY, printer_id INT NOT NULL, template_id INT NOT NULL, data_json JSONB NOT NULL, status VARCHAR(20) DEFAULT 'pending', attempts SMALLINT DEFAULT 0, scheduled_at TIMESTAMP DEFAULT NOW(), printed_at TIMESTAMP ); При помилці друку статус змінюється на retry, лічильник спроб збільшується. Після 5 невдалих спроб статус стає failed, адміністратор отримує сповіщення.
Чому Zebra — стандарт для складу?
Принтери Zebra використовують термодрук — не потрібні картриджі, фарба не змащується. Протокол ZPL дозволяє гнучко формувати будь-які макети: з логотипом, змінними полями, штрихкодами EAN-13, Code 128, QR. Вбудований механізм черги друку гарантує, що жодна етикетка не загубиться при збої мережі.
Розробник модуля: «ZPL-протокол настільки гнучкий, що дозволяє друкувати етикетки будь-якого вмісту без зміни коду».
Покрокове налаштування інтеграції
- Встановіть модуль на сайт через marketplace або вручну.
- Налаштуйте шаблони етикеток в адміністративній панелі: задайте поля, шрифти, штрихкоди.
- Підключіть принтери по TCP/IP або через локальний агент.
- Призначте принтери для складів та подій (зміна ціни, приймання).
- Налаштуйте обмін з 1С через CommerceML, якщо потрібна синхронізація.
- Перевірте друк тестової етикетки.
Додаткові налаштування
Для принтерів на Windows-шарі використовуйте агент, який приймає HTTP-запити та надсилає через WinSpool. Увімкніть логування помилок у `/bitrix/zebra_errors.log`.Типові проблеми та їх вирішення
| Проблема | Рішення |
|---|---|
| Принтер не відповідає по TCP | Перевірити порт 9100, firewall, виділений IP |
| Китайські символи на етикетці | Переконатися, що принтер підтримує кирилицю (Zebra GC420t і вище) |
| Розрив з’єднання при великій черзі | Увімкнути повторні спроби (до 5) та сповіщення |
Що входить у роботу
| Компонент | Опис |
|---|---|
| Розробка модуля інтеграції | Класи надсилання ZPL, генерації етикеток, черга друку |
| Налаштування шаблонів етикеток | До 5 стандартних макетів (цінник, складська, відвантажувальна) |
| Підключення принтерів | 1–5 пристроїв по TCP/IP або Windows-агенту |
| Інтеграція з 1С | Автоматичне вивантаження даних у Бітрікс через CommerceML |
| Навчання операторів | 2 години онлайн-демонстрації |
| Документація | Повна технічна документація з інтеграції |
| Гарантія | 6 місяців на модуль, виправлення помилок |
Терміни
| Етап | Термін |
|---|---|
| Клас надсилання ZPL на принтер | 1 день |
| Генератор шаблонів з плейсхолдерами | 2 дні |
| Черга друку + агент | 1 день |
| Обробники подій (зміна ціни, приймання) | 2 дні |
| Адміністративний інтерфейс керування принтерами | 2 дні |
| Тестування з реальним принтером | 1 день |
| Разом | 9–11 днів |
Як інтеграція з 1С спрощує друк?
Зв’язка 1С та Бітрікс через CommerceML дозволяє не дублювати дані. Товари, ціни та залишки синхронізуються автоматично. Коли в 1С змінюється ціна, дані оновлюються в Бітрікс, і одразу спрацьовує друк нової етикетки. Оператору не потрібно вручну запускати завдання — все відбувається у фоні.
Отримайте консультацію з інтеграції — оцінимо ваш проєкт за годину. Напишіть нам, і ми підготуємо детальну комерційну пропозицію з урахуванням ваших принтерів та завдань.
Зв’яжіться з нами, щоб обговорити деталі автоматизації складу.







