# Кабинет печати этикеток для маркетплейса

> Печать 80 этикеток одним файлом вместо поштучной, свой журнал печати и фильтры по всем полям API. Ключи продавца на сервере не хранятся.

Селлер на маркетплейсе · схема FBS

Сделать кабинет, в котором сборщик заказов видит отправления к отгрузке и печатает по ним этикетки пачкой — вместо выгрузок в Excel и печати по одной из личного кабинета.

**Стек:** PHP 8.4 · Ozon Seller API · ghostscript · шаред-хостинг

## Что мешало

- Этикетки печатали поштучно, сверяясь с выгрузкой в Excel
- Никто не помнил, по каким заказам уже печатали, а по каким нет
- Маркетплейс отдаёт максимум 20 отправлений за один запрос печати
- Часть методов API отключена и отвечает «устаревший метод», а документация закрыта антиботом
- Хостинг — шаред: ни собственного сервера, ни привычных утилит

## Что сделали

- Собрали закрытый раздел на сайте: два рубежа доступа — пароль на весь раздел и ключи продавца, которые вводит сам пользователь
- Ключи маркетплейса на сервере не хранятся: живут во вкладке браузера и уходят в теле каждого запроса
- Таблица отправлений с фильтрами прямо в заголовках колонок: сортировка, поиск, выбор значений галочками
- Печать пачками по 20 — ограничение API — и склейка в один PDF на сервере
- Свой журнал печати: маркетплейс такого признака не отдаёт, проверено сверкой всех полей у печатанного и непечатанного заказа
- Файлы печатей хранятся вне корня сайта, с описью и сроком хранения
- Выгрузка в CSV в том же формате, к которому привыкли в Excel

## Что стало

- **80** — этикеток за один прогон вместо печати по одной
- **20** — отправлений в пачке — предел API, дальше склейка
- **51** — поле сверено, чтобы доказать: признака печати нет
- **0,3 с** — склейка PDF после прогрева вместо ручной сборки

Сборщик открывает страницу, фильтрует по складу и статусу, отмечает нужные заказы и получает один PDF со всеми этикетками. Рядом видно, по каким заказам печать уже была и когда — включая повторные. Файл можно скачать заново из журнала.

## Чему это научило

Самое дорогое открытие было отрицательным: маркетплейс не отдаёт признак того, что этикетка напечатана. Мы доказали это, сравнив у двух заказов — печатанного и непечатанного — все 51 поле ответа, включая список доступных действий. Отрицательный результат тоже результат: он избавил от поиска несуществующего поля и обосновал собственный журнал. Второй урок дешевле, но чаще: проверять надо не «запись прошла», а «файл читается» — первое вложение в отчёт записалось успешно и при этом не открывалось.

## Другие разборы

- [Трафик есть, заявок почти нет: разбор двух сайтов](https://it-zarya.ru/cases/marketing-audit/) — 38 843 визита за месяц дали 30 обращений. Нашли, почему часть заявок не попадала в аналитику и куда уходило 95% бюджета.
- [Монолит разобран на 15 сервисов на Go](https://it-zarya.ru/cases/monolith-split/) — Монолит разобран на 15 сервисов на Go: контракты в отдельных репозиториях, Kafka для событий, выкатка через ArgoCD без ручных шагов.
- [Миграция справочников 1С → Битрикс24 без дублей](https://it-zarya.ru/cases/1c-b24-migration/) — Перенос справочников из 1С в Битрикс24: 639 компаний, 9 202 контакта, 15 024 реквизита — без ошибок и дублей. Повторный запуск дублей не создаёт.

## Похожая задача

Если узнали свою ситуацию — расскажите, что происходит у вас. Вернёмся с оценкой в часах и планом работ.

[Обсудить задачу](https://it-zarya.ru/contacts/) [Услуга: Парсинг данных](https://it-zarya.ru/services/parsing/)

---

Источник: https://it-zarya.ru/cases/ozon-labels/ · IT-агентство «Заря» · itzarya@mail.ru
Markdown-версия любой страницы сайта — тот же адрес с `.md` на конце. Индекс для ассистентов: https://it-zarya.ru/llms.txt
