Інтеграція 1С-Бітрікс із принтерами етикеток Brother
При переході на самоклеючі етикетки багато інтернет-магазинів стикаються з проблемою: Zebra-принтери дорогі, а для малих обсягів надлишкові. Brother пропонує бюджетну альтернативу, але інтеграція з Бітрікс потребує нестандартного підходу — через системний принтер, а не прямий потік даних. Ми маємо досвід понад 10 проєктів із вбудовування Brother в екосистему 1С-Бітрікс і гарантуємо стабільний друк в офісних та легких складських сценаріях.
Brother — альтернатива Zebra для офісних та легких складських завдань. Лінійки QL (термодрук на стрічках DK) та PT (стрічкові принтери) використовуються там, де потрібні невеликі партії етикеток: маркування комплектації, адресні наклейки на відправлення, етикетки полиць. Принципова відмінність від Zebra: Brother працює переважно через друк із системного принтера (GDI/CUPS), а не через RAW TCP/IP з ZPL. Brother на 30–50% швидший у налаштуванні для малого бізнесу — не потрібно вивчати ZPL, достатньо базових знань PHP.
Чому Brother, а не Zebra для старту?
Brother суттєво вигідніший при обсягах до 500 етикеток на день: вартість принтера в 2-3 рази нижча, а налаштування інтеграції займає на 3-5 днів менше. Для інтернет-магазину з 50-200 замовленнями на день це оптимальне рішення. Якщо обсяги зростуть — ми масштабуємо систему до Zebra без втрати даних.
Способи взаємодії з принтером Brother
Варіант 1: Через системний принтер (рекомендується для офісу)
Brother встановлюється як системний принтер у Windows або macOS. Бітрікс генерує PDF або PNG потрібного розміру та відправляє на друк через системну команду:
function printLabelViaCups(string $pdfPath, string $printerName): bool
{
$cmd = escapeshellcmd("lp -d " . escapeshellarg($printerName) . " " . escapeshellarg($pdfPath));
exec($cmd . ' 2>&1', $output, $returnCode);
return $returnCode === 0;
}
Для Windows — аналогічно через SumatraPDF -print-to або mspaint /pt.
Варіант 2: Brother SDK / b-PAC (Windows only)
Brother надає COM-об'єкт b-PAC для роботи з шаблонами .lbx у P-touch Editor. Інтеграція через PHP COM-інтерфейс:
$doc = new COM('bpac.Document');
$doc->Open('C:\\Labels\\price_label.lbx');
$doc->GetObject('barcode')->Text = $barcode;
$doc->GetObject('price')->Text = number_format($price, 2, ',', ' ') . ' руб.';
$doc->GetObject('name')->Text = $productName;
$doc->StartPrint('', 0);
$doc->PrintOut(1, 0);
$doc->EndPrint();
$doc->Close();
Цей підхід працює лише якщо PHP виконується на Windows-сервері зі встановленим Brother P-touch Editor. Для production-серверів під Linux не застосовний.
Варіант 3: Brother Web API (QL-820NWB та нові моделі)
Ряд мережевих моделей Brother мають веб-API. Документація специфічна для кожної моделі, але загальний принцип: HTTP POST з base64-закодованим зображенням або PDF. Цей спосіб швидший за системний друк, але потребує додаткової розробки на стороні Бітрікс.
Як організувати чергу друку для Brother?
На відміну від Zebra (де TCP-відправка швидка), друк через системний принтер займає час. Використовуємо ту саму архітектуру черги bl_brother_print_queue:
CREATE TABLE bl_brother_print_queue (
id SERIAL PRIMARY KEY,
printer_name VARCHAR(128) NOT NULL, -- ім'я в CUPS
template VARCHAR(64) NOT NULL,
product_id INT,
data_json JSONB,
copies SMALLINT DEFAULT 1,
status VARCHAR(20) DEFAULT 'pending',
created_at TIMESTAMP DEFAULT NOW(),
processed_at TIMESTAMP
);
Агент Бітрікс бере завдання з черги, рендерить PNG через BrotherLabelRenderer, відправляє на CUPS. Для великих обсягів можна масштабувати — ставити кілька принтерів і крутити по кілька агентів паралельно.
Генерація етикетки на стороні Бітрікс
Для Linux-серверів (варіант 1) генеруємо зображення етикетки через GD або Imagick:
class BrotherLabelRenderer
{
public function renderPriceLabel(array $product, int $widthMm = 62, int $heightMm = 29): string
{
$dpi = 300;
$wPx = (int)($widthMm / 25.4 * $dpi);
$hPx = (int)($heightMm / 25.4 * $dpi);
$image = imagecreatetruecolor($wPx, $hPx);
$white = imagecolorallocate($image, 255, 255, 255);
$black = imagecolorallocate($image, 0, 0, 0);
imagefill($image, 0, 0, $white);
// Назва товару (використовуємо TTF-шрифт)
$fontPath = $_SERVER['DOCUMENT_ROOT'] . '/local/fonts/DejaVuSans.ttf';
imagettftext($image, 14, 0, 20, 60, $black, $fontPath, mb_substr($product['NAME'], 0, 35));
// Ціна велико
$price = number_format($product['PRICE'], 2, ',', ' ') . ' руб.';
imagettftext($image, 28, 0, 20, 120, $black, $fontPath, $price);
// Штрихкод через бібліотеку (picqer/php-barcode-generator)
$barcodeGenerator = new \Picqer\Barcode\BarcodeGeneratorPNG();
$barcodePng = $barcodeGenerator->getBarcode($product['BARCODE'], $barcodeGenerator::TYPE_EAN_13, 2, 60);
$barcodeImg = imagecreatefromstring($barcodePng);
imagecopy($image, $barcodeImg, 20, 150, 0, 0, imagesx($barcodeImg), imagesy($barcodeImg));
$tmpPath = sys_get_temp_dir() . '/label_' . $product['ID'] . '_' . time() . '.png';
imagepng($image, $tmpPath);
imagedestroy($image);
return $tmpPath;
}
}
Imagick дає більш чіткі шрифти та підтримує векторні елементи. Ми рекомендуємо використовувати його на серверах з PHP 8.1+.
Порівняння методів інтеграції
| Метод |
Швидкість друку |
Складність налаштування |
Сумісність з Linux |
Необхідність SDK |
| Системний принтер (CUPS) |
Середня |
Низька |
Так |
Ні |
| COM-об'єкт b-PAC |
Висока |
Висока |
Ні |
Так |
| Brother Web API |
Висока |
Середня |
Так |
Ні |
Інтеграція з адміністративним інтерфейсом
У картці товару Бітрікс додаємо кнопку «Надрукувати етикетку» — вона додає завдання в чергу з вибором принтера зі списку (bl_brother_printers). При масовому виділенні товарів у списку — групова дія «Надрукувати етикетки».
Кнопка «Надрукувати етикетки на відвантажуване замовлення» додається в адміністративну картку замовлення: генерує адресну наклейку (ПІБ, адреса, номер замовлення) та етикетки комплектації. Усі шаблони легко адаптуються під дизайн вашої компанії — ми надаємо вихідні SVG.
Що входить у роботу
- Рендерер етикеток з підтримкою штрихкодів, цін, назв (GD/Imagick) — 2 дні
- Черга друку + агент з обробкою помилок та повторними спробами — 1 день
- Інтеграція з системним принтером (CUPS/Windows) — 1 день
- Кнопки друку в картці товару та замовлення — 2 дні
- Тестування з реальним принтером Brother — 1 день
- Документація з встановлення та налаштування — включено
- Підтримка 2 тижні після запуску — безкоштовно
Строки
| Етап |
Строк |
| Рендерер етикеток (GD/Imagick + TTF) |
2 дні |
| Черга друку + агент |
1 день |
| Інтеграція з CUPS / системним принтером |
1 день |
| Кнопки в картці товару та замовлення |
2 дні |
| Тестування з реальним принтером Brother |
1 день |
| Разом |
7–9 днів |
Оцінимо ваш проєкт безкоштовно — просто опишіть завдання. Виконаємо інтеграцію під ключ за 7–9 робочих днів з гарантією стабільної роботи.
CommerceML: чому стандартний обмін — і порятунок, і пастка
Стандартний обмін через CommerceML 2.0 на типовому «Управлінні торгівлею» або «Комплексній автоматизації» заводиться за день-два. Товари, ціни, залишки, замовлення — все через XML-файли за розкладом. Для магазину на 3 000 позицій з парою оновлень на добу цього вистачає з запасом. Але як тільки каталог переростає 30 000 SKU, починаються проблеми: інтеграція 1С з Бітрікс на великих обсягах потребує нестандартних рішень.
Чому CommerceML гальмує на каталогах понад 100 000 товарів?
bitrix_1c_exchange.php генерує XML на стороні Бітрікса, 1С забирає та парсить. На великих каталогах парсер активно пише в тимчасову таблицю b_xml_tree — MySQL може стати колом. Ми бачили проект, де стандартний обмін 180 000 товарів займав 6 годин і повністю блокував сервер: ні адмінка, ні фронт не відкривалися. Рішення — інкрементальний обмін. В налаштуваннях вузла обміну на стороні 1С ставимо «Вивантажувати тільки змінені» та розбиваємо вивантаження на пакети по 500–1000 елементів. На стороні Бітрікса — кастомний обробник, який не перестворює b_xml_tree кожного разу, а працює через CIBlockXMLFile::ReadXMLToDatabase() з контролем порцій. Каталог у 200 000 SKU оновлюється за 8–12 хвилин.
Ще один підводний камінь — EXTERNAL_ID. При повторному імпорті Бітрікс зіставляє елементи інфоблоків за зовнішнім кодом. Якщо в 1С товар видалено та створено заново з новим GUID, на сайті з'являється дубль — зі старими відгуками на одній картці та нульовими на іншій. Лікується жорсткою прив'язкою за артикулом через кастомний обробник події OnBeforeIBlockElementAdd.
Як уникнути дублів при повторному імпорті?
Прив'язуємо товари не за GUID, а за артикулом. Перевірка на унікальність виконується до запису в інфоблок — дублікати виключаються навіть після перестворення номенклатури в 1С. На одному проекті з 50 000 товарів така схема запобігла появі 300 дублів на місяць і заощадила контент-менеджерам близько 20 годин ручного чищення.
Кастомні конфігурації 1С: коли CommerceML пасує
«У нас типова конфігурація» — каже кожен другий клієнт, а потім ми відкриваємо базу і бачимо 200 кастомних обробок, перейменовані реквізити та самописні документи реалізації. CommerceML працює з фіксованою структурою XML. Якщо в 1С змінили склад реквізитів номенклатури або додали нестандартний документ — обмін мовчки пропускає ці дані. Або падає з незрозумілою помилкою в журналі реєстрації 1С, а в Бітрікс нічого не пишеться.
У таких випадках робимо кастомне вивантаження. На стороні 1С пишемо обробку, яка формує JSON (парсити швидше, налагоджувати простіше) і відправляє через REST API Бітрікса. Повний контроль: які поля беремо, як трансформуємо, що робимо при конфлікті. Для важких випадків — D7 API з прямою роботою через \Bitrix\Catalog\ProductTable та \Bitrix\Sale\Order.
| Критерій |
CommerceML (стандарт) |
Кастомний REST (JSON) |
| Швидкість на 100 000+ SKU |
Низька (повний XML) |
Висока (інкрементальний JSON) |
| Гнучкість схеми |
Фіксована |
Довільна |
| Можливість розширення |
Обмежена |
Без обмежень |
| Простота налагодження |
Журнал реєстрації 1С |
Логи HTTP-запитів, Postman |
Коли потрібен кастомний REST замість CommerceML?
Кастомний REST виправданий при:
- нестандартних реквізитах номенклатури;
- множинних типах цін (роздріб, опт, дилерська, акційна, регіональна, валютна) — стандартний обмін передає лише один тип;
- мультискладі з різними залишками та необхідністю вибору складу на сайті.
Ціни, залишки та мультисклад
Стандартний обмін вміє передавати один тип ціни. В реальності їх може бути 15: кожна зі своєю групою покупців та пріоритетом. Мапінг між ціновими групами 1С та групами користувачів Бітрікса — окрема інженерна задача. Особливо коли знижки перетинаються і потрібно визначити, яка ціна перемагає.
Мультисклад додає ще один шар: товар є на складі в Москві, немає в Пітері, і «під замовлення» в Новосибірську. На сайті потрібно показати наявність по кожній точці, підключити вибір пункту самовивозу та розрахувати доставку від найближчого складу, де товар фізично є. Стандартний модуль складського обліку Бітрікс (catalog.store) справляється з відображенням, але логіку «звідки відвантажувати» пишемо окремо. Для одного виробничого холдингу ми реалізували кастомний агрегатор залишків, який за 2 секунди розраховував баланс по 8 складах — це скоротило кількість помилок відвантаження на 80%.
Замовлення та документообіг
Замовлення з сайту відлітає в 1С, формується реалізація, товар резервується. Статуси повертаються назад. Головний нюанс — часткове відвантаження: клієнт замовив 5 позицій, 3 є на складі, 2 прийдуть через тиждень. 1С формує два документи реалізації. Бітрікс з коробки не вміє розбивати одне замовлення на кілька відвантажень — доопрацьовуємо обробник OnSaleOrderSaved, який створює дочірні замовлення та синхронізує статуси по кожному.
Документи в особистому кабінеті — рахунки, акти, накладні з 1С — віддаємо через REST, PDF генерується на стороні 1С і кешується на CDN. Покупець завантажує не з 1С напряму (це вбило б сервер), а з кешу.
Рекомендація CommerceML: пакетний імпорт з контролем порцій знижує навантаження на MySQL та виключає блокування (джерело: Wikipedia).
Моніторинг: не «налаштував і забув»
Обмін може зламатися тихо: скрипт відпрацював, помилок в лозі немає, але 200 товарів не оновилися через невалідний UTF-8 в назві. Або 1С змінила формат дати в черговому оновленні — всі ціни прийшли нульовими.
Мінімальний набір, який ставимо на кожному проекті:
- Алерт в Telegram, якщо час обміну виріс у 3+ рази від середнього.
- Перевірка розбіжності залишків: скрипт порівнює
b_catalog_product.QUANTITY з тим, що віддає 1С, і сповіщає при дельті більше 5 %.
- Дашборд: остання синхронізація, кількість оброблених позицій, черга, помилки.
Для проектів з високим навантаженням додаємо асинхронні черги на Redis або RabbitMQ. Обмін не блокує веб-сервер, дані не втрачаються при короткочасному падінні 1С. На одному інтернет-магазині з оборотами 2 млн замовлень на рік ми впровадили таку схему — час відновлення після збоїв скоротився з 3 годин до 10 хвилин.
Зв'язка з Бітрікс24 для автоматизації документообігу
Якщо крім сайту є корпоративний портал на Бітрікс24 — зв'язуємо і його. Контрагенти з CRM летять в 1С, рахунки з 1С з'являються в картці угоди. Менеджер бачить дебіторку та взаєморозрахунки, не перемикаючись між вікнами. Закрили угоду — документи сформувалися самі.
Оплата надійшла в 1С → логіст отримує задачу на відвантаження в Бітрікс24. Товар відвантажений → менеджер бачить повідомлення. Автоматичні задачі за подіями з 1С — через вебхуки Бітрікс24 REST API. Така зв'язка скорочує ручне введення на 70% та виключає забуті відвантаження.
Як ми налаштовуємо інтеграцію: покроковий процес
-
Аудит конфігурації 1С. Дивимось структуру довідників, документів, реквізитів. Виявляємо кастомні доопрацювання. Оцінюємо обсяг даних (кількість SKU, замовлень, складів).
-
Проектування схеми обміну. Узгоджуємо набір даних: товари, ціни, залишки, замовлення, документи. Визначаємо інтервал синхронізації та механізм — CommerceML або кастомний REST.
-
Налаштування стандартного обміну. Налаштовуємо CommerceML, пакетний режим, прив'язку за артикулом. Перевіряємо коректність передачі даних на тестовому каталозі.
-
Розширена інтеграція. Для складних конфігурацій пишемо кастомні обробники на стороні 1С та Бітрікса. Підключаємо мультисклад, множинні ціни, часткове відвантаження.
-
Моніторинг та гарантія. Встановлюємо алерти, дашборд, документацію. Навчаємо операторів. Після запуску — гарантійна підтримка.
Типові налаштування обміну для каталогу 50 000 SKU
Пакетний режим: 500 елементів за крок. Прив'язка за артикулом. Період синхронізації: кожні 15 хвилин. Використовуємо агенти Бітрікса з тегованим кешуванням. На стороні 1С — обробка формування JSON замість XML для прискорення.
Строки та що входить в роботу
| Етап |
Опис |
Орієнтовний строк |
| Аналітика |
Аудит конфігурації 1С, структури обміну, поточних проблем |
1–2 дні |
| Проектування схеми |
Узгодження набору даних (товари, ціни, замовлення) та архітектури |
2–5 днів |
| Реалізація стандартного обміну |
Налаштування CommerceML, пакетного режиму, прив'язки за артикулом |
1–2 тижні |
| Розширена інтеграція |
Кастомний REST, мультисклад, множинні ціни, часткове відвантаження |
2–4 тижні |
| Повна кастомна зв'язка |
1С + сайт + Бітрікс24, асинхронні черги, моніторинг |
1–2 місяці |
Результат роботи включає: документовану схему обміну, налаштовані сценарії синхронізації, дашборд моніторингу, навчання операторів та гарантійну підтримку після запуску. Вартість розраховується індивідуально — вона залежить від складності конфігурації 1С, обсягу каталогу та необхідного ступеня автоматизації. Оцінимо ваш проект за 1 день — пишіть, обговоримо. Замовте інтеграцію — отримайте стабільний обмін за 1–2 тижні.
Ми провели понад 50 інтеграцій 1С для інтернет-магазинів та виробничих компаній. Середній досвід команди — 7 років, у нас є сертифіковані спеціалісти 1С-Бітрікс. Наш досвід гарантує, що обмін не зламається в перший же місяць і буде стабільно працювати роками. Наприклад, на проекті з каталогом 50 000 товарів автоматизація обміну заощадила клієнту близько 200 000 рублів на рік на операційних витратах.
Зв'яжіться з нами для безкоштовного аудиту вашої конфігурації 1С — знайдемо вузькі місця та запропонуємо оптимальне рішення.