Кассовый аппарат отказывается печатать чек из JSON-файла чаще всего по одной из трёх причин: нарушена структура задания, не установлен или не запущен драйвер ККТ, либо файл сохранён в неправильной кодировке. Прежде чем искать ошибку в коде, проверьте, что касса видна в драйвере и проходит тест связи — без этого никакой JSON до устройства просто не дойдёт.

Под «печатью чека из JSON» обычно понимают отправку на фискальный регистратор или онлайн-кассу структурированного задания в формате JSON, которое содержит тип операции, позиции, суммы и реквизиты. Такой подход используется при интеграции кассы с учётными системами, самописными скриптами и веб-сервисами. В этой статье разберём, как устроено JSON-задание, какие инструменты нужны для его отправки и как диагностировать типовые сбои.

Что представляет собой JSON-задание для печати чека

JSON-задание — это текстовый файл или строка, в которой описаны все параметры будущего чека: тип операции (приход, возврат прихода, расход), список товарных позиций с ценами и количеством, способ расчёта, ставки НДС и реквизиты кассира. Кассовое ПО или драйвер парсит эту структуру и преобразует её в команды фискального накопителя.

Важно понимать: единого универсального стандарта JSON-чека не существует. У каждого производителя ККТ и каждого драйвера свой набор полей и свои названия параметров. Схема, которая работает с оборудованием АТОЛ, не обязательно совпадёт со схемой для Штрих-М или Меркурий. Поэтому первым делом найдите официальную документацию на JSON-интерфейс именно вашего драйвера — обычно она называется «описание формата заданий» или «JSON API».

Типовой минимальный набор полей задания выглядит так:

  • 🧾 Тип документа — открытие смены, чек, закрытие смены, отчёт о состоянии расчётов;
  • 🛒 Позиции чека — наименование товара, цена, количество, налоговая ставка;
  • 💳 Оплата — наличный или безналичный расчёт, сумма по каждому виду оплаты;
  • 👤 Кассир — ФИО и, если требуется, ИНН оператора;
  • 📧 Реквизиты покупателя — телефон или email для отправки электронного чека, если он нужен.

Подготовка: драйвер ККТ и проверка связи

Прежде чем отправлять JSON, убедитесь, что касса физически подключена и определяется системой. Установите актуальную версию драйвера ККТ с официального сайта производителя и запустите тест связи — эта функция есть в штатной утилите настройки практически любого драйвера. Если тест связи не проходит, дальнейшие шаги бессмысленны: проверяйте кабель, порт и параметры подключения.

Для сетевых касс дополнительно проверьте, что компьютер и ККТ находятся в одной сети и порт кассы доступен. Для USB-подключения убедитесь, что в диспетчере устройств нет конфликтов и порт определился корректно.

⚠️ Внимание: не отправляйте тестовые задания на боевую кассу с реальным фискальным накопителем — каждый чек фискализируется и уходит в ОФД. Для отладки используйте режим эмуляции, если он предусмотрен вашим драйвером, или тестовый фискальный накопитель.

Структура JSON-файла: пример и правила оформления

Конкретные имена полей зависят от драйвера, но общие принципы одинаковы: файл должен быть валидным JSON, содержать корневой объект задания и строго соответствовать схеме производителя. Условный упрощённый пример структуры (не привязанный к конкретному вендору):

{

"type": "sell",

"operator": { "name": "Иванов И.И." },

"items": [

{

"name": "Товар 1",

"price": 100.00,

"quantity": 2,

"tax": "vat20"

}

],

"payments": [

{ "type": "cash", "sum": 200.00 }

]

}

Обратите внимание на детали, которые чаще всего становятся причиной отказа:

  • 📄 Кодировка файла — сохраняйте JSON в UTF-8 без BOM, если документация не требует иного;
  • 🔢 Типы данных — суммы передавайте числом, а не строкой, если того требует схема; лишние кавычки ломают парсинг;
  • Разделитель дробной части — точка, а не запятая, это стандарт JSON;
  • 🚫 Лишние поля — некоторые драйверы отклоняют задание при наличии неизвестных параметров.

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

📊 Что чаще всего мешало вам распечатать чек из JSON?
Ошибки в структуре файла
Касса не видна в драйвере
Неправильная кодировка
Расхождение сумм оплаты и позиций

Способы отправки JSON на печать

Существует несколько рабочих сценариев в зависимости от вашего оборудования и ПО. Выберите тот, который соответствует вашей связке «касса + драйвер».

Первый способ — через веб-сервер драйвера. Многие современные драйверы ККТ поднимают локальный HTTP-сервис, принимающий JSON-задания POST-запросом. В этом случае отправка сводится к простому запросу, например через curl:

curl -X POST http://127.0.0.1:PORT/api/task -H "Content-Type: application/json" -d @check.json

Номер порта и путь endpoint возьмите из документации вашего драйвера — они различаются между производителями и версиями. После отправки сервер обычно возвращает идентификатор задания, по которому отдельным запросом проверяется статус выполнения.

Второй способ — через файл-обменник. Некоторые драйверы отслеживают указанную папку: вы кладёте туда JSON-файл, драйвер забирает его, печатает чек и складывает рядом файл с результатом. Этот вариант удобен для интеграции с программами, которые умеют только сохранять файлы на диск.

Третий способ — через COM-объект или библиотеку драйвера из вашего кода (1С, Python, C# и т.д.). Здесь JSON либо передаётся в специальный метод целиком, либо вы формируете чек вызовами отдельных методов драйвера.

☑️ Перед отправкой JSON-чека проверьте

Выполнено: 0 / 6

Диагностика типичных ошибок

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

СимптомВероятная причинаЧто проверить
Задание не принимается вообщеНевалидный JSON или неверный endpointПрогнать файл через валидатор, сверить адрес и порт
Задание принято, но чек не выходитОшибка на уровне кассыЗапросить статус задания, проверить ленту и смену
Ошибка по суммеОплата не равна итогу позицийПересчитать итог, проверить округление
Крякозябры в наименованияхНеверная кодировка файлаПересохранить в UTF-8
Отказ из-за неизвестного поляПараметр не поддерживается версией драйвераСверить схему с документацией вашей версии
⚠️ Внимание: после обрыва связи в момент печати не отправляйте задание повторно вслепую — сначала запросите статус последнего документа. Иначе возможна печать дубля чека, который уже ушёл в фискальный накопитель.
💡

Держите под рукой эталонный JSON-файл с минимальным чеком из одной позиции. Если сложное задание не проходит, отправьте эталонное: если и оно падает — проблема в связи или кассе, а не в структуре вашего файла.

Печать чека без фискализации: чисто техническая сторона

Иногда под запросом «распечатать чек JSON» скрывается другая задача: вывести на обычный принтер данные из JSON-файла в виде, похожем на чек — например, для внутреннего учёта или тестового макета. Здесь фискальный аппарат не нужен: достаточно скрипта, который читает JSON и формирует печатную форму.

Простейший вариант на Python — прочитать файл и сформировать текст для вывода:

import json

with open("check.json", encoding="utf-8") as f:

data = json.load(f)

total = 0

for item in data["items"]:

line_sum = item["price"] * item["quantity"]

total += line_sum

print(f'{item["name"]} x{item["quantity"]} = {line_sum:.2f}')

print(f"ИТОГО: {total:.2f}")

Полученный текст можно направить на принтер штатными средствами ОС или оформить в HTML-шаблон и распечатать из браузера. Такой документ не является фискальным чеком и не заменяет его в расчётах с покупателями.

Почему нельзя просто «распечатать» фискальный чек на обычном принтере

Фискальный чек формируется связкой ККТ и фискального накопителя: данные подписываются, получают фискальный признак и номер ФД, а копия передаётся оператору фискальных данных. Распечатка из обычного принтера не содержит этих реквизитов и юридически чеком не является. Для расчётов с покупателями используйте только зарегистрированную кассу.

💡

Успешная печать чека из JSON держится на трёх вещах: рабочая связь с кассой, валидный JSON по схеме именно вашего драйвера и сходящиеся суммы. Проверяйте их в этом порядке — так вы найдёте причину сбоя быстрее всего.

Проверка результата и работа с ответом драйвера

После отправки задания не ограничивайтесь фактом печати — убедитесь, что чек корректно закрыт на фискальном уровне. В ответе драйвера или в файле результата ищите подтверждение успешного выполнения: номер фискального документа, фискальный признак, отсутствие кода ошибки. Если задание зависло в статусе «выполняется», проверьте ленту в кассе и состояние соединения.

При систематических сбоях включите логирование в драйвере, если такая функция предусмотрена. Лог покажет, на каком поле или команде обрывается обработка, и сэкономит часы на угадывании причины. Никогда не гадайте по симптомам, когда можно прочитать точный код ошибки в ответе драйвера или в его журнале.

Часто задаваемые вопросы

Подойдёт ли один и тот же JSON для касс разных производителей?

Нет. Формат задания определяется драйвером конкретного производителя: названия полей, обязательные параметры и структура различаются. Всегда берите схему из официальной документации на ваш драйвер и вашу его версию.

Как проверить JSON на ошибки перед отправкой на кассу?

Используйте любой онлайн-валидатор JSON или встроенную проверку в редакторе кода — это отловит синтаксические ошибки. Соответствие схеме драйвера придётся сверять вручную по документации, либо тестовой отправкой в режиме эмуляции.

Касса молчит, хотя задание принято. Что делать?

Проверьте, открыта ли смена, есть ли чековая лента и не зависло ли задание в очереди драйвера. Запросите статус задания по его идентификатору — ответ обычно содержит код ошибки или подтверждение выполнения.

Можно ли отладить JSON без реальной кассы?

Часто да: многие драйверы имеют режим эмуляции или тестового устройства, в котором задание обрабатывается без фискализации. Наличие такого режима уточните в документации вашей версии драйвера.

Почему в чеке вместо русских букв печатаются непонятные символы?

Наиболее вероятная причина — неверная кодировка файла. Пересохраните JSON в UTF-8 без BOM. Если проблема сохраняется, проверьте настройки кодовой страницы в драйвере ККТ и шаблон чека.