Принтер етикеток 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С змінюється ціна, дані оновлюються в Бітрікс, і одразу спрацьовує друк нової етикетки. Оператору не потрібно вручну запускати завдання — все відбувається у фоні.
Отримайте консультацію з інтеграції — оцінимо ваш проєкт за годину. Напишіть нам, і ми підготуємо детальну комерційну пропозицію з урахуванням ваших принтерів та завдань.
Зв’яжіться з нами, щоб обговорити деталі автоматизації складу.







