Настройка печати этикеток и штрихкодов на 1С-Битрикс
Склад получает новую партию, каждый товар надо промаркировать. Сотрудник открывает карточку товара в Битриксе, копирует название, артикул, вставляет в Word, распечатывает. Умножьте на 200 позиций. Это заканчивается либо ошибками в этикетках, либо перепечаткой половины партии.
Штрихкоды в каталоге
Штрихкоды хранятся в таблице b_catalog_product_barcode: PRODUCT_ID, BARCODE, TYPE (тип кода: EAN13, Code128, QR и т.д.). Одному товару может соответствовать несколько штрихкодов разных типов.
Получение штрихкодов товара:
$barcodes = \Bitrix\Catalog\ProductBarcodeTable::getList([
'filter' => ['PRODUCT_ID' => $productId],
'select' => ['BARCODE', 'TYPE'],
])->fetchAll();
Если у товара нет штрихкода, он генерируется. Автогенерация EAN-13 из ID товара:
function generateEan13FromId(int $productId): string {
$code = str_pad($productId, 12, '0', STR_PAD_LEFT);
// Расчёт контрольной цифры EAN-13
$sum = 0;
for ($i = 0; $i < 12; $i++) {
$sum += (int)$code[$i] * ($i % 2 === 0 ? 1 : 3);
}
$checkDigit = (10 - ($sum % 10)) % 10;
return $code . $checkDigit;
}
После генерации штрихкод сохраняется в b_catalog_product_barcode.
Генерация изображения штрихкода
Для генерации изображений штрихкодов используются PHP-библиотеки. В экосистеме Битрикс чаще всего встречается picqer/php-barcode-generator или кастомный класс на базе GD. Установка через Composer:
composer require picqer/php-barcode-generator
Генерация EAN-13 в SVG для печати:
$generator = new \Picqer\Barcode\BarcodeGeneratorSVG();
$svg = $generator->getBarcode('4607134392015', $generator::TYPE_EAN_13, 3, 60);
SVG предпочтительнее PNG для печати — масштабируется без потери качества при любом DPI.
Шаблон этикетки
Этикетка собирается как HTML-страница и отправляется на печать через браузер или конвертируется в PDF. Минимальный шаблон для печати через @media print:
<!DOCTYPE html>
<html>
<head>
<style>
@page { size: 58mm 40mm; margin: 2mm; }
body { font-family: Arial; font-size: 8pt; }
.label { width: 54mm; height: 36mm; display: flex; flex-direction: column; }
.barcode { text-align: center; }
.name { font-size: 7pt; overflow: hidden; max-height: 12mm; }
.price { font-size: 14pt; font-weight: bold; text-align: right; }
</style>
</head>
<body>
<div class="label">
<div class="name"><?= htmlspecialchars($product['NAME']) ?></div>
<div class="price"><?= $price ?> руб.</div>
<div class="barcode"><?= $svg ?></div>
<div style="text-align:center; font-size:7pt"><?= $barcode ?></div>
</div>
</body>
</html>
Размер страницы 58mm 40mm — стандарт для этикеточного принтера Zebra/Godex с шириной 58 мм.
Административный интерфейс печати
Интерфейс выбора и печати этикеток встраивается в административную часть Битрикса через кастомную страницу в /bitrix/admin/. Страница принимает список PRODUCT_ID[] через GET-параметры (передаётся из списка товаров через "Действия над выбранными"), рендерит этикетки, вызывает window.print().
Для пакетной печати — несколько этикеток на одном листе A4 — используется grid-раскладка с фиксированными размерами ячеек под формат этикетки. При печати CSS break-inside: avoid предотвращает разрыв этикетки между страницами.
Интеграция с принтером этикеток
Zebra и аналогичные принтеры принимают команды ZPL (Zebra Programming Language) или EPL. Для прямой отправки на сетевой принтер из PHP:
$socket = fsockopen('192.168.1.100', 9100, $errno, $errstr, 5);
if ($socket) {
$zpl = buildZplLabel($product, $barcode);
fwrite($socket, $zpl);
fclose($socket);
}
Это работает для пакетной печати без открытия браузерного окна и быстрее для больших объёмов. При печати через браузер каждый лист требует подтверждения — для 200 этикеток это неприемлемо.







