Печать на кухне и в зале
Вся физическая печать заведения идёт через Cenaly Hardware Bridge — небольшую программу на кассовом устройстве, к которому подключены принтеры. Браузер не печатает на термопринтер напрямую: он отправляет документ мосту, а мост уже говорит с железом на языке ESC/POS.
Через мост печатаются: кухонные тикеты по станциям, стикеры на позицию и на пакет, чек продажи и возврата, пречек, X- и Z-отчёты и манифест пакета на экране выдачи.
Кухонные тикеты по станциям#
Тикет должен приезжать туда, где блюдо готовят: холодный цех — на свой принтер, гриль — на свой, бар — на свой.
Настройка — в Кухне (KDS) → панель «Цеха», таблица «станция → принтер» внутри неё. По каждой станции задаются:
| Поле | Что означает |
|---|---|
| Принтер | конкретное устройство моста; пусто — печатать на принтер с ролью «кухонный» |
| Резервный принтер | куда уйдёт тикет, если основной не отвечает |
| Кто печатает | выключено, касса или KDS |
| Ширина ленты | 42 символа (80-мм лента) или 32 (58-мм) |
| Кодовая страница | см. ниже |
| Стикеры на позиции | печатать наклейки при переводе тикета в «готово» |
«Кто печатает» — это выбор, а не галочка. Касса и KDS — разные устройства с разными мостами, и лента напечатанного хранится у того, кто печатал. Если включить оба, на кухне будет два одинаковых тикета.
Список принтеров подтягивается у локального моста, поэтому настраивать станцию нужно с той машины, к которой принтер физически подключён.
Что попадает в тикет. Крупный шрифт (повар читает бумажку через стол), название блюда, количество, модификаторы отдельной строкой под блюдом, комментарий («без лука»), номер гостя и курс подачи, если заказ по ним разложен. Цен и итогов в кухонном тикете нет.
Печатается только новое. Повторный тап официанта не печатает второй тикет: система помнит, какие строки уже уехали на станцию. Если позицию добавили или изменили количество — уедет тикет-дозаказ, а не полный дубль заказа.
Стикеры на позицию и на пакет#
Наклейка 60×40 мм на стакане и на коробке решает две проблемы выдачи: пакеты перестают путаться между курьерами, а гость видит на стакане, что молоко действительно безлактозное — модификатор больше не остаётся только на кухонном тикете.
- стикер на позицию — печатается при переводе тикета в «готово», если у станции включена соответствующая настройка;
- стикер на пакет — печатается на выдаче: экран спрашивает число пакетов и печатает «Пакет 1 из 3», «2 из 3» и так далее;
- манифест пакета — бумажка внутри пакета с полным составом заказа, включая модификаторы отдельными строками: по ней курьер и гость сверяют комплектность, а спор «не доложили позицию» с агрегатором закрывается печатной уликой. Кнопка — на экране Выдача (Expo).
Стикеры печатает устройство с ролью «этикеточный принтер»; если такой роли на мосте нет, наклейка уйдёт на обычный чековый принтер.
Роль «этикеточный принтер» у моста есть: наклейка уходит на устройство, назначенное этой ролью, а если такого нет — на обычную чековую головку 60-мм класса узким ESC/POS-документом шириной 32 символа, отрыв делает гребёнка. Полноценные TSPL/ZPL-языки этикеточных принтеров не поддерживаются — печатается тот же ESC/POS.
Кассовые документы#
| Документ | Через мост | Комментарий |
|---|---|---|
| Чек продажи / возврата | да | фолбэк — печать браузером |
| Пречек (гостевой счёт) | да | нефискальный, с явной подписью на бумаге |
| X- и Z-отчёты | да | см. Кассовая смена |
| Манифест пакета | да | экран Выдача (Expo) |
| Кухонный тикет, стикеры | да | без браузерного фолбэка |
Точка, где из железа только фискальный регистратор. С 31.08.2026 мост не гонит через регистратор наши документы: чек, распечатанный служебным документом кассы, выглядел бы чеком, им не являясь. Мост отвечает отказом, а касса вместо диалога печати говорит, что чек печатает сама касса, — браузерный фолбэк в этом случае не запускается. Через регистратор разрешены ровно два документа: тестовая печать (иначе на такой точке нечем проверить, печатает ли касса вообще) и пречек (гостевой счёт по закону не фискальный документ). Отдельный чековый принтер снимает это ограничение целиком.
Репринт выданного чека всегда записывается в журнал опасных операций; менеджерский PIN он спрашивает только у должностей, где включено «репринт под PIN» — см. Контроль потерь.
Фискальный чек — отдельная история: он печатается фискальным регистратором и подчиняется законам страны, см. Фискализация.
Очередь печати и что означает результат#
У моста restart-safe очередь с ретраями: если принтер офлайн, задание не теряется, а ждёт и повторяется. Индикатор очереди виден в шапке кассы.
Зависшее задание можно снять. Классическая беда кухни: принтер зажевал бумагу, его чинят полчаса, а когда включают — он выплёвывает полсотни устаревших тикетов. Из очереди в шапке кассы задание отменяется по одному: мост ставит отметку «отменено» и, когда принтер оживёт, просто пропустит его. Если задание уже ушло в печать, отмена честно скажет об этом — бумага в этом случае выйдет.
Кнопка «отменить» есть только у зависших — тех, что ждут принтера дольше трёх минут. Свежие задания видно строкой, но снять их нельзя, и это сделано нарочно: секундная заминка (принтер проснулся, дёрнули кабель) — норма, мост допечатает сам, а кнопка рядом с таким заданием означала бы потерянный чек.
Исход печати — четырёхзначный, и для кассира это разные новости:
| Исход | Что произошло |
|---|---|
| Напечатано | мост подтвердил физическую печать |
| В очереди | мост принял задание, но принтер недоступен — гость чек на руки не получил |
| Браузером | моста нет или он не принял документ, печать пошла через диалог браузера |
| Не напечатано | не удалось никак |
При исходе «в очереди» браузерный фолбэк не запускается — иначе один чек напечатался бы дважды.
Задания идемпотентны: повторная отправка того же документа не даёт второй бумажки.
Кодовые страницы и нелатиница#
Термопринтер не знает, что такое UTF-8: он рисует по глифу на байт из выбранной однобайтовой таблицы. Поэтому кодовая страница задаётся на каждый настроенный принтер:
| Значение | Что делает |
|---|---|
auto (по умолчанию) |
нашёл кириллицу — переключает голову на CP1251; латиница и латиница-расширенная (турецкая, польская, албанская) остаются как есть |
cp1251 / cp866 |
явный выбор кириллической таблицы — дешёвые головки бывают с одной из двух |
georgian-academy / georgian-ps / georgian-expert |
раскладки шрифтового ПЗУ грузинских устройств |
utf8 |
историческое поведение: на любой нелатинице — кракозябры |
Про грузинский честно. Какую таблицу «понимает» конкретная головка — свойство физического устройства, в спецификации протокола этого нет; поэтому таблица выбирается по устройству. Грузинской кодовой страницы в стандарте ESC/POS нет вообще, так что раньше «ხინკალი» уезжало романизацией — khinkali: читается, но заказано было не это.
Теперь строку, которую головка напечатать не может, мост рисует картинкой — растровая печать со встроенным шрифтом, она работает на любом принтере и от его ПЗУ не зависит. Встроенного шрифта хватает на латиницу и латиницу-расширенную, греческий, кириллицу, армянский и все три грузинских начертания (мхедрули, мтаврули, асомтаврули). Там, где текст печатается обычным способом, ничего не меняется — растр включается только по необходимости.
Поведение управляется галочкой «растр для нелатиницы» у каждого устройства (по умолчанию включена, есть и на странице моста, и в облачном разделе «Оборудование»). Снимете — вернётся прежняя романизация: это нужно для редких головок, не понимающих растровую печать.
Иероглифы (китайский, японский, корейский), иврит и арабица в шрифт намеренно не вошли: у письменностей справа налево строка вышла бы задом наперёд, и это хуже нынешнего результата. Панель станций на кухне честно показывает, что будет со строкой: «уйдёт картинкой» или «ни таблицы, ни шрифта нет».
Растровая печать и роль этикеточного принтера требуют Cenaly Hardware Bridge не ниже 0.18.0 (актуальная версия — 0.23.0). На более старых мостах работает прежнее поведение: романизация нелатиницы и печать наклейки на чековой головке.
Турецкая, польская и албанская латиница намеренно не прогоняются через CP1251: там ş, ğ, ą превратились бы в ?.
Что нужно для запуска#
- Мост на кассовом компьютере — Cenaly Hardware Bridge. Вся физическая печать идёт через него.
- Принтер, подключённый к этому же компьютеру — USB, LAN или Bluetooth; мост находит устройства сам.
- Маппинг «станция → принтер» — иначе тикеты некуда маршрутизировать.
- Рулон нужного формата для стикеров позиции и пакета.
- Станции у блюд — тикет собирается по станции позиции (KDS).
Ограничения#
- Мост печатает только со своего компьютера. Браузер не достучится до моста на соседнем ПК: ставьте мост на каждое кассовое устройство или используйте печать через облако на принтер другого ПК.
- Этикеточные принтеры TSPL/ZPL на живом железе не проверены — сейчас этикетки печатаются растром на чековом принтере.
- Ширину ленты решает устройство. Она берётся из настройки принтера, иначе из модели фискальной кассы, иначе принимается безопасной; ширина документа 80 мм на фискальную кассу не переносится, потому что касса не переносит строку, а обрезает её вместе с суммами.
- Пречек не остаётся в очереди. Если чековый принтер настроен, но офлайн, счёт гостю печатается на фискальной кассе: бумажка нужна сейчас, а копия через час поверх оплаченного заказа — это вторая бумажка. Чек продажи ведёт себя иначе — он ждёт повтора.
- Пречек не уходит на кухонный принтер — для счёта гостю такой принтер считается негодным, и работа уходит на кассу.
Устранение неполадок#
Тикет не напечатался. Проверьте статус моста: если он офлайн, задание стоит в очереди печати и уйдёт при восстановлении связи с ним — очередь переживает перезапуск.
Печатается не на том принтере. У станции не задан свой принтер, и резолвер выбрал «любой доступный». Пропишите маппинг станций явно.
Вместо букв — иероглифы или пустые квадраты. Проблема кодовой страницы принтера: включите растровый шрифт — он рисует текст картинкой и печатает любые языки.
Обрезаются суммы справа. Указана слишком большая ширина ленты: поставьте реальную ширину в опции устройства.
Стикеры выходят кривым размером. Проверьте формат рулона и то, что печать идёт на этикеточный принтер, а не на чековый (сейчас этикетки на чековом печатаются растром).
Связанные разделы#
- Cenaly Hardware Bridge — установка моста, список устройств, роли принтеров
- Кухня (KDS) — станции, курсы подачи и настройка печати
- Касса (POS) — чек, пречек, репринт
- Выдача (Expo) — манифест и стикеры пакета
- Кассовая смена — X- и Z-отчёты
- Контроль потерь — репринт как событие риска
Частые вопросы#
Тикет напечатался дважды — почему?#
Скорее всего, у станции включена печать и на кассе, и на KDS. Это два разных устройства с двумя мостами, и каждое напечатало свой экземпляр. Оставьте одно значение в поле «Кто печатает».
Принтер отключили — заказы потерялись?#
Нет. Задание уходит в очередь моста и печатается, когда принтер оживёт. Но пока оно в очереди, бумаги физически нет — интерфейс это прямо говорит.
Можно ли печатать на кухню без моста?#
Кухонные тикеты и стикеры — нет, они идут только через мост. Кассовые документы имеют браузерный фолбэк: печать через обычный диалог печати. Исключение — точка, где из железа только фискальный регистратор: там чек печатает сама касса, и браузерный фолбэк не включается.
Почему в списке принтеров пусто?#
Список берётся у моста на этом устройстве. Если мост не запущен или принтер подключён к другой машине, устройства не появятся — настраивайте станцию с той машины, где принтер физически подключён.
Модификаторы печатаются в манифесте пакета?#
Да. Кухонный тикет, стикер позиции и манифест пакета собираются одним форматом строки: название блюда, под ним модификаторы отдельными строками и комментарий. Так три бумажки по одному заказу выглядят одинаково и сверяются глазами.