Документация
- Оглавление
- Введение
- Сообщение (Message)
- Комментарии
- v1.8.x Идентификатор операции
- v1.8.x Ошибки
- Заголовки
- Работа с принтером
- Работа с СКО
- Переменные окружения
- Логирование
- Менеджер СКО
- Настройки
- Служба (windows)
- Описание принципов взаимодействия
- CLI
- 2.x Доп. возможности
- Транспортный уровень
- Проверки
- Правила округления
- Сервисы
- ik.service.app
- ik.service.printers
- ik.service.token
- Получение СКО
- Получение СКО по серийному номеру
- Получение наличных в СКО
- Получение номера следующего док-а
- Получение кол-ва неотправленных док-ов
- Получение последнего неотправленного док-а
- Состояние СКО
- Обновление статуса СКО
- Накопленный оборот
- Статус СКО
- Уст. наименование торг.точки
- Печать копии ранее фискализированного чека
- v1.8.x Получение номера первого и последнего док-та в смене
- v1.8.x Получение ранее фискализированного чека
- ik.service.token.authority
- ik.service.token.shift
- ik.service.token.deposit
- ik.service.token.withdraw
- ik.service.token.sales.retail
- ik.service.token.moneyback
- ik.service.token.rollback
- ik.service.orders
- Типы данных
- Errors
- Version
- FiscalResponse
- PrintXReportReq
- CloseShiftReq
- CloseShiftData
- Sum
- UID
- DateTime
- Currency
- TokenInformation
- TokenInformation2
- CashIn
- OldestDocument
- Pin
- ChangePin
- MinMaxReceipts
- Receipt
- ReceiptRequest
- Comments
- Comment
- EscPosReq
- ZReportCopyRequest
- Report
- TaxRate
- TokenChequeHeader
- CalculatedItem
- Item
- ItemCode
- ItemSection
- Payment
- PaymentType
- Quantity
- ChequeType
- ChequeHeader
- ItemCalculatedValues
- State
- Status
- UpdateStatus
- ShiftState
- Внесение/Изъятие/Выдача
- Продажа
- Возврат
- Аннулирование
- Changelog
Введение
Данный документ является Руководством Программиста, а так же Руководством Пользователя по использованию Программной Кассы.
В данной документации описан протокол, типы и ошибки, которые могут возникать при использовании протокола tsrv.
Данная документация будет дополняться в процессе доработок.
Сам по себе протокол взаимодействия предполагает схему "запрос-ответ", с сообщениями в JSON формате.
На текущий момент tsrv поддерживает взаимодействие по:
Message
Базовой сущностью протокола является Message
. Структура Message
представляет собой JSON следующего формата:
{
"type": MessageType,
"address": String,
"reply_address": String?,
"data": Any?,
"headers": Map<String, String>
}
MessageType
передается как строка и может иметь следующие значения:
send
- вызов методаping
- запрос на проверку связиpong
- ответ на запрос проверки связиerror
- сообщение сервера об ошибке
Поле type
служит для объявления типа передаваемого сообщения. Список
поддерживаемых сообщений со временем может расширяться.
Поле address
имеет два значения в рамках протокола:
- В случае клиентского сообщения, данное поле требуется для
идентификации сервиса (
dispatcher
), который будет обслуживать данное сообщение - В случае серверного сообщения, данное поле заполняется значением из
поля
reply_address
клиентского запроса, чтобы клиентская часть могла определить, на какое свое сообщение она получила ответ.
Поле reply_address
является опциональным и служит для передачи "адреса",
на котором будет ожидать ответа клиентская часть. Сервер, в свою очередь,
данное поле оставляет всегда в значении null
и после успешной/неуспешной
обработки клиентского сообщения помещает значение данного поля в address
серверного сообщения.
Поле data
содержит тело запроса. Тело запроса меняется в зависимости от
обслуживающего сервиса, а так же исполняемой функции.
Поле headers
содержит в себе дополнительную информацию, которая требуется
для выполнения операции. В частности, поле headers
, в случае
клиентского запроса, обязано содержать поле action
, в котором содержится
название выполняемого метода в рамках сервиса. В случае серверного сообщения
данное сообщение будет содержать значение null
.
Заголовок action
может иметь значение с использованием любой
политики наименования, например:
- getTokenBySerial
- get_token_by_serial
- GET_TOKEN_BY_SERIAL
- GetTokenBySerial
являются полностью поддерживаемыми и валидными значения вызова одного и того же метода.
Важно: для уменьшения передаваемых данных следует передавать minified
JSON (без переносов строк, пробелов между полями и т.п.), например:
{"type":"send","address":"ik.service.token","headers":{"action":"getTokenBySerial","token":"AVQ11031010703","refresh_tokens":"true"}}
Примеры
Валидный клиентский Message
:
{
"type": "send",
"address": "ik.service.token",
"headers": {
"action": "getTokenBySerial",
"token": "AVQ11031010703",
"refresh_tokens": "true"
}
}
Валидный успешный серверный Message
:
{
"type": "send",
"address": null,
"reply_address": null,
"data": {
"device_id": 131010703,
"operator_code": 5,
"organization": "ИП Моров А.М.",
"pin_code_length": 5,
"puk_code_length": 8,
"serial": "AVQ11031010703",
"tax_number": 191832203
},
"headers": null
}
Валидный неуспешный серверный Message
:
{
"type": "error",
"address": null,
"reply_address": null,
"data": {
"description": "dispatcher not found",
"name": "TSRV_DISPATCHER_NOT_FOUND"
},
"headers": null
}
Комментарии
Работа с комментариями
В следующих запросах могут быть переданы комментарии:
create_sale
create_withdraw
create_rollback
create_client_withdraw
create_money_back
Структура комментариев
В общей структуре data
можно передать comments
, состоящую из двух полей:
before
- комментарии, которые будут отображены перед заголовком чекаafter
- комментарии, которые будут отображены после UID'a
{
"data": {
"sale": { ... },
"comments": {
"before": [],
"after": []
}
}
}
Возможные типы комментариев:
QR
- QR кодTEXT
- текстBARCODE
- код, одного из типов:EAN13
,CODE128
,CODE39
Параметры:
transient
-true
/false
- отображать ли на электронном чекеalign
- выравнивание комментария:CENTER
,LEFT
,RIGHT
size
- размер QR кода (от 1 до 16)
QR
Параметры
content
- содержимое QR кода в base64
Пример комментария:
{
"type": "QR",
"content": "AA==",
"size": 3,
"align": "CENTER",
"transient": false
}
TEXT
Параметры
content
- текст комментарияdw
- двойная ширина (true
/false
)dh
- двойная высота (true
/false
)
Пример комментария
{
"type": "TEXT",
"content": "Hello, World!",
"dw": false,
"dh": false,
"align": "CENTER",
"transient": false
}
BARCODE
kind
- тип штрих-кода:EAN13
,CODE128
,CODE39
content
- содержимое штрих-кода в base64width
- ширина штрих-кодаheight
- высота штрих-кода
Пример комментария
{
"type": "BARCODE",
"kind": "CODE128",
"content": "MDc5OTQzOTExMjc2Ng==",
"width": 2,
"height": 100,
"align": "CENTER",
"transient": false
}
Пример запроса продажи с комментариями
{
"address": "ik.service.token.sales.retail",
"headers": {
"action": "create_sale",
"token": "AVQ11169990665",
"printer.dummy": "true",
"repr.esc_pos": true
},
"data": {
"sale": {
"header": {
"cashier": "Test",
"currency": "BYN"
},
"items": [
{
"code": {
"gtin": "978020137962"
},
"price": "7.00",
"quantity": "2.000",
"name": "Test Flat white",
"discount": "3.00",
"markup": "1.00",
"tax_rate": "tax20"
}
],
"payments": [
{
"payment_type": "cashless",
"value": "12.00",
"name": "Халва",
"ref": "123414141124"
}
],
"cheque_discount": "0.00",
"cheque_markup": "0.00",
"tp_tax_number": 123456789
},
"comments": {
"before": [
{
"type": "QR",
"content": "AA==",
"size": 3,
"align": "CENTER",
"transient": false
},
{
"type": "TEXT",
"content": "Это текст, в котором double_width и double_height и он справа",
"dw": true,
"dh": false,
"align": "RIGHT",
"transient": false
},
{
"type": "TEXT",
"content": "А это такой же текст, но он слева.",
"dw": true,
"dh": false,
"align": "LEFT",
"transient": false
},
{
"type": "BARCODE",
"kind": "EAN13",
"content": "MDc5OTQzOTExMjc2Ng==",
"width": 2,
"height": 100,
"align": "CENTER",
"transient": false
},
{
"type": "BARCODE",
"kind": "CODE128",
"content": "MDc5OTQzOTExMjc2Ng==",
"width": 2,
"height": 100,
"align": "LEFT",
"transient": false
},
{
"type": "BARCODE",
"kind": "CODE39",
"content": "MDc5OTQzOTExMjc2Ng==",
"width": 2,
"height": 100,
"align": "RIGHT",
"transient": false
}
],
"after": [
{
"type": "TEXT",
"content": "А это текст, который после UID'a",
"dw": true,
"dh": false,
"align": "RIGHT",
"transient": false
}
]
}
},
"type": "send"
}
Данный раздел устарел на момент 2.x версии
ПК старается не хранить чеки на ФС, так же как не задерживать их внутри памяти СКО.
Требуется хранить информацию на уровень интеграции, если в этом есть необходимость. Вся остальная информация может быть получена из ЛК СХ.
Идентификатор операции
В запросах:
Дополнительно может быть передано поле id
- идентификатор операции.
Оно используется для поиска копии чека.
Пример:
- Создаём запрос на продажу, с полем
id
=cc20dd90-85d4-4c2a-b55f-a637a82a5bd3
{
"address": "ik.service.token.sales.retail",
"headers": {
"action": "create_sale",
"token": "AVQ11169990665",
"printer.dummy": "",
"repr.esc_pos": true
},
"data": {
"sale": {
"header": {
"cashier": "Test",
"currency": "BYN"
},
"items": [
{
"code": {
"gtin": "978020137962"
},
"price": "7.00",
"quantity": "2.000",
"name": "Это мой первый товар и под ним есть values",
"discount": "3.00",
"markup": "1.00",
"tax_rate": "tax20"
},
{
"code": {
"gtin": "978020137962"
},
"price": "7.00",
"quantity": "2.000",
"name": "А вот второй.. Но тут тоже есть values",
"discount": "3.00",
"markup": "1.00",
"tax_rate": "tax20"
}
],
"payments": [
{
"payment_type": "cashless",
"value": "24.00",
"name": "Халва",
"ref": "123414141124"
}
],
"cheque_discount": "0.00",
"cheque_markup": "0.00",
"tp_tax_number": 123456789,
"id": "cc20dd90-85d4-4c2a-b55f-a637a82a5bd3"
}
},
"type": "send"
}
- Получаем копию чека по
id
=cc20dd90-85d4-4c2a-b55f-a637a82a5bd3
{
"address": "ik.service.token",
"headers": {
"action": "get_receipt",
"token": "AVQ11169990665"
},
"data": {
"number": 0,
"id": "cc20dd90-85d4-4c2a-b55f-a637a82a5bd3"
},
"type": "send"
}
- Важно! Поле
id
должно быть уникальным для каждой операции. - Важно! Поле
number
должно присутствовать, но оно будет игнорироваться. - Важно! В случает если
id
не уникально, то будет возвращена ошибкаTIN_ID_ALREADY_EXISTS
Ошибки (v2.x)
В случае возникновения ошибки, сервер отправит сообщения с типом error
и полем data
следующего вида:
{
"description": String,
"name": String
}
В случае возникновения ошибок на методах, отвечающих за фискализацию, ошибки, которые возникли ПОСЛЕ фискализации,
помещаются в отдельное поле errors
. Например, в случае возникновения ошибок с принтером, ответ будет следующего вида:
{
"type": "send",
"data": {
"header": {
"uid": "5B69B8EF9BE3E43E09894303",
"number": 354,
"date_time": "2025-03-01T15:01:36.933186+03:00",
"shift_number": 78
},
"errors": {
"printing": {
"name": "rendering.io.error",
"description": "Ошибка печати: Debug error"
},
"storage": null
}
}
}
Если в процессе возникли проблемы при работе с хранилищем данных (ФС), будет помещена так же в storage
.
Стоит обратить внимание, что в случае отсутствия ошибок после фискализации поле errors
не передается, либо может иметь значение null
.
Ошибки (v1.8.x)
В случае возникновения ошибки, сервер отправит сообщение типом error
и
полем data
следующего вида:
{
"description": String,
"name": String,
"op_data": Any?
}
Для идентификации ошибки на клиентской стороне требуется ориентироваться на
поле name
, т.к. оно является гарантированно уникальным в рамках протокола.
Стоит так же отметить, что список данных ошибок может дополняться и требуется предусмотреть обработку неизвестных ошибок, а так же часть ошибок могут быть никогда не переданы на клиентскую часть и обработаны в рамках логики работы сервиса.
Так же, текстовое описание ошибок description
может меняться/дополняться в рамках
работы сервиса и, как следствие, полагаться на него как на уникальное значение
запрещается.
Перечень ошибок, возможных в рамках протокола ошибок:
[errors]
AVQFR_INVALID_COMMAND = 'подана команда с неизвестным кодом или нарушен порядок подачи команд'
AVQFR_UNSUPPORTED_VERSION = 'версия протокола взаимодействия с устройством не поддерживается'
AVQFR_ACCESS_DENIED = 'неверно указана роль при авторизации (отличная от PIN, PUK или REG)'
AVQFR_BAD_SERIAL_NUMBER = 'неверно задан серийный номер устиойства'
AVQFR_BAD_DEVICE_MODE = 'команда не может быть выполнена в текущем режиме устройства'
AVQFR_INTERNAL_ERROR = 'внутренняя ошибка (возможная причина - аппаратный сбой)'
AVQFR_TIMEOUT = 'превышено время ожидания ответа при синхронизации времени'
AVQFR_BAD_FW_UPGRADE_KEY = 'отсутствует ключ обновления прошивки или его целостность нарушена'
AVQFR_NOT_MOUNTED = 'файловая система на смонтирована (внутренняя ошибка, устройство неисправно)'
AVQFR_NOT_FORMATTED = 'носитель на отформатирован (внутренняя ошибка, устройство неисправно)'
AVQFR_INSUFFICIENT_SPACE = 'недостаточно места для записи данных'
AVQFR_FILE_IS_TOO_BIG = 'превышен размер файла (внутренняя ошибка, устройство неисправно)'
AVQFR_FILE_NOT_EXIST = 'файл не найден, необходимые данные отсутствуют'
AVQFR_FILE_ALREADY_EXISTS = 'файл уже имеется (внутренняя ошибка, устройство неисправно)'
AVQFR_INVALID_OFFSET = 'неверное смещение (внутренняя ошибка, устройство неисправно)'
AVQFR_PROGRAM_ERROR = 'ошибка записи во флеш-память (внутренняя ошибка, устройство неисправно)'
AVQFR_BAD_ADDRESS = 'неверно задан адрес блока памяти (внутренняя ошибка, устройство неисправно)'
AVQFR_ERASE_ERROR = 'ошибка стирания флеш-памяти (внутренняя ошибка, устройство неисправно)'
AVQFR_NO_CIPHER_CALLBACKS = 'функции шифрования файловой системы недоступны (внутренняя ошибка, устройство неисправно)'
AVQFR_MAC_NOT_FOUND = 'у файла отсутствует имитовставка (внутренняя ошибка, устройство неисправно)'
AVQFR_NOT_ACTUAL_KEY = 'срок действия ключа не наступил или истек'
AVQFR_BAD_SIGN = 'подпись не верна'
AVQFR_INCORRECT_PARAM_SIZE = 'неверный размер параметра (один из параметров команды имеет неверную длину)'
AVQFR_BAD_SYNC_REQUEST_ID = 'неверный идентификатор запроса синхронизации времени'
AVQFR_BAD_FILE_INDEX = 'недопустимое имя файла (внутренняя ошибка, устройство неисправно)'
AVQFR_NO_DATA = 'запрашиваемые данные отсутствуют (попытка получить внутренний или отсутствующий документ)'
AVQFR_INTEGRITY_ERROR = 'нарушение целостности данных, хранящихся в устройстве (устройство неисправно)'
AVQFR_PRNG_NOT_INITIALIZED = 'генератор СЧП не инициализирован, инициализация устройства не завершена'
AVQFR_BAD_SIGN_CTR = 'неверное значение счетчика подписей'
AVQFR_BAD_STATUS_CODE = 'неверное значение кода завершения обработки запроса сервером'
AVQFR_INVALID_MODE = 'неверно задан режим алгоритма (внутренняя ошибка, устройство неисправно)'
AVQFR_INCORRECT_PARAM = 'один из переданных параметров имеет недопустимое значение'
AVQFR_SELF_TEST_FAILURE = 'ошибка самотестирования (устройство неисправно)'
AVQFR_SHIFT_IDLE_TIMEOUT = 'превышено время бездействия, требуется синхронизация времени'
AVQFR_BAD_KEY_AUTH_DATA = 'неверные данные для авторизации сессии (неверное значение PIN, PUK или REG)'
AVQFR_INVALID_ATTR_ID = 'неверный идентификатор атрибута устройства (атрибут, не поддерживается устройством)'
AVQFR_BAD_KEY_TOKEN = 'токен ключа сформирован некорректно'
AVQFR_FILE_BACKUP_ERROR = 'ошибка дублирования файла (внутренняя ошибка, устройство неисправно)'
AVQFR_BAD_KEY_ID = 'идентификатор ключа отсутствует или имеет неверный размер'
AVQFR_BAD_KEY = 'ключ отсутствует, имеет неверный размер или неверный формат набора ключей'
AVQFR_ASN1_PARSE_ERROR = 'невозможно разобрать ASN1-структуру (нарушена структура сертификата или ответа сервера)'
AVQFR_INCORRECT_DATA_SIZE = 'неверный общий размер данных команды (передана команда неподдерживаемой длины)'
AVQFR_SESSIONS_LIMIT_EXCEEDED = 'слишком много одновременно открытых сессий'
AVQFR_INVALID_SESSION_ID = 'неверный идентификатор сессии'
AVQFR_SHIFT_IS_PENDING = 'необходимо закрыть смену'
AVQFR_RECEIPT_IS_PENDING = 'в устройстве присутствуют кассовые документы, которые необходимо передать на сервер'
AVQFR_RECEIPT_SUM_OVERFLOW = 'переполнение счетчиков, необходимо закрыть смену'
AVQFR_RECEIPT_NEGATIVE_VALUE = 'задано отрицательное значение суммы'
AVQFR_NEGATIVE_SHIFT_BALANCE = 'получен отрицательный сменный баланс'
AVQFR_SESSION_ALREADY_AUTHORIZED = 'сессия уже авторизована (попытка повторной авторизации уже авторизованной сессии)'
AVQFR_SESSION_NOT_AUTHORIZED = 'сессия не авторизована (команда требует обязательной авторизации)'
AVQFR_SESSION_EXISTS = 'имеется открытая сессия (выполнение команды возможно только в монопольном режиме)'
AVQFR_SHIFT_IS_OPENED = 'смена открыта (команда возможна только при закрытой смене)'
AVQFR_SHIFT_IS_CLOSED = 'смена закрыта (команда возможна только при открытой смене)'
AVQFR_BAD_DATE_TIME = 'неверный формат или значение даты или времени (операция выполняется "задним" числом)'
AVQFR_BAD_CASH_REG_NUMBER = 'неверный номер кассового аппарата (номер КСА в СККО)'
AVQFR_BAD_CURRENCY_NAME = 'неверное наименование кода валюты'
AVQFR_BAD_RECEIPT_TYPE = 'неверный тип кассового документа'
AVQFR_BAD_RECEIPT_NUMBER = 'номер кассового документа отличается от значения внутренего счетчика кассовых документов'
AVQFR_BAD_RECEIPT_COST = 'рассогласование по полю "Итого общая стоимость"'
AVQFR_BAD_RECEIPT_DISCOUNT = 'рассогласование по полю "Сумма скидки (надбавки)"'
AVQFR_BAD_RECEIPT_TOTAL = 'рассогласование по полю "Итого к оплате"'
AVQFR_BAD_RECEIPT_CENTS = 'неправильное значение дробной части денежного поля'
AVQFR_BAD_TAXPAYER_NUMBER = 'задан неверный УНП'
AVQFR_BAD_CORRECTION_VALUE = 'задана ненулевая сумма коррекции при отсутствии коррекций'
AVQFR_TOTAL_TRADE_OVERFLOW = 'переполнение счетчика суммарного торгового оборота'
AVQFR_BAD_DOCUMENT_FORMAT = "bad document format"
AVQFR_CH_WITHDRAW_MAX_SUM = 'Сумма выдачи наличных держателю превышает максимально допустимую'
AVQFR_CH_WITHDRAW_ONLY_BYN = 'Выдача наличных держателю возможна только в белорусских рублях'
AVQFR_MAX_DOC_COUNT_OVERFLOW = 'Превышено максимальное количество документов в смене'
AVQFR_TOO_MANY_ITEMS = 'Превышено максимальное количество позиций в документе или размер документа слишком большой'
AVQFR_UNKNOWN = 'неизвестная ошибка'
TR_EMPTY_INPUT = 'неверные входные данные (данные отсутствуют)'
TR_INVALID_TYPE = 'неверный тип данных'
TR_INSUFFICIENT_BYTES = 'недостаточно данных для считывания информации'
USB_IO = "Input/Output Error"
USB_INVALID_PARAM = "Invalid parameter"
USB_ACCESS = "Access denied (insufficient permissions)"
USB_NO_DEVICE = "No such device (it may have been disconnected)"
USB_NOT_FOUND = "Entity not found"
USB_BUSY = "Resource busy"
USB_TIMEOUT = "Operation timed out"
USB_OVERFLOW = "Overflow"
USB_PIPE = "Pipe error"
USB_INTERRUPTED = "System call interrupted (perhaps due to signal)"
USB_NO_MEM = "Insufficient memory"
USB_NOT_SUPPORTED = "Operation not supported or unimplemented on this platform"
USB_BAD_DESCRIPTOR = "Malformed descriptor"
USB_OTHER = "Other error"
CRT_MISSING_DEVICE_ID = "missing device id"
CRT_MISSING_OWNER_TAX_NUMBER = "missing owner tax number"
CRT_MISSING_OPERATOR_CODE = "missing operator code"
CRT_MISSING_SERIAL_NUMBER = "missing serial number"
CRT_MISSING_OWNER_NAME = "missing owner name in certificate"
CRT_MISSING_LEGAL_ADDR = "missing legal address in certificate"
CRT_MISSING_CERT_SERIAL = "missing cert serial"
CRT_INVALID = "invalid certificate"
AVTPCR_ATTR_NOT_FOUND = 'missing required attribute'
TIN_CODE_LEN = "invalid code length"
TIN_EMPTY_NAME = "empty name"
TIN_NAME_LEN = "invalid name length"
TIN_INVALID_GTIN = "invalid gtin/ean"
TIN_ZERO_SUM = "invalid sum: can't be 0"
TIN_NEGATIVE_SUM = "invalid sum: can't be negative"
TIN_SUM_OVERFLOW = "sum overflow"
TIN_QUANTITY_OVERFLOW = "quantity overflow"
TIN_ZERO_QUANTITY = "invalid quantity: 0"
TIN_EMPTY_CASHIER = "empty cashier name"
TIN_NO_ITEMS = "invalid items array: no items"
TIN_MAX_ITEMS = "too many items"
TIN_NOT_ENOUGH_MONEY = "not enough payed"
TIN_CASHLESS_OVERFLOW = "too much cashless payment"
TIN_CASH_OVERFLOW = "too much cash"
TIN_NEGATIVE_CHANGE = "invalid change: can't be negative"
TIN_CASHIER_LEN = "invalid cashier length"
TIN_NOT_ENOUGH_CASH_IN = "not enough money in cash box"
TIN_ONLY_SALE_ROLLBACK = "rollback can only be applied to sale"
TIN_WRONG_ROLLBACK_DOC_NUM = "trying to rollback wrong doc num"
TIN_ID_ALREADY_EXISTS = "cheque with given id already exists"
TIN_MARKING_QUANTITY_1 = "marking quantity should be 1"
TIN_MULTIPLE_CASH_PAYMENTS = "multiple cash payments"
TIN_TOO_MANY_MARKING_CODES = "too many marking codes"
TIN_MULTIPLE_MARKING_CODES = "multiple marking codes"
TIN_MARKING_CODE_LEN = "marking code len is exhausted"
TIN_MARKING_CODE_WITHOUT_GTIN = "marking code without gtin"
TIN_TOO_MANY_DISCOUNTS = "too many discounts"
TIN_TOO_MANY_MARKUPS = "too many markups"
TIN_EMPTY_ITEMS = "empty items"
TIN_MISSING_LAST_SALE = "Отсутствует последний документ продажи"
TSRV_APP_WAS_NOT_CONFIGURED = "application was not configured properly"
TSRV_EMPTY_ADDRESS = "no address provided"
TSRV_DISPATCHER_NOT_FOUND = "dispatcher not found"
TSRV_DESERIALIZE_ERROR = "failed to deserialize value"
TSRV_EMPTY_MSG_DATA = "data field is required but was not provided"
TSRV_ACTION_NOT_FOUND = "'action' was not found"
TSRV_INVALID_HEADER = "invalid header value"
TSRV_TOKEN_NOT_FOUND = "token was not found"
TSRV_INVALID_SUM_DEC_PART = "invalid sum decimal part. should always have 2 digits after dot"
TSRV_INVALID_QUANTITY_DEC_PART = "invalid quantity decimal part. should always have 3 digits after dot"
TSRV_NEGATIVE_CHEQUE_DISCOUNT = "cheque discount can't be negative"
TSRV_TOKEN_NOT_ACTIVE = "СКО не активно"
TSRV_ITEM_NOT_FOUND = "item was not found in storage"
PR_IO_ERROR = "printer I/O error"
PR_NOT_FOUND = "printer was not found"
PR_USB_ERROR = "usb printer error"
TORD_FAILED_TO_REMOVE = "failed to remove prev order"
TORD_FAILED_TO_DESER = "failed to deserialize prev order (file may be corrupted)"
TORD_READ_FAILED = "failed to read order"
TORD_WRITE_FAILED = "failed to write order"
TORD_NOT_FOUND = "order was not found"
Что делать если была возвращена ошибка...
-
AVQFR_NOT_ACTUAL_KEY
- требуется проверить срок действия СКО и обратиться в тех. поддержку -
AVQFR_BAD_KEY_AUTH_DATA
- PIN/PUK код имеются неверные значения - проверить их правильность в соответствии с паспортом СКО -
AVQFR_SHIFT_IDLE_TIMEOUT
- требуется проверить подключение к интернету и попытаться открыть смену. При открытии смены осуществляется попытка синхронизации времени -
AVQFR_INSUFFICIENT_SPACE
- слишком много неотправленных документов - подключиться к интернету, проверить, что пройдена авторизация по PIN коду. Максимальное кол-во документов - около 4000 -
AVQFR_SESSIONS_LIMIT_EXCEEDED
- Программная касса завершала свою работу некорректно какое-то кол-во раз. Требуется обратиться в тех. поддержку предоставив лог-файл и для продолжения работы - достать и вернуть СКО в устройство с запущенной программной кассой -
AVQFR_SHIFT_IS_PENDING
- требуется закрытие смены. -
AVQFR_RECEIPT_IS_PENDING
- требуется проверка наличия интернета на устройстве и убедиться, что пройдена авторизация по PIN коду, а так же дождаться, пока документы будут отправлены на сервер. Кол-во неотправленных документов можно получить с помощью метода get_stored_documents -
AVQFR_RECEIPT_SUM_OVERFLOW
- прибыль вашей компании за смену достигла невероятных объемов. Требуется закрыть смену и сообщить в тех. поддержку о данной ошибке -
AVQFR_NEGATIVE_SHIFT_BALANCE
- попытка уменьшения кол-ва наличных в кассе в отрицательную сторону - например операцией возврата или изьятия. это является ошибкой клиентского ПО и должно быть устранено на этапе интеграции. Так же данная ошибка может возникать при попытке закрытия смены, что говорит о том, что имеются наличные в кассе, которые подлежат изъятию перед закрытием смены -
AVQFR_SESSION_ALREADY_AUTHORIZED
- уже пройдена авторизация в СКО -
AVQFR_SESSION_NOT_AUTHORIZED
- требуется прохождение авторизации в СКО -
AVQFR_SHIFT_IS_OPENED
- требуется закрыть смену -
AVQFR_SHIFT_IS_CLOSED
- требуется открыть смену -
AVQFR_BAD_DATE_TIME
- требуется проверить время на устройстве -
TIN_CODE_LEN
- требуется проверить длину кода. Длина кода не должна превышать 13 знаков. -
TIN_EMPTY_NAME
- имя является обязательным полем, требуется проверить, что оно заполнено -
TIN_NAME_LEN
- неверная длина имени тов. позиции. Не должна превышать 128 символов -
TIN_INVALID_GTIN
- не пройдена валидация кода GTIN (проверочный знак неверный) -
TIN_ZERO_SUM
- значение цены/суммы не может быть равно 0 в одном из полей -
TIN_NEGATIVE_SUM
- значение цены/суммы не может быть отрицательным -
TIN_SUM_OVERFLOW
- слишком большое/маленькое значение цены/суммы. Об ограничениях написано в описании типа Sum -
TIN_QUANTITY_OVERFLOW
- слишком большое значение кол-во. Об ограничениях написано в описании типа Quantity -
TIN_ZERO_QUANTITY
- кол-во не может быть равно 0. -
TIN_EMPTY_CASHIER
- имя кассира не может быть пустым. Это обязательное поле -
TIN_NO_ITEMS
- попытка совершения продажи без товарных позиций -
TIN_MAX_ITEMS
- слишком много товарных позиций в чеке -
TIN_NOT_ENOUGH_MONEY
- недостаточная сумма при попытке оплаты чека -
TIN_CASHLESS_OVERFLOW
- слишком много безналичных средств. Ошибка возникает если значение способов безналичной оплаты и других способов оплаты превышает сумму. С данных способов оплаты невозможно выдать сдачу -
TIN_CASH_OVERFLOW
- слишком много наличных средств. Возникает если сумма безналичных и других способов оплаты полностью покрываем сумму по чеку, а наличные не равны 0 -
TIN_NEGATIVE_CHANGE
- Отрицательная сдача. -
TIN_CASHIER_LEN
- неверная длина кассира. Превышает 20 символов -
TIN_NOT_ENOUGH_CASH_IN
- недостаточно наличных в кассе для совершения операции. Например, для выдачи сдачи -
TSRV_APP_WAS_NOT_CONFIGURED
- ошибка инициализации ПО. Требуется обратиться в тех. поддержку -
TSRV_EMPTY_ADDRESS
- не указано значение поляaddress
в запросе, либо пустое значение -
TSRV_DISPATCHER_NOT_FOUND
- неверное значениеaddress
в запросе -
TSRV_DESERIALIZE_ERROR
- ошибка обработки входных данных. Требуется проверка правильности формата и указание обязательных полей -
TSRV_EMPTY_MSG_DATA
- требуемое тело запроса (полеdata
) отсутствует -
TSRV_ACTION_NOT_FOUND
- неверное значение заголовкаaction
, либоaddress
указан неверно -
TSRV_INVALID_HEADER
- неверное значение одного из заголовков -
TSRV_TOKEN_NOT_FOUND
- СКО не найдено -
TSRV_INVALID_SUM_DEC_PART
- неверное значение суммы (передано не в форматеX.XX
) -
TSRV_INVALID_QUANTITY_DEC_PART
- неверное значение кол-ва (передано не в форматеX.XXX
) -
TSRV_NEGATIVE_CHEQUE_DISCOUNT
- отрицательная скидка по чеку (надбавка на чек недоступна) -
TSRV_TOKEN_NOT_ACTIVE
- СКО заблокировано -
TSRV_ITEM_NOT_FOUND
- товар отсутствует в БД товаров -
PR_IO_ERROR
- ошибка чтения/записи принтера -
PR_NOT_FOUND
- принтер с указанными данными не найден -
PR_USB_ERROR
- ошибки при работе с принтером поUSB
-
TORD_FAILED_TO_REMOVE
- ошибка удаления предыдущего заказа -
TORD_FAILED_TO_DESER
- файл заказа поврежден либо не может быть обработан. Требуется пересоздать заказ предварительно удалив -
TORD_READ_FAILED
- ошибка чтения заказа из ФС. Требуется обратиться в тех. поддержку -
TORD_WRITE_FAILED
- ошибка записи заказа в ФС. Требуется обратиться в тех. поддержку -
TORD_NOT_FOUND
- заказ с данным идентификатором не найден. Требуется создание заказа
Список поддерживаемых заголовков
СКО
token
- серийный номер СКОtokens.refresh
- обновление списка СКО*token.trade_point.information
- установить в запросе доп. информацию о торговой точке
Работа с принтерами и отрисовкой чеков
printer.[usb|dummy]
- заголовки и подзаголовки для работы с принтерамиprinter.spl
-spl - symbols per line
. Указание кол-ва символов в ширину на бумаге, на которой будет происходить печать. По умолчанию:48
printer.cp866
- указание номера таблицы символов в принтере соответствующий кодировкеCP866
. По умолчанию -17
printer.cp1251
- указание номера таблицы символов в принтере соответствующий кодировкеCP1251
. По умолчанию -18
printer.feed
- указание кол-во строк прокрутки бумаги после печати. По умолчанию:5
printer.cut
- принудительное отрезание бумаги после завершения печати. По умолчанию:true
printer.prefix
- данные для печати перед печатью основного чека. Может быть использовано для печати лого или изменении шрифта для последующей печати*printer.style
- вид печати чека. по умолчанию -default
, печатает полный чек. При указании значенияqr
будет напечатан чек с QR кодом, в котором содержится ссылка на эл. чек* DEPRECATEDprinter.escpos.required
- требуется ли передача escpos представления чека в ответе. В случае, если значениеtrue
, escpos команды в base64 формате будут помещены в поле extra ответов.
Представление чеков
repr.esc_pos
- отдавать в объекте фискального документа дополнительный объектrepr
с полемesc_pos
, в котором находитсяesc_pos
(base64) представление чекаrepr.text
- отдавать в объекте фискального документа дополнительный объект repr с полем text, в котором находится текстовое представление чекаrepr.link
- отдавать в объекте фискального документа дополнительный объектrepr
с полемlink
, в котором находится ссылка на эл. чек
Важно!
Печатать чеки для клиентов, отданные в repr.text
, repr.link
категорически запрещается, из-за отсутствия в них QR кода с УИ!
Работа с принтером
Для использования принтера требуется передать наборы заголовков, в зависимости от желаемого способа использования принтера.
Общее
Печать осуществляется путем построчного формирования для последующей печати, добавлением стилей, преобразованием в набор EscPos команд и отправкой на принтер данных.
Т.к. позиционирование построчное и основано на максимальном кол-ве символов
в строке, имеется возможность передать кол-во символов для правильного
формирования чека под конкретные размеры путем передачи заголовка printer.spl
.
Значение по умолчанию для данного заголовка - 48
Процесс вывода на печать выглядит следующим образом:
- Осуществляется подключение к печатающему устройству
- Совершается запрашиваемая операция
- Осуществляется вывод на печать сформированных данных
В случае возникновения ошибки на последнем этапе (вывод на печать),
возвращается ошибка со всеми данными по совершенной операцией в
поле op_data
структуры.
Все данные передаются в кодировке CP866 и для корректного отображения данных
на бумажном чеке, требуется, чтобы в принтере кодировкой по умолчанию
была установлена кодировка CP866
, либо требуется передача заголовка printer.cp866
Принтер выбирается на основе printer.*
заголовков в следующей приоритетности:
USB
Dummy
Если заголовки первого принтера не были найдены - будет попытка найти следующий принтер.
Dummy
принтер всегда имеет низший приоритет.
USB-принтер
Для работы с USB принтером требуется передача двух заголовков:
printer.usb.vendor
- строковое представлениеvendorId
устройстваprinter.usb.product
- строковое представлениеproductId
устройства
Перед любой операцией печати с использованием USB принтера,
программная касса "забирает" контроль над USB устройством. В случае,
если программной кассе не удалось этого сделать, будет возвращена ошибка
с префиксом USB_
В случае, если требуется вывести какую-то информацию на принтер до или после печати - USB устройство доступно для подключения соответственно ДО выполняемой операции и после ее завершения
Очередь печати Windows
Данный способ работает только на ОС Windows с принтерами, которые поддерживают печать через очередь печати.
Для отправки чека в очередь печати требуется передача заголовка printer.spool.name
с указанием
наименования принтера/очереди печати.
Dummy-принтер
Данный тип принтера не выводит ничего на печать. Для задействования требуется передача заголовка
printer.dummy
с любым значением
Delayed принтер
Данный тип принтера не выводит ничего на печать на принтер, а вместо этого помечает документ для отложенной печати.
Для использования этого типа принтера требуется передать заголовок printer.delayed
с тем же идентификатором, что будет передан в printer.delayed.id
При использовании данного способа требуется передача дополнительного заголовка: printer.delayed.id
c идентификатором для последующей печати. В качестве идентификатора можно использовать номер следующего документа в смене.
Печать отложенного чека может быть совершена с помощью метода print_delayed
Работа с СКО (v2.0.1+)
Для работы с СКО не требуется дополнительных настроек.
В случае компрометации устройства, либо по решению РУП ИИЦ МНС или Оператора Программной Кассы СКО может быть заблокировано для совершения всех фискальных операций.
При попытке совершения фискальных в случаях, приведенных в абзаце выше,
будет возникать ошибка avtpcr.status.blocked
.
В случае, если статус СКО устарел (Отсутствовала синхронизация с сервером более 7 дней),
будет возвращаться ошибка avtpcr.status.sync-required
.
Для синхронизации с сервером требуется вызвать Обновление статуса. При первом запуске ПО и нахождении СКО требуется обязательное подключение к интернету, для получения данных об СКО и его конфигурации.
В случае, если конфигурация не удалась или не завершилась (отсутствие интернета или другие причины),
при попытке совершения фискальных операций будет возвращена ошибка avtpcr.not-configured
.
Автоматическая попытка конфигурации СКО осуществляется раз в 2 секунды.
При последующих запусках, если данные не устарели и присутствуют, конфигурация может осуществляться без наличия интернета
Определить состояние работы с СКО можно путем запроса Данных об СКО.
Поля is_configured
и is_compatible
должны быть установлены в значение true
, а status.block_reasons
должен быть пустым
Работа с СКО (v1.8.x)
Для корректного запуска приложения и работы с СКО, требуется объявление
переменной окружения OPERATOR_CODE
с указанием кода оператора. На основании
кода оператора будут доступны устройства с соответствующим кодом оператора.
Доступные коды оператора:
5
-dev
окружение iKassa910000001
-stage
окружение iKassa, используемое Республиканским Унитарным Предприятием "Информационно-Издательский Центр Министерства по Налогам и Сборам" (РУП ИИЦ МНС)1
-prod
окружение iKassa, используемое на реальных торговых точках
В случае компрометации устройства, либо по решению РУП ИИЦ МНС или Оператора
Программной Кассы СКО может быть заблокировано для совершения всех фискальных
операций, кроме операции изъятия и
закрытия смены. Все операции, в случае
блокировки, будут отдавать ошибку TSRV_TOKEN_NOT_ACTIVE
Запросить текущий статус СКО можно с помощью метода get_status
Важно: статус СКО по умолчанию - unknown
и, если нет подключения к интернету,
либо сервера iKassa недоступны, из текущей сети, использование СКО невозможно
и требуется подключение к интернету.
Важно: на старте приложения осуществляется поиск доступного СКО.
Обновление списка СКО
Важно помнить, что список доступных СКО обновляется в ручном режиме,
путем передачи заголовка tokens.refresh
со значением "true"
.
Обновление списка так же может вести к потенциальным блокировкам и замедлению работы, т.к. происходит поиск СКО с последующей проверкой регистрационных данных СКО, которое точно так же блокирует возможность мгновенно совершить действие с СКО.
Исходя из изложенного выше, стоит передавать tokens.refresh
исключительно
в том случае, если СКО не было найдено, либо по какой-то причине команда
отдала ошибку TSRV_TOKEN_NOT_FOUND
Переменные окружения
1.8.x
TSRV_ADDR
- адрес, который будет слушаться HTTP сервером. По умолчанию -0.0.0.0:1828
TSRV_REST_MODE
- переменная окружения для переключения режима работы Программной Кассы в режимобслуживания за столиками
. Должно иметь значениеtrue
илиfalse
. Значение по умолчаниюfalse
OPERATOR_CODE
- код оператора. Описано в разделе Работа с СКО
2.0.x
TSRV_ADDR
- адрес, который будет слушаться HTTP сервером. По умолчанию -127.0.0.0:1828
Логирование (v2.0.x)
Пример файла логгирования с ротацией по дням:
refresh_rate: 15 seconds
appenders:
stdout:
kind: console
stdout_rolling:
kind: rolling_file
path: ./logs/log.log
append: true
encoder:
pattern: "{d(%d.%m.%Y %H:%M:%S)} {({l}):5.5} {m}{n}"
policy:
trigger:
kind: time
interval: 1 day
modulate: true
roller:
kind: fixed_window
pattern: "./logs/log_{}.log"
count: 100
base: 1
root:
level: info
appenders:
- stdout
- stdout_rolling
Настройки:
- Путь по умолчанию:
./configs/log.yaml
- Путь к файлу может быть настроен с помощью аргументов при запуске ПО
- Например:
tsrv --logs-config C:/tsrv/log-config.yaml
- Например:
Логирование (v1.8.x)
По умолчанию установлен INFO
уровень логирования всех модулей в stdout
(консоль).
При необходимости логирование может быть настроено путем создания файла конфигурации логирования, примерно следующего содержания:
refresh_rate: 15 seconds
appenders:
stdout:
kind: console
receipts: # (1) Дополнительное правило логирования
kind: console # В консоль (stdout)
encoder:
pattern: "{m}{n}" # Шаблон. {m} - сообщение, {n} - перенос
root:
level: info # Уровень логирования для всех модулей
appenders:
- stdout
loggers:
tsrv_renderer::esc_pos: # Данный модуль отвечает за преобразование в EscPos команды
level: trace # Уровень логирования
appenders:
- receipts # (1)
additive: false
actix_server::worker:
level: warn
appenders:
- stdout
Путь конфигурационного файла зависит от ОС:
ОС | Путь | Пример |
---|---|---|
Linux | $XDG_CONFIG_HOME или $HOME/.config | /home/alice/.config/.tsrv/log.yaml |
Windows | %AppData% | C:\Users\Alice\AppData\Roaming\.tsrv\log.yaml |
Конфигурация Менеджера СКО (v2.0.0+)
См Настройки
Конфигурация Менеджера СКО (v1.8.x)
Менеджер СКО отслеживает новые подключения СКО и может совершать над ними какие-либо операции, например - автоматическая авторизация
Пример конфигурационного файла:
tokens:
AVQ11071080687:
auto_login: true
pin_code: 20740
В разделе tokens
описываются СКО и конфигурации к ним.
auto_login
- требуется ли автоматический вход (по умолчанию -false
)pin_code
- PIN-код СКО. Если значение отсутствует - вход не будет выполнен.- В случае неверного pin-кода в лог будет выведена ошибка и потребуется совершать вход согласно протокола
Путь конфигурационного файла зависит от ОС:
ОС | Путь | Пример |
---|---|---|
Linux | $XDG_CONFIG_HOME или $HOME/.config | /home/alice/.config/.tsrv/token_manager_conf.yaml |
Windows | %AppData% | C:\Users\Alice\AppData\Roaming\.tsrv\token_manager_conf.yaml |
Настройки (2.0.x)
Настройки:
trade_point
information
- доп. информация о торговой точке для печати
tokens
- настройки работы с СКО{СЕРИЙНЫЙ_НОМЕР_СКО}
- указывается серийный номер СКОauto_login
-true | false
- флаг, для автоматической авторизации в СКО. Попытка авторизации совершается 1 раз, как только найдено СКОpin_code
- значение пин кода для авторизации. Требуется при указанииauto_login
headers
defaults
- перечисление заголовком по умолчанию
server
addr
- указание адреса и порта, который будет слушать ПО
renderer
replacements
{кодировка}
- указывается кодировка, либоcp866
, либоcp1251
- Список символов для замены
char
- одиночный символ для заменыwith
- символ, на который заменять
- Список символов для замены
comments
- комментарии, которые будут печататься на всех док-тах продажиbefore
- До чека- Список объектов
after
- После чека- Список объектов
Пример файла настроек:
trade_point:
information: |
Время работы магазина зависит только от вас:
Пн-Пт: 10:00-20:00
Сб-Вс: 10:00-18:00
tokens:
AVQ11159990531:
auto_login: true
pin_code: 123456
headers:
defaults:
repr.link: true
printer.dummy: ''
repr.text: true
server:
addr: 0.0.0.0:8080
renderer:
replacements:
# Кодировка
cp866:
# char - символ, который заменять
# with - на что заменять
- char: '«'
with: '"'
- char: '»'
with: '"'
comments:
before:
- kind: text
dw: true
content: |
Добро пожаловать и спасибо, что выбрали магазин "У Лукоморья"!
С рождеством и новым годом!
after:
- kind: qr
content: 'https://www.google.com/'
size: 5
- kind: text
text: |
Скидка на бесплатный кофе!
- kind: barcode
content: '1234567890'
width: 5
height: 5
format: code128
Настройки (1.8.x)
Пример файла настроек:
headers:
defaults:
repr.esc_pos: true
repr.text: true
repr.link: true
token: AVQ11031010705
printer.dummy: ''
Путь конфигурационного файла зависит от ОС:
ОС | Путь | Пример |
---|---|---|
Linux | $XDG_CONFIG_HOME или $HOME/.config | /home/alice/.config/.tsrv/settings.yaml |
Windows | %AppData% | C:\Users\Alice\AppData\Roaming\.tsrv\settings.yaml |
Установка TSRV как сервиса (службы) Windows (v1.8.x)
- Установить tsrv как сервис
- Рядом с tsrv.exe создать файл по имени install.bat со следующим содержимым:
cd %~dp0 .\tsrv.exe --install-service --test pause
- Запустить
install.bat
от администратора
- Альтернативный способ:
- Запустить
cmd.exe
от Администратора - Выполнить
c:\путь\к\tsrv.exe --install-service --test
- Запустить
- Проверить, что сервис успешно запустился:
sc query tsrv-native
- В случае, если сервис не в статусе
RUNNING
необходимо посмотреть логи сервиса
- ⚠️ При переходе из тестовой зоны в боевую необходимо вызывать инсталлер с ключом
--prod
вместо--test
. Это заведёт правильную переменную окружения для работы кассы.
Логи сервиса
- Логи складываются в
%AppData%\.tsrv\.logs
- Так как сервис запускается под пользователем LocalSystem, логи можно найти по пути
C:\Windows\SysWOW64\config\systemprofile\AppData\Roaming\.tsrv\.logs
- [необязательно] Чтобы логи и файлы конфигурации складывались в не-системного пользователя, необходимо сменить пользователя в
service.msc
для сервисаTSRVNative
, это поддерживается
Общее описание принципов взаимодействия
Пример взаимодействия с СКО
- Получение СКО с передачей заголовка
tokens.refresh
со значениемtrue
, как описано в разделе Работа с СКО - Авторизация
- Получение состояния СКО с целью проверки, открыта ли смена
- Если смена закрыта - Открытие смены
- Внесение
- Продажа
- Аннулирование
- Возврат
- Изъятие
- Выдача
- Закрытие смены
Обработка ошибок (v2.0.1+)
Ошибки разделяются на подтипы, на основании используемых префиксов, например:
$.avtpcr.*
- ошибки, которые отдаются от СКО или связаны с внутренней работой с СКО, например:$.avtpcr.not_authorized
- Не пройдена авторизация в СКО$.avtpcr.space.insufficient
- Недостаточно памяти в СКО для записи данных
$.io.*
- ошибки, связанные с передачей данных из/в СКО$.transport.*
- ошибки, связанные с обработкой данных от СКО$.internal.*
- ошибки, связанные с внутренними особенностями реализации протоколов взаимодействия с ПК. В случае возникновения ошибок такого рода стоит сообщать операторуavtpcr.*
- ошибки связанные с несоблюдением требований при взаимодействии с ПК. Например:avtpcr.status.blocked
- Касса заблокированаavtpcr.bundle.unique_id.length
- Превышена макс. длина уникального идентификатора для чека
rendering.*
- ошибки, связанные с отрисовкой или печатью данныхsko.core.receipt.*
- ошибки, связанные непосредственно с функционалом ПК, который отвечает за обработку и формирование кассовых документовorders.*
- ошибки работы с функционалом обслуживания за столиками
Обработка ошибок (v1.8.x)
Ошибки разделяются на подтипы, на основании используемых префиксов:
AVQFR_
- ошибки СКОTR_
- ошибки обработки ответов СКО. Практически в 100% случаев обрабатываются на уровне Программной Кассы. Клиентская обработка не требуется. Данные ошибки могут фигурировать в лог-файлахUSB_
- ошибка взаимодействия поUSB
с устройством. При возникновении таких ошибок при работе с СКО, последнее помечается как неактивное и удаляется из списка доступныхCRT_
- ошибки чтения данных из сертификата в СКО. Данная ошибка не передается на текущий момент на клиентскую часть, т.к. при ошибке чтения данных СКО считается невалидным и не помещается в список доступных к использованию. Данные ошибки могут фигурировать в лог-файлахAVTPCR_
- аналогичноCRT_
, но относится к аттрибутам устройстваTIN_
- ошибки валидации входных данных. Данные ошибки не должны возникать при валидной передаче данных и их обработка заключается в исправлении входных данныхTSRV_
- общие сервисные ошибки, должны обрабатываться в соответствии с их описаниемPR_
- ошибки связанные с взаимодействием с принтером. При возникновении данного типа ошибок на этапе фискализации передается полеop_data
с фискальным чекомTORD_
- ошибки работы с заказами в ресторанном режиме. В режиме ритейла данные ошибки отсутствуют
Более подробно об ошибках описано в описании методов и в разделе Ошибки данной документации.
Command Line Interface
Usage: tsrv [OPTIONS] [COMMAND]
Commands:
upgrade-sko Запустить проверку и установку обновлений СКО. Требуется передача PUK кода для обновления
analyze Запустить анализ СКО
help Print this message or the help of the given subcommand(s)
Options:
--logs-config <LOGS_CONFIG>
Путь к файлу с настройками логгирования. По умолчанию: './configs/log.yaml'
--data-dir <DATA_DIR>
Путь к папке, в которой будут находиться данные. По умолчанию: './tstorage'
--settings-config <SETTINGS_CONFIG>
Путь к файлу настроек. По умолчанию: './configs/settings.yaml'
-h, --help
Print help
Дополнительные возможности при фискализации
Для перечисленных ниже операций доступны доп. возможности:
create_sale
create_withdraw
create_rollback
create_client_withdraw
create_money_back
pay_order
Уникальный ID операции (unique_id
)
Имеется возможность передачи дополнительного идентификатора операции, например:
{
"data": {
"unique_id": "...",
"sale": { }
}
}
Максимальная длина: 36 символов
Используется для поиска данных на сервере, а так же для интеграции через WebHooks на стороне АИС ПКС*
Пользовательские данные (user_data
)
Имеется возможность передачи и хранения данных фронт-офиса, например:
{
"data": {
"user_data": "...",
"sale": { }
}
}
Используется в случаях, если требуется сохранять доп. данные Фронт-офиса внутри СКО.
Данные хранятся внутри СКО, соответственно объем данных может повлиять на скорость фискализации.
Данные хранятся между операциями и могут быть получены посредством API вызовов.
Комментарии (comments
)
См. Комментарии
Информация о торговой точке (trade_point_information
)
Имеется возможность передачи и хранения информации о торговой точке, например:
{
"data": {
"trade_point_information": "...",
"sale": { }
}
}
Данная информация печатается на чеке, если присутствует
Данные хранятся внутри СКО, соответственно объем данных может повлиять на скорость фискализации.
Данные хранятся между операциями и могут быть получены посредством API вызовов.
Для "удаления" данных требуется передать пустую строку
Отправка на электронную почту (emails
)
Имеется возможность пометки чека для отправки на почту*, например:
{
"data": {
"emails": [ "[email protected]" ],
"sale": { }
}
}
Максимальное кол-во эмейлов - 5 штук
Данные хранятся внутри СКО, соответственно объем данных может повлиять на скорость фискализации.
*
- Функционал на стадии разработки
Транспортный уровень
Данный раздел будет дополняться поддерживаемыми транспортными протоколами.
HTTP
Устаревший подход. Рекомендуется для всех новых интеграций использовать "Альтернативный"
Обмен сообщения происходит по адресу: host:port/tsrv
По умолчанию HTTP сервер стартует на 0.0.0.0:1828
, однако
это можно поменяв, установив переменную окружения TSRV_ADDR
в значение формата host:port
Все запросы совершаются методом POST
Заголовок Content-Type
должен иметь значение application/json
Пример:
> POST /tsrv HTTP/1.1
> Host: localhost:1828
> User-Agent: insomnia/2021.5.3
> Content-Type: application/json
> Accept: */*
> Content-Length: 109
| {
| "address": "ik.service.app",
| "headers": {
| "action": "init_session"
| },
| "data": null,
| "type": "send"
| }
Альтернативный способ взаимодействия по HTTP
Возможен так же вариант взаимодействия по следующему URL методом POST: /tsrv/{address}/{action}
.
В данном варианте все заголовки (поле headers
сообщения) могут быть помещены в заголовки HTTP запроса,
а заголовок action
может быть опущен, т.к. находится внутри пути запроса. В тело HTTP запроса
помещается поле data
сообщения.
В данном случае пример инициализации сессии выглядит следующим образом:
> POST /tsrv/ik.service.app/init_session HTTP/1.1
> Host: localhost:1828
> User-Agent: insomnia/2021.5.3
> Content-Type: application/json
> Accept: */*
> Content-Length: 0
В то же время запрос на авторизацию (с телом запроса) выглядит следующим образом:
> POST /tsrv/ik.service.token.authority/authorize HTTP/1.1
> Host: localhost:1828
> User-Agent: insomnia/2021.5.3
> Content-Type: application/json
> token: AVQ11071080687
> tokens.refresh: true
> Accept: */*
> Content-Length: 19
| {
| "pin": "47702"
| }
Требуется обратить внимание на HTTP заголовки token и tokens.refresh - они находятся в HTTP запросе
Проверка имени кассира
Важно: перед началом проверки удаляются пробелы в начале и конце строки.
Список проверок
- Длина поля
cashier
не равна0
, иначе ошибкаTIN_EMPTY_CASHIER
- Длина поля
cashier
не превышает20
символов, иначе ошибкаTIN_CASHIER_LEN
Проверка суммы
Список проверок
value
имеет не более2
знаков после запятой, иначе ошибкаTSRV_INVALID_SUM_DEC_PART
value
является положительным числом, иначе ошибкаTIN_NEGATIVE_SUM
value
не превышает максимального значения
Проверка скидки и надавки тов. позиции
Список проверок
discount
иmarkup
имеет не более2
знаков после запятой, иначе ошибкаTSRV_INVALID_SUM_DEC_PART
discount
иmarkup
находится в интервале от-549755813887.99
до549755813887.99
включительно
Проверка наименования тов. позиции
Важно: перед началом проверки удаляются пробелы в начале и конце строки.
Осуществляемые проверки
- Длина
name
не равна 0, иначе ошибкаTIN_EMPTY_NAME
- Длина
name
не превышает 128 символов, иначе ошибкаTIN_NAME_LEN
Проверка способов оплат и сдачи
Осуществляемые проверки
cash + cashless + other
больше, либо равно суммеК оплате
по чеку, иначе ошибкаTIN_NOT_ENOUGH_MONEY
cashless + other
меньше, либо равно суммеК оплате
по чеку, иначе ошибкаTIN_CASHLESS_OVERFLOW
cashless + other
равно суммеК оплате
по чеку и сумма оплат наличными равна0
, иначе ошибкаTIN_CASH_OVERFLOW
. Обьяснение: если сумма наличных и безналичных платежей равна требуемой сумме к оплате, то нет возможности дать сдачу, а значит сумма наличных должна быть равна 0.change
(сдача) должна быть больше либо равна0
, иначе ошибкаTIN_NEGATIVE_CHANGE
Правила округления
Все значения, имеющий тип Sum и требующие округления, округляются в 2 этапа:
- Округление до 3 знаков в сторону 0 (было:
1.2356
, стало:1.235
) - Округление до 2 знаков, по правилам математики
- Пример 1. было:
1.235
, стало:1.24
- Пример 2. было:
1.234
, стало:1.23
- Пример 1. было:
Все поля, требующие округления, описаны в соответствующих запросах, либо описании полей.
Сервисы
Сервисы представляют собой наборы функций, агрегированные по назначению.
Название каждого сервиса (например - app
) передается в поле
address
клиентского сообщения. Сервер, в свою очередь, передает
обработку данного сообщения "сервису", с указанным наименованием,
который в свою очередь пытается найти функцию для вызова на основании
заголовка action
. Стандартные сервисы, описанные в данном документе,
преобразуют значение поля action
в camel_case
вне зависимости от
переданного значения.
Напоминание: поле action
может быть передано с любой политикой
наименования, для сервисов, описанных в данной документации.
Важно: термин "возвращаемое значение" подразумевает под собой данные,
передающиеся в поле data
ответа сервера.
Все сервисы в данном разделе, которые взаимодействуют с конкретным СКО, принимают следующие заголовки:
token
(v1.8.x) (обязательный) - серийный номер СКОtoken
(v2.x) - серийный номер СКО. В случае, если подключено 1 СКО и заголовок не передан - будет использовано единственное подключенное СКОtokens.refresh
(необязательный) -"true"
/"false"
ik.service.app
Данный сервис предназначен для работы с операциями управления и получения информации о приложении.
version
Вызов данной функции возвращает информацию о версии протокола приложения.
В случае выполнения данной функции, поле data
отсутствует.
Возвращаемое значение: Version
Примеры
Запрос:
{
"type": "send",
"address": "ik.service.app",
"reply_address": "version-msg",
"data": null,
"headers": {
"action": "version"
}
}
Ответ (v2.x+)
{
"type": "send",
"data": {
"version": "2.0.1",
"kind": "tsrv",
"build": "20250225.075316"
}
}
Ответ (v1.8.x):
{
"type": "send",
"address": "version-msg",
"reply_address": null,
"data": {
"version": "1.0.0"
},
"headers": null
}
Работа с принтерами
request
Метод позволяет послать данные на принтер и опционально ожидать ответа на ту или иную команду.
Входные данные: EscPosReq
Возвращаемые данные:
- Error - если произошла ошибка чтения/записи при работе с принтером
String
-base64
представление ответа, если имеетсяnull
- если в полеreply_size
запроса отсутствует или имеет значение0
print_delayed
(v1.8.x)
Метод позволяет распечатать "отложенный" чек
Входные данные:
{
"id": String
}
ik.service.token
Данный сервис предназначен для получения информации об СКО.
get_tokens
Данный метод предназначен для получения информации о доступных СКО.
Данный метод не требует передачи поля data
в сообщении.
Возвращаемое значение (v1.8.x): Массив значений TokenInformation Возвращаемое значение (v1.8.x): Массив значений TokenInformation
Важно: данный метод сканирует список USB-устройств автоматически при вызове, вне зависимости от того, было ли найдено СКО или нет. После сканирования СКО попадает в список доступных к использованию.
Примеры
Запрос:
{
"type": "send",
"address": "ik.service.token",
"reply_address": "example",
"data": null,
"headers": {
"action": "get_tokens"
}
}
Ответ (v2.x):
{
"type": "send",
"data": {
"device_id": 159990531,
"operator_code": 5,
"organization": "ООО «АЙЭМЛЭБ»",
"pin_code_length": 6,
"puk_code_length": 8,
"serial": "AVQ11159990531",
"tax_number": 193141246,
"is_configured": true,
"is_compatible": true,
"version": "1.17.643",
"status": {
"last_update": "2025-03-01T16:01:39.233842481+03:00",
"block_reasons": []
},
"server_config": {
"last_update": "2025-03-01T16:01:40.777846386+03:00",
"chw_max_value": 21000,
"trade_point": {
"addr": "Адрес тестовой торговой точки",
"name": "Название тестовой торговой точка"
},
"organization": "ООО \"АЙЭМЛЭБ\""
}
}
}
Ответ (v1.8.x):
{
"type": "send",
"address": "example",
"reply_address": null,
"data": [
{
"device_id": 131010703,
"operator_code": 5,
"organization": "ИП Моров А.М.",
"pin_code_length": 5,
"puk_code_length": 8,
"serial": "AVQ11031010703",
"tax_number": 191832203
}
],
"headers": null
}
get_token_by_serial
Данный метод предназначен для получения информации об СКО по серийному номеру.
Необходимость во входных данных отсутствует, однако серийный номер требуется к
передаче в заголовке token
. (в версии v2.x заголовок опционален, если подключено только 1 СКО)
Так же, опционально может быть передан заголовок tokens.refresh
со следующими значениями:
"true"
- будет совершено обновление сканирование USB-устройств"false"
(по умолчанию) - сканирование USB-устройств совершено не будет
Возвращаемое значение (v1.8.x): TokenInformation Возвращаемое значение (v2.x): TokenInformation2
Примеры
Пример успешного выполнения
Запрос с заголовком tokens.refresh
:
{
"type": "send",
"address": "ik.service.token",
"reply_address": "example",
"data": null,
"headers": {
"action": "get_token_by_serial",
"tokens.refresh": "true",
"token": "AVQ11031010703"
}
}
Ответ (v2.x):
{
"type": "send",
"data": {
"device_id": 159990531,
"operator_code": 5,
"organization": "ООО «АЙЭМЛЭБ»",
"pin_code_length": 6,
"puk_code_length": 8,
"serial": "AVQ11159990531",
"tax_number": 193141246,
"is_configured": true,
"is_compatible": true,
"version": "1.17.643",
"status": {
"last_update": "2025-03-01T16:01:39.233842481+03:00",
"block_reasons": []
},
"server_config": {
"last_update": "2025-03-01T16:01:40.777846386+03:00",
"chw_max_value": 21000,
"trade_point": {
"addr": "Адрес тестовой торговой точки",
"name": "Название тестовой торговой точка"
},
"organization": "ООО \"АЙЭМЛЭБ\""
}
}
}
get_cash_in_token
Данный метод предназначен для получения сумм наличных в кассе.
Входные данные:
null
.- либо строковое значение Currency
Возвращаемые данные:
- В случае, если во входных данных был передан
null
, будет возвращен массив значений CashIn, со всеми поддерживаемыми валютами - В случае, если было передано значение Currency, будет возвращен массив с 1 элементом CashIn, соответствующий переданной валюте
Важно: должны быть соблюдены следующие условия: В СКО должна быть произведения авторизация по PIN-коду
Успех (все валюты)
Запрос
{
"address": "ik.service.token",
"headers": {
"action": "get_cash_in_token",
"tokens.refresh": "true",
"token": "AVQ11169990670"
},
"data": null,
"type": "send"
}
Ответ:
{
"type": "send",
"data": [
{
"cash": "352.50",
"currency": "BYN"
},
{
"cash": "0",
"currency": "USD"
},
{
"cash": "0",
"currency": "EUR"
},
{
"cash": "0",
"currency": "RUB"
}
]
}
Успех (указание валюты)
Запрос:
{
"type": "send",
"address": "ik.service.token",
"reply_address": "example",
"data": "BYN",
"headers": {
"token": "AVQ11031010703",
"action": "get_cash_in_token"
}
}
Ответ:
{
"type": "send",
"address": "example",
"reply_address": null,
"data": [
{
"cash": "0.00",
"currency": "BYN"
}
],
"headers": null
}
next_cheque_number
Данный метод предназначен для получения номера следующего документа.
Входные данные: null
Возвращаемые данные: u32
- номер следующего чека
Примеры
Успешный (пройдена авторизация)
Запрос:
{
"type": "send",
"address": "ik.service.token",
"reply_address": "example",
"data": null,
"headers": {
"action": "next_cheque_number",
"tokens.refresh": "true",
"token": "AVQ11031010703"
}
}
Ответ:
{
"type": "send",
"address": "example",
"reply_address": null,
"data": 5782,
"headers": null
}
get_stored_documents
Данный метод предназначен для получения информации, о количестве неотправленных записей в СКО.
На каждый документ создается 2 или более записей в СКО, кол-во документов возвращает кол-во записей, а не документов
С клиентской стороны отсутствует возможность
повлиять на количество отправленных или неотправленных документов и этот
метод хоть и может вводить в панику числом, отличным от 0
, является лишь
справочным для проверки, что документы (не)отправляются на
сервер Оператора Программной Кассы.
Входные данные: null
Возвращаемые данные: u16
- количество неотправленных документов на сервер.
Примеры
Успех
Запрос:
{
"type": "send",
"address": "ik.service.token",
"reply_address": "example",
"data": null,
"headers": {
"token": "AVQ11031010703",
"tokens.refresh": "true",
"action": "get_stored_documents"
}
}
Ответ:
{
"type": "send",
"address": "example",
"reply_address": null,
"data": 100,
"headers": null
}
Ошибка (не пройдена авторизация)
Запрос:
{
"type": "send",
"address": "ik.service.token",
"reply_address": "example",
"data": null,
"headers": {
"token": "AVQ11031010703",
"action": "get_stored_documents",
"tokens.refresh": "true"
}
}
Ответ:
{
"type": "error",
"address": "example",
"reply_address": null,
"data": {
"description": "сессия не авторизована (команда требует обязательной авторизации)",
"name": "AVQFR_SESSION_NOT_AUTHORIZED"
},
"headers": null
}
get_oldest_document
Данный метод предназначен для получения самого "старого" неотправленного документа на сервер Оператора Программной Кассы.
Входные данные: null
Возвращаемые данные: OldestDocument
Примеры
Успех
Запрос:
{
"type": "send",
"address": "ik.service.token",
"reply_address": "example",
"data": null,
"headers": {
"token": "AVQ11031010703",
"action": "get_oldest_document",
"tokens.refresh": "true"
}
}
Ответ:
{
"type": "send",
"address": "example",
"reply_address": null,
"data": {
"date": "2021-09-13T10:17:35+03:00",
"uid": "A50B7A727894C03707CF108F"
},
"headers": null
}
get_token_state
Данный метод позволяет получить сохраненную информацию об СКО.
Входные данные: отсутствуют
Возвращаемые данные:
null
если авторизация не пройдена- State, если авторизация пройдена
update_status
Принудительное обновление статуса СКО.
Входные данные: отсутствуют
Возвращаемые данные: UpdateStatus
get_total_income
Входные данные: Currency
Возвращаемые данные: Sum
get_status
Получение статуса СКО.
Статус unknown
означает то, что приложение не смогло узнать
статус кассы.
Статус blocked
означает, что касса была заблокирована.
Статус active
означает, что все хорошо и касса может работать.
Входные данные: отсутствуют
Возвращаемые данные: Status
set_trade_point_name
(v1.8.0)
Указание наименования торговой точки, для отображения на чеках.
Входные данные: String
Возвращаемые данные: null
print_prev_receipt
Получение и печать ранее фискализированного документа.
Входные данные: ReceiptRequest
Возвращаемые данные:
null
- если чек не найден- Receipt - если чек найден
Важно: Данный метод требует авторизации в СКО.
Важно: если data.shift_number
передано значение null
требуется наличие
открытой смены
Важно: для данного запроса требуются заголовки для работы с принтером
get_minmax_receipts
(v1.8.x)
Получение информации о первом и последнем известном документе в рамках текущей, либо одной из предыдущих смен.
Входные данные:
null
- получение чеков в текущей сменеu16
- номер смены, из которой требуется получение номеров первого и последнего документа
Возвращаемые данные:
AVQFR_SHIFT_IS_CLOSED
- если переданоnull
во входных данных и смена закрытаAVQFR_SESSION_NOT_AUTHORIZED
- если не пройдена авторизация в СКО- MinMaxReceipts - в случае успеха
get_receipt
(v1.8.x)
Получение информации по ранее фискализированному чеку в текущей/предыдущей смене.
Входные данные: ReceiptRequest
Возвращаемые данные:
null
- если чек не найден- Receipt - если чек найден
Важно: Данный метод требует авторизации в СКО. В случае, если авторизация в СКО
не пройдена будет возвращена ошибка AVQFR_SESSION_NOT_AUTHORIZED
Важно: если data.shift_number
передано значение null
требуется наличие
открытой смены, иначе будет возвращена ошибка AVQFR_SHIFT_IS_CLOSED
ik.service.token.authority
Данный сервис предназначен для совершения операций с СКО - связанных с PIN/PUK кодами.
authorize
Данный метод предназначен для совершения авторизации в СКО.
Входные данные: Pin
Возвращаемые данные:
null
в случае успеха.
Важно: после каждой неверной попытки авторизации задержка ответа увеличивается. После 3 попытки время ожидания ответа авторизации составляет 10 секунд. После ввода успешного PIN-кода задержка сбрасывается.
Примеры
Успех
Запрос:
{
"type": "send",
"address": "ik.service.token.authority",
"reply_address": "example",
"data": {
"pin": "16522"
},
"headers": {
"tokens.refresh": "true",
"token": "AVQ11031010703",
"action": "authorize"
}
}
Ответ:
{
"type": "send",
"address": "example",
"reply_address": null,
"data": null,
"headers": null
}
change_pin_code
(v1.8.x)
Данный метод предназначен для изменения PIN-кода СКО.
Входные данные: ChangePin
Возвращаемые данные:
null
в случае успеха
Данный метод совершает следующие операции:
- Попытка совершить
logout
- Авторизация по PUK-коду
- Смена PIN-кода
logout
Примеры
Успех
Запрос:
{
"type": "send",
"address": "ik.service.token.authority",
"reply_address": null,
"data": {
"pin": "16522",
"puk": "17307748"
},
"headers": {
"tokens.refresh": "true",
"token": "AVQ11031010703",
"action": "change_pin_code"
}
}
Ответ:
{
"type": "send",
"address": null,
"reply_address": null,
"data": null,
"headers": null
}
Ошибка (неверный PUK-код)
Запрос:
{
"type": "send",
"address": "ik.service.token.authority",
"reply_address": null,
"data": {
"pin": "16522",
"puk": "17307749"
},
"headers": {
"token": "AVQ11031010703",
"tokens.refresh": "true",
"action": "change_pin_code"
}
}
Ответ:
{
"type": "error",
"address": null,
"reply_address": null,
"data": {
"description": "неверные данные для авторизации сессии (неверное значение PIN, PUK или REG)",
"name": "AVQFR_BAD_KEY_AUTH_DATA",
},
"headers": null
}
Ошибка (неверная длина PUK-кода)
Запрос:
{
"type": "send",
"address": "ik.service.token.authority",
"reply_address": null,
"data": {
"pin": "16522",
"puk": "1730774"
},
"headers": {
"token": "AVQ11031010703",
"action": "change_pin_code",
"tokens.refresh": "true"
}
}
Ответ:
{
"type": "error",
"address": null,
"reply_address": null,
"data": {
"description": "invalid code length. current: 7, required: 8",
"name": "TIN_CODE_LEN"
},
"headers": null
}
Ошибка (неверная длина PIN-кода)
Запрос:
{
"type": "send",
"address": "ik.service.token.authority",
"reply_address": null,
"data": {
"pin": "1652",
"puk": "17307748"
},
"headers": {
"token": "AVQ11031010703",
"action": "change_pin_code",
"tokens.refresh": "true"
}
}
Ответ:
{
"type": "error",
"address": null,
"reply_address": null,
"data": {
"description": "invalid code length. current: 4, required: 5",
"name": "TIN_CODE_LEN"
},
"headers": null
}
logout
Данный метод предназначен для совершения выхода из авторизованной сессии.
Входные данные: null
Возвращаемые данные:
null
в случае успеха
Примеры
Успех
Запрос:
{
"type": "send",
"address": "ik.service.token.authority",
"reply_address": "example",
"data": null,
"headers": {
"tokens.refresh": "true",
"token": "AVQ11031010703",
"action": "logout"
}
}
Ответ:
{
"type": "send",
"address": "example",
"reply_address": null,
"data": null,
"headers": null
}
ik.service.token.shift
Данный сервис предназначен для работы со сменой.
open_shift
Данный метод предназначен для открытия смены.
Входные данные (v1.8.x и v2.x): null
Входные данные (v2.х):
{
"mode": "default" | "restaurant" | null
}
Для работы с заказами требуется передача параметра mode
со значением restaurant
Возвращаемые данные:
null
в случае успеха.
Важно: смена может быть открыта не более 24 часов.
Примеры
Успех
Запрос:
{
"address": "ik.service.token.shift",
"headers": {
"action": "open_shift",
},
"type": "send"
}
Ответ:
{
"type": "send",
"data": null
}
get_x_report
Данный метод предназначен для получения X-отчета.
Входные данные: null
Возвращаемые данные:
- Report в случае успеха
Важно: данный метод НЕ отдает документ на печать. Для отправки на печать следует использовать метод печати X-отчёта
Примеры
Успех
Запрос:
{
"type": "send",
"address": "ik.service.token.shift",
"reply_address": "example",
"data": null,
"headers": {
"action": "get_x_report",
"token": "AVQ11169990670",
"tokens.refresh": "true"
}
}
print_x_report
Данный метод предназначен для получения X-отчета.
Входные данные: PrintXReportReq или null
Важно: для печати требуется передача заголовков для работы с принтером
Возвращаемые данные:
- Report в случае успеха
Важно: в случае, если в операции не совершалось никаких операций,
массив счетчиков (data.counters
) будет пустым, однако на печать в любом
случае уйдут счетчики с нулевыми значениями по валюте BYN
Примеры
Примеры аналогичны получению Х-отчета, за исключением необходимых заголовков для работы с принтером
close_shift
Данный метод предназначен для закрытия смены с последующим получением Z-отчета.
Входные данные:
null
или CloseShiftReq
Возвращаемые данные:
- Report в случае успеха.
Важно: для закрытия смены, требуется полное изъятие наличных.
Примеры
Успех
Запрос:
{
"address": "ik.service.token.shift",
"headers": {
"action": "close_shift",
"token": "AVQ11169990670",
"printer.dummy": ""
},
"type": "send"
}
Ответ:
{
"type": "send",
"data": {
"close_date": "2024-07-18 21:06:21",
"company_name": "ООО \"АЙЭМЛЭБ\"",
"currency_counters": {
"BYN": {
"additional": {
"third_party": {
"rollback": {
"count": 1,
"sum": "5.00"
},
"total": {
"count": 10,
"sum": "104.00"
}
}
},
"client_withdraws": {
"count": 1,
"sum": "1.00"
},
"deposits": {
"count": 4,
"sum": "310.00"
},
"marking_si": {
"count": 0,
"sum": "0.00"
},
"marking_ukz": {
"count": 0,
"sum": "0.00"
},
"money_backs": {
"card": "0.50",
"cash": "0.50",
"count": 1,
"other": "0.00",
"sum": "1.00"
},
"rollbacks": {
"card": "6.00",
"cash": "0.00",
"count": 1,
"other": "0.00",
"sum": "6.00"
},
"sales": {
"card": "60.00",
"cash": "44.00",
"count": 10,
"other": "0.00",
"sum": "104.00"
},
"si_refund": {
"count": 0,
"sum": "0.00"
},
"si_rollback": {
"count": 0,
"sum": "0.00"
},
"ukz_refund": {
"count": 0,
"sum": "0.00"
},
"ukz_rollback": {
"count": 0,
"sum": "0.00"
},
"withdraws": {
"count": 1,
"sum": "352.50"
}
}
},
"first_sale_number": 19,
"last_sale_number": 35,
"number": 3,
"open_date": "2024-07-18 17:07:22",
"repr": {},
"sales_count": 10,
"serial_number": "AVQ11169990670",
"tax_number": 193141246,
"total_income": {
"BYN": "149.00"
},
"uid": "D5CCDF029529C4E606A6E41E"
}
}
get_z_report_copy
Данный метод предназначен для печати копии Z-отчета.
Входные данные:
- (v1.8.x) ZReportCopyRequest
- (v2.x)
null
Возвращаемые данные:
- Report в случае успеха.
Важно: требуется авторизация
Важно (v2.x): : Метод доступен только в закрытой смене и отдает информацию только о последней закрытой смене
create_deposit
Входные данные: NewSumChequeRequest
Возвращаемые данные (v1.8.x): Deposit Возвращаемые данные (v2.x): FiscalResponse
Важно: Для совершения данной операции требуется Авторизация в СКО
Важно: Для совершения данной операции требуется открытая смена
Важно: Для совершения данной операции смена должна быть открыта менее 24 часов
Примеры запросов
Успех
Запрос:
{
"address": "ik.service.token.deposit",
"headers": {
"action": "create_deposit",
"token": "AVQ11031010703",
"printer.dummy": ""
},
"data": {
"sum_cheque_data": {
"header": {
"cashier": "Test",
"currency": "BYN"
},
"sum": "1.00"
}
},
"type": "send"
}
Ответ (v1.8.x):
{
"type": "send",
"address": null,
"reply_address": null,
"data": {
"extra": null,
"header": {
"cashier": "Test",
"company_name": "ИП Моров А.М.",
"currency": "BYN",
"date_time": "2021-09-25T14:07:07.523495+03:00",
"device_id": 131010703,
"number": 5918,
"serial_number": "AVQ11031010703",
"shift_number": 206,
"tax_number": 191832203,
"trade_point_name": null,
"type_id": "deposit_v2",
"uid": "0C7D6E36464C9F4A07CF108F"
},
"sum": "1.00"
},
"headers": null
}
create_withdraw
Входные данные: NewSumChequeRequest
Возвращаемые данные (v1.8.x): Withdraw Возвращаемые данные (v2.x): FiscalResponse
Важно: Для совершения данной операции требуется Авторизация в СКО
Важно: Для совершения данной операции требуется открытая смена
Важно: Для совершения данной операции смена должна быть открыта менее 24 часов, либо сумма изъятия должна быть на сумму всех наличных в кассе по указанной валюте
Примеры запросов
Успех
Запрос:
{
"address": "ik.service.token.withdraw",
"headers": {
"action": "create_withdraw",
"token": "AVQ11169990670",
"printer.dummy": ""
},
"data": {
"sum_cheque_data": {
"header": {
"cashier": "Test",
"currency": "BYN"
},
"sum": "352.50"
}
},
"type": "send"
}
Ответ (v2.x):
{
"type": "send",
"data": {
"header": {
"uid": "EEBAE74068406C4509894303",
"number": 362,
"date_time": "2025-03-01T18:54:35.761641+03:00",
"shift_number": 78
},
"errors": null
}
}
Ответ (1.8.x):
{
"type": "send",
"data": {
"extra": null,
"header": {
"cashier": "Test",
"company_name": "ООО \"АЙЭМЛЭБ\"",
"currency": "BYN",
"date_time": "2024-07-18 21:05:53",
"device_id": 111600670,
"number": 36,
"serial_number": "AVQ11169990670",
"shift_number": 3,
"tax_number": 193141246,
"trade_point_name": null,
"type_id": "cashier_withdraw_v2",
"uid": "5A8826C6EF3BF95006A6E41E"
},
"repr": {},
"sum": "352.50"
}
}
create_client_withdraw
Входные данные: NewSumChequeRequest
Возвращаемые данные (v1.8.x): Client_Withdraw Возвращаемые данные (v2.x): FiscalResponse
Важно: Для совершения данной операции требуется Авторизация в СКО
Важно: Для совершения данной операции требуется открытая смена
Важно: Сумма выдачи в рамках одной операции ограничена законодательно, не должна превышать 5 базовых величин
Важно: Доступная валюта для операции выдачи BYN
Важно: Для совершения данной операции смена должна быть открыта менее 24 часов
Примеры запросов
Успех
Запрос:
{
"address": "ik.service.token.withdraw",
"headers": {
"action": "create_client_withdraw",
"token": "AVQ11031010703",
"printer.dummy": ""
},
"data": {
"sum_cheque_data": {
"header": {
"cashier": "Test",
"currency": "BYN"
},
"sum": "1.00"
}
},
"type": "send"
}
Ответ (v2.x)
{
"type": "send",
"data": {
"header": {
"uid": "598813A9ECD7CB4B09894303",
"number": 356,
"date_time": "2025-03-01T17:25:14.490005+03:00",
"shift_number": 78
},
"errors": null
}
}
Ответ (v1.8.x):
{
"type": "send",
"address": null,
"reply_address": null,
"data": {
"extra": null,
"header": {
"cashier": "Test",
"company_name": "ИП Моров А.М.",
"currency": "BYN",
"date_time": "2021-09-25T14:08:57.072357+03:00",
"device_id": 131010703,
"number": 5919,
"serial_number": "AVQ11031010703",
"shift_number": 206,
"tax_number": 191832203,
"trade_point_name": null,
"type_id": "client_withdraw_v2",
"uid": "2636BF4D0E0E524F07CF108F"
},
"sum": "1.00"
},
"headers": null
}
create_sale
Данный метод предназначен для совершения операции продажи.
Входные данные: SaleRequest
Возвращаемые данные (v1.8.x): Sale Возвращаемые данные (v2.x): FiscalResponse
Важно: Для совершения данной операции требуется Авторизация в СКО
Важно: Для совершения данной операции требуется открытая смена
Важно: Для совершения данной операции смена должна быть открыта менее 24 часов
Примеры
Успех
Запрос:
{
"address": "ik.service.token.sales.retail",
"headers": {
"action": "create_sale",
"token": "AVQ11169990670",
"printer.dummy": ""
},
"data": {
"sale": {
"header": {
"cashier": "Test",
"currency": "BYN"
},
"items": [
{
"section": {
"code": 1,
"name": "Тестовая секция"
},
"code": {
"code": "1845678901001"
},
"price": "7.00",
"quantity": "1.000",
"name": "Test Flat white",
"discount": "1.00",
"markup": "1.00",
"tax_rate": "tax20"
},
{
"code": {
"code": "123132"
},
"price": "10.00",
"quantity": "1.000",
"name": "Не gtin товар",
"discount": "1.00",
"markup": "2.00",
"tax_rate": "tax10"
}
],
"payments": [
{
"payment_type": "cashless",
"value": "6.00",
"name": "Халва",
"ref": "123414141124"
},
{
"payment_type": "cash",
"value": "20.00"
}
],
"cheque_discount": "2.00",
"cheque_markup": "1.00",
"tp_tax_number": 123456789
}
},
"type": "send"
}
Ответ (v2.x):
{
"type": "send",
"data": {
"header": {
"uid": "C33C10DA6AC8ABF409894303",
"number": 361,
"date_time": "2025-03-01T17:54:27.644874+03:00",
"shift_number": 78
},
"errors": null
}
}
Ответ (v1.8.x):
{
"type": "send",
"data": {
"change": "9.00",
"header": {
"cashier": "Test",
"company_name": "ООО \"АЙЭМЛЭБ\"",
"currency": "BYN",
"date_time": "2024-07-18 21:01:16",
"device_id": 111600670,
"number": 35,
"serial_number": "AVQ11169990670",
"shift_number": 3,
"tax_number": 193141246,
"trade_point_name": null,
"type_id": "sale_v2",
"uid": "DCB2E337606B007206A6E41E"
},
"items": [
{
"item": {
"code": {
"code": "1845678901001"
},
"discount": "1.00",
"markup": "1.00",
"name": "Test Flat white",
"price": "7.00",
"quantity": "1.000",
"section": {
"code": 1,
"name": "Тестовая секция"
},
"tax_rate": "tax20"
},
"values": {
"discount": "100",
"has_marking": false,
"markup": "100",
"sum": "700",
"tax1": "117"
}
},
{
"item": {
"code": {
"code": "123132"
},
"discount": "1.00",
"markup": "2.00",
"name": "Не gtin товар",
"price": "10.00",
"quantity": "1.000",
"section": null,
"tax_rate": "tax10"
},
"values": {
"discount": "100",
"has_marking": false,
"markup": "200",
"sum": "1100",
"tax1": "100"
}
}
],
"payments": [
{
"name": "Халва",
"payment_type": "cashless",
"ref": "123414141124",
"value": "6.00"
},
{
"name": null,
"payment_type": "cash",
"ref": null,
"value": "20.00"
}
],
"repr": {},
"sub_totals": {
"cheque_discount": "2.00",
"cheque_markup": "1.00",
"sum": "17.00",
"taxes": [
{
"sum": "1.17",
"tax_rate": "tax20"
},
{
"sum": "1.00",
"tax_rate": "tax10"
}
]
},
"totals": {
"discount": "2.00",
"markup": "3.00",
"sum": "18.00"
},
"tp_tax_number": 123456789
}
}
create_money_back
Операция возврата.
Входные данные: NewMoneyBackRequest
Возвращаемые данные (v1.8.x): MoneyBack Возвращаемые данные (v2.x): FiscalResponse
Важно: Для совершения данной операции требуется Авторизация в СКО
Важно: Для совершения данной операции требуется открытая смена
Важно: Для совершения данной операции смена должна быть открыта менее 24 часов
Важно: Кол-во наличных в кассе по указанной валюте должно быть больше, либо равно сумме возврата наличными средствами
Примеры
Успех
Запрос:
{
"address": "ik.service.token.moneyback",
"headers": {
"action": "create_money_back",
"token": "AVQ11169990670",
"printer.dummy": ""
},
"data": {
"money_back": {
"header": {
"cashier": "Test",
"currency": "BYN"
},
"items": [
{
"section": {
"code": 1,
"name": "Тестовая секция"
},
"code": {
"scan": [
{
"gtin": "123456789012"
},
{
"unknown": "j239ej2je"
},
{
"ukz": "midom0im20m03223d-2-d"
}
]
},
"price": "7.00",
"quantity": "1.000",
"name": "Test Flat white",
"markup": "1.50",
"discount": "2.20"
},
{
"code": {
"service": "121"
},
"price": "10.00",
"quantity": "1.000",
"name": "Не gtin товар",
"markup": "1.10",
"discount": "2.40"
}
],
"payments": [
{
"payment_type": "cash",
"value": "10"
},
{
"payment_type": "cashless",
"value": "5"
}
]
}
},
"type": "send"
}
Ответ (v2.x):
{
"type": "send",
"data": {
"header": {
"uid": "20DDAEBDBD0A31E309894303",
"number": 357,
"date_time": "2025-03-01T17:40:45.794886+03:00",
"shift_number": 78
},
"errors": null
}
}
Ответ (v1.8.x):
{
"type": "send",
"data": {
"header": {
"cashier": "Test",
"company_name": "ООО \"АЙЭМЛЭБ\"",
"currency": "BYN",
"date_time": "2024-07-18 20:46:13",
"device_id": 111600670,
"number": 25,
"serial_number": "AVQ11169990670",
"shift_number": 3,
"tax_number": 193141246,
"trade_point_name": null,
"type_id": "money_back_v2",
"uid": "D0A94EEE80104FC306A6E41E"
},
"items": [
{
"item": {
"code": {
"scan": [
{
"gtin": "123456789012"
},
{
"unknown": "j239ej2je"
},
{
"ukz": "midom0im20m03223d-2-d"
}
]
},
"discount": "2.20",
"markup": "1.50",
"name": "Test Flat white",
"price": "7.00",
"quantity": "1.000",
"section": {
"code": 1,
"name": "Тестовая секция"
},
"tax_rate": null
},
"values": {
"has_marking": true,
"sum": "630"
}
},
{
"item": {
"code": {
"service": "121"
},
"discount": "2.40",
"markup": "1.10",
"name": "Не gtin товар",
"price": "10.00",
"quantity": "1.000",
"section": null,
"tax_rate": null
},
"values": {
"has_marking": false,
"sum": "870"
}
}
],
"payments": [
{
"name": null,
"payment_type": "cash",
"ref": null,
"value": "10.00"
},
{
"name": null,
"payment_type": "cashless",
"ref": null,
"value": "5.00"
}
],
"repr": {},
"totals": {
"card": "5.00",
"cash": "10.00",
"other": "0.00",
"sum": "15.00"
}
}
}
create_rollback
Операция аннулирования
Входные данные: NewRollbackRequest
Возвращаемые данные (v1.8.x): Rollback Возвращаемые данные (v2.x): FiscalResponse
Важно: Для совершения данной операции требуется Авторизация в СКО
Важно: Для совершения данной операции требуется открытая смена
Важно: Для совершения данной операции смена должна быть открыта менее 24 часов
Важно: данная операция требует того, чтобы аннулируемый документ находился в текущей смене, а так же того, что чек не был аннулирован ранее
Важно: Для данного запроса поле currency
игнорируется и может быть не передано
Важно: Доступно аннулирование только последнего документа, если он является документом продажи
Важно: Дополнительно можно передать поле rollback.target_num
с указанием номера аннулируемого док-та продажи. Если переданный номер не совпадает с последним док-том продажи будет возвращена ошибка.
Примеры
Успех
Запрос:
{
"address": "ik.service.token.rollback",
"headers": {
"action": "create_rollback",
"token": "AVQ11031010703",
"printer.dummy": ""
},
"data": {
"rollback": {
"header": {
"cashier": "Кассир"
}
}
},
"type": "send"
}
Ответ (v2.x):
{
"type": "send",
"data": {
"header": {
"uid": "F9BC5D1B0A3D061709894303",
"number": 359,
"date_time": "2025-03-01T17:50:25.365454+03:00",
"shift_number": 78
},
"errors": null
}
}
Ответ (v1.8.x):
{
"type": "send",
"data": {
"header": {
"cashier": "Кассир",
"company_name": "ООО \"АЙЭМЛЭБ\"",
"currency": "BYN",
"date_time": "2024-07-18 20:57:47",
"device_id": 111600670,
"number": 33,
"serial_number": "AVQ11169990670",
"shift_number": 3,
"tax_number": 193141246,
"trade_point_name": null,
"type_id": "rollback_v2",
"uid": "7ADA00F72937E57E06A6E41E"
},
"repr": {},
"target_num": 32,
"totals": {
"card": "6.00",
"cash": "0.00",
"other": "0.00"
}
}
}
Ресторанный режим
1
create_or_edit_order
Работа с любым заказом начинается с его создания, а созидание сопровождается редактированием.
- В СКО записывается краткая информация о заказе -
Сумма
+Номер счёта
, если имеется - Если для заказа был распечатан счёт и вызван метод редактирования этого заказа, номер счёта будет сброшен
- При редактировании заказа, изменение суммы заказа влечет за собой увеличение счётчиков "Коррекции" или "Сумма заказов"
- Если заказ не был закрыт / отменен / оплачен, на момент закрытия смены он увеличивает счётчики "Перемещенных" заказов
- Детальная информация о заказе хранится на ФС. В случае ее повреждения и/или несоответствия данным в СКО требуется повторно вызвать этот метод. Если заказ существует в СКО и его сумма совпадает с известной - увеличения счётчиков не произойдет
Взаимодействие
Входные данные:
Поле | Тип | Примечание |
---|---|---|
id | string | ID заказа. Макс. длина - 36 символов |
cashier | string | Кассир, работающий с заказом |
table | u32 | Номер столика |
place | u32? | Номер места за столиком, если имеется |
items | Массив Item | Массив товарных позиций |
markup | Money? | Надбавка, если имеется |
discount | Money? | Скидка, если имеется |
prepayment | Payment? | Предоплата с указанием способа. На момент оплаты будет преобразовано в тип оплаты "Предоплата" |
Ответ:
Поле | Тип | Примечание |
---|---|---|
errors | Errors? | Объект с ошибками, не связанными с СКО, если они возникали |
Пример запроса:
{
"address": "ik.service.token.orders",
"type": "send",
"headers": {
"action": "create_or_edit_order"
},
"data": {
"id": "test_id",
"cashier": "test",
"table": 1,
"items": [
{
"code": {
"code": "1059429"
},
"price": "10.99",
"quantity": "1.000",
"name": "Вазелин"
}
]
}
}
Пример успешного запроса:
{
"type": "send",
"data": {
"errors": null
}
}
cancel_order
Отмена заказа
Данные
Входные данные:
{
"id": "string"
}
В поле id
передается идентификатор заказа для печати счёта
Возвращаемые:
Поле | Тип | Примечание |
---|---|---|
errors | Errors? | Объект с ошибками, не связанными с СКО, если они возникали |
get_orders_information
Получение информации о заказе, хранящейся в СКО
Входные данные: Отсутствуют
Ответ:
{
"orders": {
"test_id": {
"sum": "10.99",
"bill_number": null
}
}
}
Orders
Поле | Тип | Примечание |
---|---|---|
orders | Map<ID, OrderInformation> | Словарь с информацией о заказами. Ключ - id заказа |
OrderInformation
Поле | Тип | Примечание |
---|---|---|
sum | Money | Сумма по заказу |
bill_number | u32? | Номер счёта по заказу, существует счёт по этому заказу |
pay_order
Данные
Входные:
Поле | Тип | Примечание |
---|---|---|
order_id | String | ID заказа |
payments | Массив Payment | Способы оплаты заказа. Перед началом фискализации в этот массив попадут данные из поля prepayment заказа. Тип способа оплаты у prepayment будет изменен на Prepayment |
bundle | Bundle? | Доп. данные для передачи в СКО |
Bundle
Поле | Тип | Примечание |
---|---|---|
unique_id | String? | ID операции |
user_data | String? | base64 пользовательские данные |
comments | Comments? | Комментарии |
emails | Массив String | Эмейлы для отправки чека |
trade_point_information | String? | Доп. информация о торговой точке, если требуется |
Пример запроса:
{
"address": "ik.service.token.orders",
"type": "send",
"headers": {
"action": "pay_order",
"token.trade_point.info": "Касса12",
"printer.cut": false,
"printer.feed": 0,
"printer.dummy": "true"
},
"data": {
"order_id": "test_id",
"cashier": "test",
"table": 1,
"payments": [
{
"payment_type": "cash",
"value": "10.99"
}
]
}
}
bill
Печать счёта.
Для корректной печати требуется передачи заголовком для работы с принтером
Входные данные:
{
"id": "string"
}
В поле id
передается идентификатор заказа для печати счёта
Ответ:
{
"type": "send",
"data": {
"number": 43,
"errors": null
}
}
number
- сформированный / присвоенный номер счёта
Errors
Поле | Тип | Примечание |
---|---|---|
printing | Error? | Ошибка печати |
storage | Error? | Ошибка работы с хранилищем данных |
Error
Поле | Тип | Примечание |
---|---|---|
name | String | Код ошибки |
description | String | Текст ошибки |
Тип Version
(v2.x)
{
"version": "2.0.1",
"kind": "tsrv",
"build": "20250225.075316"
}
version
- Версия ПКkind
- Тип ПКbuild
- Версия сборки API-слоя (tsrv
)
Тип Version
(v1.8.x)
{
"version": String
}
Поле version
отдается в формате SemVer.
Результат выполнения фискальной операции
{
"extra": Repr?,
"header": {
"uid": String,
"number": Int,
"date_time": String,
"shift_number": Integer
},
"errors": Errors?
}
Поля:
Поле | Тип | Примечание |
---|---|---|
extra | Repr? | Результаты отрисовки чека и прочие доп. данные |
header | Header | Содержит uid , number (номер док-та), date_time (в формате RFC3339), shift_number (номер смены) |
errors | Errors? | Ошибки, которые могли возникнуть после (!) фискализации |
Repr
Поле | Тип | Примечание |
---|---|---|
esc_pos | String? | Может отсутствовать. Содержит набор EscPos команд в base64 формате |
text | String? | Может отсутствовать. Текстовое представление чека (без QR с УИ) |
text_b64 | String? | Может отсутствовать. Текстовое представление чека (без QR с УИ) в base64 формате |
link | String? | Может отсутствовать. Ссылка на чек |
Тип PrintXReportReq
{
"comments": Comments?
}
comments
- Comments
Тип CloseShiftRequest
{
"comments": Comments?
}
Описание полей
comments
- Comments
Тип CloseShiftData
{
"cashier" String?
}
Описание полей
cashier
- имя кассира, закрывающего смену. Длина имени кассира не должны превышать20
символов.
Пример:
{
"cashier": "Администратор"
}
Тип Sum
Данный тип представляет собой значение, с плавающей точкой, представленное в строковом виде.
В случае, если данное значение фигурирует во входных данных, оно обязано
содержать 2 знака после запятой (иметь формат X.XX
), даже если последние
равны 0 (например: 12345.00
)
На данный тип наложен ряд ограничений:
- Максимальное значение:
549755813887.99
- Минимальное значение:
-549755813887.99
Данные ограничения продиктованы ограничениями протокола СККО.
Пример валидного значения Sum
:
"12345.67"
Тип UID
Данный тип представляет собой строковое значение в HEX формате Уникального Идентификатора (УИ) кассового документа
Пример значения:
"8914D11E9BA4471D0A327BFB"
Тип DateTime
Данный тип представляет собой дату и время в строковом формате. В зависимости от выполняемого метода и данных может содержать или не содержать информацию о миллисекундах, однако обязательно содержит информацию о часовом поясе.
Примеры:
С миллисекундами:
"2021-09-13T10:17:35.123+03:00"
Без миллисекунд:
"2021-09-13T10:17:35+03:00"
Тип Currency
Возможные значения:
enum
имеющий следующие поддерживаемые значения:
BYN
С версии 1.7.1
USD
RUB
EUR
Пример:
"BYN"
Тип TokenInformation
{
serial: String,
device_id: u32,
organization: String,
tax_number: u32,
pin_code_length: u32,
puk_code_length: u32,
operator_code: u32,
"trade_point_name": String?
}
serial
- серийный номер СКОdevice_id
- Регистрационный номер ПК в СККОorganization
- наименование компании, на которую зарегистрировано СКОtax_number
- УНП СХpin_code_length
- длина PIN-кода требуемого для авторизацииpuk_code_length
- длина PUK-кода требуемого для авторизацииoperator_code
- код Оператора Программной Кассы в соответствии с реестромtrade_point_name
- наименование торговой точки (отсутствует, если не было установлено)
Пример:
{
"device_id": 131010703,
"operator_code": 5,
"organization": "ИП Моров А.М.",
"pin_code_length": 5,
"puk_code_length": 8,
"serial": "AVQ11031010703",
"tax_number": 191832203,
"trade_point_name": "Тестовая торговая точка"
}
Тип TokenInformation2
{
"serial": String,
"device_id": Int,
"organization": String,
"tax_number": Int,
"pin_code_length": Int,
"puk_code_length": Int,
"operator_code": Int,
"is_configured": Boolean,
"is_compatible": Boolean,
"version": String,
"status": Status?,
"server_config": ServerConfig?
}
serial
- серийный номер СКОdevice_id
- Регистрационный номер ПК в СККОorganization
- наименование компании, на которую зарегистрировано СКОtax_number
- УНП СХpin_code_length
- длина PIN-кода требуемого для авторизацииpuk_code_length
- длина PUK-кода требуемого для авторизацииoperator_code
- код Оператора Программной Кассы в соответствии с реестромis_configured
- Сконфигурировано ли СКОis_compatible
- Совместимая ли версия ПК с СКОversion
- Версия СКОstatus
- Статус СКОserver_config
- Информация, получаемая с сервера
Status
{
"last_update": String,
"block_reasons": [ *String ]
}
last_update
- Дата-время последнего обновления статусаblock_reasons
- массив строк с описанием блокировок ПК.
ServerConfig
{
"last_update": DateTime,
"chw_max_value": Integer,
"trade_point": {
"addr": String,
"name": String"
},
"organization": String
}
last_update
- Дата-время последнего обновления статусаchw_max_value
- Максимальная сумма для операцииВыдача
в копейкахtrade_point.addr
- Адрес торговой точкиtrade_point.name
- Название торговой точкиorganization
- Название организации
Тип CashIn
{
"currency": Currency,
"cash": Sum
}
Используемые типы:
Пример:
{
"cash": "25.46",
"currency": "BYN"
}
Тип OldestDocument
{
"uid": UID,
"date" DateTime
}
Используемые типы:
Пример:
{
"uid": "A50B7A727894C03707CF108F",
"date": "2021-09-13T10:17:35+03:00"
}
Тип Pin
{
"pin": String
}
pin
- строковое представление PIN-кода
Пример:
{
"pin": "16522"
}
Тип ChangePin
{
"pin": String,
"puk": String
}
Описание полей
pin
- строковое представление нового PIN-кодаpuk
- строковое представление PUK-кода
Пример:
{
"pin": "16522",
"puk": "17307748"
}
Тип MinMaxReceipts
{
min: u32,
max: u32
}
Описание полей
min
- номер первого документа в сменеmax
- номер последнего документа в смене
Пример
{
"min": 5981,
"max": 5981
}
Тип Receipt
{
"type_id": deposit_v2 | cashier_withdraw_v2 | client_withdraw_v2 | money_back_v2 | rollback_v2 | sale_v2
}
Описание полей
type_id
- в зависимости от типа чека могут быть следующие значения:deposit_v2
- Внесениеcashier_withdraw_v2
- Изъятиеclient_withdraw_v2
- Выдачаmoney_back_v2
- Возвратrollback_v2
- Аннулированиеsale_v2
- Продажа
content
- содержимое чека. В зависимости отtype_id
могут быть следующие значения:
Пример:
{
"content": {
"extra": null,
"header": {
"cashier": "Test",
"company_name": "ИП Моров А.М.",
"currency": "BYN",
"date_time": "2021-10-05T15:27:36.803362+03:00",
"device_id": 131010703,
"number": 5981,
"serial_number": "AVQ11031010703",
"shift_number": 241,
"tax_number": 191832203,
"trade_point_name": null,
"type_id": "deposit_v2",
"uid": "7E047C2ABFC24FA207CF108F"
},
"sum": "1.00"
},
"type": "deposit"
}
Тип ReceiptRequest
{
shift_number: u16?,
number: u32
}
Описание полей
shift_number
- опциональное поле номера смены, если не указано используется текущий номер сменыnumber
- номер фискального документа в указанной/текущей смене
Пример
{
"shift_number": null,
"number": 5981
}
Тип Comments
"comments": {
"before": [ *Comment ]?,
"after": [ *Comment ]?,
}
Описание полей
before
- не обязательное поле, комментарии до заголовка чека
name
- не обязательное поле, комментарии после UID чека
Используемые типы
Тип Comment
{
"type:" CommentType,
"content": String,
"kind": CodeType?,
"width": u8?,
"height": u8?,
"size": u8?,
"align": Align?
}
Описание полей
type
- тип комментария, может принимать значения: QR
, TEXT
, `BARCODE
content
- содержание комментария. В случае TEXT
- utf-8 строка, в случае QR
или BARCODE
- base64 строка
kind
- тип кода, может принимать значения: CODE128
, EAN13
, CODE39
. Передается только, если type
- BARCODE
size
- размер QR-кода, передается только, если type
- QR
width
- ширина штрихкода, передается только, если type
- BARCODE
height
- высота штрихкода, передается только, если type
- BARCODE
align
- выравнивание, может принимать значения: LEFT
, CENTER
, RIGHT
Тип EscPosReq
{
"b64_content": String,
"reply_size": usize?
}
Описание полей
b64_content
-EscPos
команды в формате base64reply_size
- размер ожидаемого ответа. Если ответ не требуется, размер -0
, если значение данного поляnull
, то значением по умолчанию является0
Тип ZReportCopyRequest
{
"number": u16,
}
Описание полей
number
- номер смены
Тип Report
{
uid: UID?,
cashier: String?,
device_id: u32,
tax_number: u32,
company_name: String,
open_date: DateTime,
close_date: DateTime?,
number: u16,
first_sale_number: u32,
last_sale_number: u32,
sales_count: u16,
counters: [ *ReportCounter ]
}
uid
- УИ. В случае, если это Z-отчет - обязательное полеcashier
- Имя кассира в Z-отчете - опциональное поле, в X-отчете всегдаnull
device_id
- Регистрационный номер ПК в СККОtax_number
- УНПcompany_name
- Наименование организацииopen_date
- Дата открытия сменыclose_date
- Дата закрытия смены, присутствует только в Z-отчетеnumber
- Номер сменыfirst_sale_number
- Номер первого документа продажи в сменеlast_sale_number
- Номер последнего документа продажи в сменеsales_count
- количество документов продажcurrency_counters
- Массив сменных счетчиков, содержит информацию по каждой валюте, по которой совершались операции в сменеtotal_income
- накопленный оборотadditional.third_party
- счетчики операций в пользу 3-х лиц
Используемые типы:
Пример:
{
"type": "send",
"data": {
"close_date": "2024-07-18 11:17:03",
"company_name": "ООО \"АЙЭМЛЭБ\"",
"currency_counters": {
"BYN": {
"additional": {
"third_party": {
"rollback": {
"count": 1,
"sum": "6.00"
},
"total": {
"count": 1,
"sum": "6.00"
}
}
},
"client_withdraws": {
"count": 1,
"sum": "1.00"
},
"deposits": {
"count": 1,
"sum": "10.00"
},
"marking_si": {
"count": 0,
"sum": "0.00"
},
"marking_ukz": {
"count": 0,
"sum": "0.00"
},
"money_backs": {
"card": "0.50",
"cash": "0.50",
"count": 1,
"other": "0.00",
"sum": "1.00"
},
"rollbacks": {
"card": "6.00",
"cash": "0.00",
"count": 1,
"other": "0.00",
"sum": "6.00"
},
"sales": {
"card": "45.00",
"cash": "0.00",
"count": 10,
"other": "0.00",
"sum": "45.00"
},
"si_refund": {
"count": 0,
"sum": "0.00"
},
"si_rollback": {
"count": 0,
"sum": "0.00"
},
"ukz_refund": {
"count": 0,
"sum": "0.00"
},
"ukz_rollback": {
"count": 0,
"sum": "0.00"
},
"withdraws": {
"count": 2,
"sum": "8.50"
}
}
},
"first_sale_number": 4,
"last_sale_number": 13,
"number": 1,
"open_date": "2024-07-18 07:49:17",
"repr": {},
"sales_count": 10,
"serial_number": "AVQ11169990670",
"tax_number": 193141246,
"total_income": {
"BYN": "45.00"
},
"uid": "791261D74283114906A6E41E"
}
}
Тип ReportCounter
"currency_counters": {
"BYN": {
"additional": {
"third_party": {
"rollback": {
"count": u16
"sum": Sum
},
"total": {
"count": u16
"sum": Sum
}
}
},
"client_withdraws": {
"count": u16
"sum": Sum
},
"deposits": {
"count": u16
"sum": Sum
},
"marking_si": {
"count": u16
"sum": Sum
},
"marking_ukz": {
"count": u16
"sum": Sum
},
"money_backs": {
"card": Sum
"cash": Sum
"count": u16
"other": Sum
"sum": Sum
},
"rollbacks": {
"card": Sum
"cash": Sum
"count": u16
"other": Sum
"sum": Sum
},
"sales": {
"card": Sum
"cash": Sum
"count": u16
"other": Sum
"sum": Sum
},
"si_refund": {
"count": u16
"sum": Sum
},
"si_rollback": {
"count": u16
"sum": Sum
},
"ukz_refund": {
"count": u16
"sum": Sum
},
"ukz_rollback": {
"count": u16
"sum": Sum
},
"withdraws": {
"count": u16
"sum": Sum
}
}
}
-
currency_counters
- валюта счетчика -
count
- кол-во операций в валюте -
sum
- сумма продаж в валюте -
card
- сумма по карте -
cash
- сумма за наличные -
other
- сумма другими способами -
third_party
- счетчик операций в пользу 3х лиц -
total
- сумма продаж в валюте в пользу 3х лиц -
sales
- счетчик продаж -
money_backs
- счетчик возвратов -
rollback
- счетчик аннулирования -
withdraws
- счетчик изъятий -
client_withdraws
- счетчик выдачи -
deposits
- счетчик внесений -
marking_si
- счетчик продаж СИ -
marking_ukz
- счетчик продаж УКЗ -
si_refund
- счетчик возврата СИ -
si_rollback
- счетчик аннулирования СИ -
ukz_refund
- счетчик возврата УКЗ -
ukz_rollback
- счетчик аннулирования УКЗ
Используемые типы:
Тип TaxRateSum
{
tax_rate: TaxRate
sum: Sum
}
tax_rate
- ставка НДСsum
- сумма по ставке НДС
Важно: сумма по ставке НДС рассчитывается путем вычисления суммы НДС по каждой товарной позиции и сложением этих сумм.
Используемые типы:
Пример:
{
"tax_rate": "tax0",
"sum": "0.00"
}
Тип TaxRate
enum
имеющий следующие поддерживаемые значения:
tax0
tax10
tax20
tax25
Пример:
"tax0"
Тип TokenChequeHeader
{
"cashier": String,
"currency": Currency?
}
Описание полей
cashier
- имя кассира. Не может превышать 20 символов длинной, не может быть пустым. Пробелы в начале и конце строки удаляются и таким образом гарантируется, что не будет передано пустое имя кассираcurrency
- Валюта совершаемой операции, если не передано -byn
Используемые типы
Тип CalculatedItem
Товарная позиция с рассчитанными значениями
{
"item": Item,
"values": ItemCalculatedValues
}
Описание полей
item
- товарная позицияvalues
- рассчитанные значения товарной позиции
Используемые типы
Тип Items
{
"id": String?,
"price": Sum,
"quantity": Quantity,
"discount": Sum?,
"markup": Sum?,
"code": ItemCode,
"section": ItemSection,
"name": String,
"tax_rate": TaxRate?
}
Важно!: Поле name
поддерживает только символы кодировки CP1251
.
Описание полей
id
- клиентский идентификатор товарной позиции, на текущий момент не используется сервисомprice
- Цена товарной позиции за 1 единицуquantity
- Кол-во товарной позицииdiscount
- Скидка товарной позиции. В случае, если скидка не должна быть применена, должно быть передано значение nullmarkup
- Надбавка товарной позиции. В случае, если надбавка не должна быть применена, должно быть передано значение nullcode
- Описание Кода товарной позицииsection
- Описание Секции товарной позицииname
- Наименование товарной позиции. Не может быть пустым. Пробелы в начале и конце строки удаляются для избежания отсутствия наименования товарной позиции. Максимальная длина: 128 символовtax_rate
- НДС. Важно помнить, что НДС0 и отсутствие НДС - разные вещи.
Используемые типы
Тип ItemCode
"code": {
"scan": [
{ "si": "SiTest" },
{ "ukz": "UKZTest" },
{ "gtin": "12134" }
]
}
Описание полей
code
- Опциональное поле. Информация о коде и типе кода тов. позиции
Представляет из себя обьект следующего формата:
{ "типКода": "значениеКода" }
типКода
может иметь следующие значения:
code
- без GTIN/EAN
gtin
- GTIN/EAN
service
- Услуга
prepayment
- Аванс
Важно! Вне зависимости от типа кода значениеКода
может содержать исключительно цифры.
Важно! В случае, если типКода
указан как gtin
, максимальная длина значенияКода равна 14 символам. Для остальных случаев ограничение в 13 символов.
Важно! В маркировке встречается символ GS
. Его требуется передавать как \u001D
.
типКода
так же может быть установлен в значение scan
.
В этом случае значениеКода
передается как массив следующего формата:
[ { "типСкана": "значениеСкана" } ]
Где типСкана
может иметь следующие значения:
si
- маркировка СИ
ukz
- маркировка УКЗ
unknown
- неизвестный тип маркировки
gtin
- GTIN товара
Тип ItemSection
"section": {
"code": u8,
"name": String?,
}
Описание полей
code
- не обязательное поле, принимает значение от 0 до 255, 0 если номер секции отсутствует.
name
- не обязательное поле, наименование секции для оторажения на чеке
Тип Payment
{
"payment_type": PaymentType,
"name": String?,
"value": Sum,
"ref": String?
}
Описание полей
payment_type
- Тип платежаname
- Наименование платежа. Может отсутствоватьvalue
- Сумма платежаref
- Идентификатор платежного средства. Является опциональным полем и может быть использовано для идентификации RRN банковской транзакции, информации о банковском платеже, либо номере сертификата
Используемые типы
Тип PaymentType
enum
имеющий следующие поддерживаемые значения:
cash
cashless
other
Пример:
"cashless"
Тип Quantity
Данный тип представляет собой значение, с плавающей точкой, представленное в строковом виде.
В случае, если данное значение фигурирует во входных данных, оно обязано
содержать 3 знака после запятой (иметь формат X.XXX
), даже если последние
равны 0 (например: 12345.000
)
На данный тип наложен ряд ограничений:
- Максимальное значение:
16777.215
- Минимальное значение:
0
Данные ограничения продиктованы ограничениями протокола СККО.
Пример валидного значения Quantity
:
"12345.607"
Тип ChequeType
Возможные значения:
enum
имеющий следующие поддерживаемые значения:
deposit_v2
cashier_withdraw_v2
client_withdraw_v2
rollback_v2
money_back_v2
sale_v2
z_report_v2
Пример:
"deposit_v2"
Тип ChequeHeader
{
"type_id": ChequeType,
"uid": UID,
"device_id": u32,
"serial_number": String,
"cashier": String,
"number": u32,
"date_time": DateTime,
"currency": Currency,
"company_name": String,
"tax_number": u32,
"trade_point_name": String?,
"shift_number": u16
}
Описание полей
type_id
- тип чекаuid
- УИ чекаdevice_id
- Рег. номер ПК в СККО, в которой зарегистрирована операцияserial_number
- Серийный номер СКО в котором зарегистрирована операцияcashier
- кассир, который провел операциюnumber
- номер чекаdate_time
- дата и время фискализации чекаcurrency
- валюта операцииcompany_name
- название компании, которая провела операциюtax_number
- УНП компании, которая провела операциюtrade_point_name
- наименование торговой точки, на которой проведена операцияshift_number
- номер смены, в которой проведена операция
Используемые типы
Тип ItemCalculatedValues
{
"discount": Sum,
"markup": Sum,
"has_marking": bool,
"sum": Sum,
"tax1": Sum?
}
Описание полей
sum
- рассчитанная сумма товарной позиции. Расчет происходит по формулеitem.quantity * item.price - item.discount + item.markup
markup
- надбавка по товарной позицииdiscount
- скидка по товарной позицииtax1
- сумма по налоговой ставке за единицу тов. позиции (если есть)has_marking
- наличие маркировки на товарной позиции
Важно: При возврате, возвращаются только поля sum
и has_marking
.
Используемые типы
Тип State
{
"last_uid": UID,
"shift_state": ShiftState?
}
Описание полей
last_uid
- УИ последнего документаshift_state
- информация о смене. Отсутствует в случае, если смена закрыта
Используемые типы
Тип Status
Возможные значения:
enum
имеющий следующие поддерживаемые значения:
unknown
active
blocked
Пример:
"active"
Тип Status
{
"type": "send",
"data": {
"blockReasons": blockReasons?,
"chwMaxValue": Int?,
"companyName": String?,
"isActive": Boolean?,
"rn": Int?,
"taxNumber": Int?,
"tradeAddr": String?,
"tradeName": Strint?
}
}
Описание полей
blockReasons
- причина блокировки возвращает объект{code: String, message: String}
chwMaxValue
- максимальное значение суммы выдачи в копейкахcompanyName
- название организацииisActive
- статус блокировкиrn
- рег. номер кассыtaxNumber
- УНПtradeAddr
- адрес торговой точкиtradeName
- название торговой точки
Тип ShiftState
{
"next_cheque_number": u32,
"shift_number": u16,
"shift_open_date": DateTime,
"cash_in": Map<Currency, Sum>,
"user_data": String?,
"trade_point_information": String?
}
Описание полей
next_cheque_number
- номер следующего документаshift_number
- номер текущей сменыshift_open_date
- Дата-время открытия сменыcash_in
- Информация о наличных в смене. Представляет собой объект, где ключом является наименование валюты и значением значение наличных в кассе
Доп поля доступные с версии 2.x:
user_data
- Пользовательские данные в base64 форматеtrade_point_information
- Информация о торговой точке
Тип Deposit
{
"header": ChequeHeader,
"sum": Sum,
}
Описание полей
header
- Заголовок чекаsum
- сумма внесения
Используемые типы
Тип Withdraw
{
"header": ChequeHeader,
"sum": Sum
}
Описание полей
header
- Заголовок чекаsum
- сумма изъятия
Используемые типы
Тип Client_Withdraw
{
"header": ChequeHeader,
"sum": Sum,
"id": String?
}
Описание полей
header
- Заголовок чекаsum
- сумма выдачиid
- идентификатор операции
Используемые типы
Тип NewSumChequeRequest
{
"sum_cheque_data": SumChequeData,
"comments": Comments?,
"user_data: String?
}
Описание полей
sum_cheque_data
- Информация по чекуcomments
- Комментарии к операцииuser_data
- пользовательские данные, base64 строка не более 128 байт
Используемые типы
Тип SumChequeData
{
"header": TokenChequeHeader,
"sum": Sum,
"id": String?
}
Описание полей
header
- описание заголовка чекаsum
- сумма операцииid
- идентификатор операции
Используемые типы
Тип SaleRequest
{
"sale": NewSale,
"comments": Comments?
}
Описание полей
sale
- описание продажиcomments
- комментарии к чеку
Используемые типы
Тип NewSale
{
"header": TokenChequeHeader?,
"items": [ *Item ],
"payments": [ *Payment ],
"cheque_discount": Sum,
"cheque_markup": Sum,
"tp_tax_number: u32?,
"id": String?
}
Описание полей
header
- описание заголовка чекаitems
- массив товарных позицийpayments
- массив способов оплатcheque_discount
- скидка по чекуcheque_markup
- надбавка по чекуtp_tax_number
- УНП 3-го лицаid
- идентификатор операции
Используемые типы
Тип Sale
Сформированный чек продажи
{
"header": ChequeHeader,
"items": [ *CalculatedItem ],
"payments": [ *Payment ],
"change": Sum,
"sub_totals": SaleSubTotals,
"totals": SaleTotals,
"tp_tax_number": u32?
}
Описание полей
header
- Заголовок чекаitems
- массив рассчитанных товарных позиций чекаpayments
- массив оплат чекаrolled_back_by
- номер чека аннулирования, если данный документ был аннулированchange
- рассчитанная сдача по чекуsub_totals
- Под-итогtotals
- Итогtp_tax_number
: - УНП 3-го лица
Тип SaleSubTotals
{
"sum": Sum,
"cheque_discount": Sum,
"cheque_markup": Sum
"taxes": [ *TaxRateSum ]
}
Описание полей
sum
- сумма под-итога (сумма всех товарных позиций с учетом скидок по тов. позициям)cheque_discount
- скидка по чекуcheque_markup
- надбавка по чекуtaxes
- массив сумм в разрезе используемых в чеке НДС
Используемые типы
Тип SaleTotals
{
"sum": Sum,
"discount": Sum,
"markup": Sum
}
Описание полей
sum
- сумма к оплатеdiscount
- итоговая сумма скидки по чекуmarkup
- итоговая сумма надбавки по чеку
Используемые типы
Тип NewMoneyBack
{
"header": TokenChequeHeader,
"items": [ Items ],
"payments": [ *Payment ],
"id": String?
}
Описание полей
header
- заголовок чекаitems
- массив товарных позиций к возвратуpayments
- Массив способов возврата. В случае возврата типother
игнорируется.user_data
- пользовательские данные, base64 строка не более 128 байтid
- идентификатор операции
Используемые типы
Тип NewMoneyBackRequest
{
"money_back": NewMoneyBack,
"comments": Comments?
}
Описание полей
money_back
- информация для совершения операции возврата
Используемые типы
Тип MoneyBackTotals
{
"card": Sum,
"cash": Sum,
"other": Sum,
"sum": Sum
}
Описание полей
card
- сумма возврата безналичнымиcash
- сумма возврата наличнымиother
- сумма возврата другими способамиsum
- сумма возврата
Используемые типы
Тип MoneyBack
{
"header": ChequeHeader,
"items": [ *CalculatedItem ],
"payments": [ *Payment ],
"totals": MoneyBackTotals
}
Описание полей
header
- заголовок чекаitems
- тов. позиция с рассчитанными значениямиpayments
- массив сумм возвратаtotals
- рассчитанные итоги возврата
Используемые типы:
Тип NewRollback
{
"header": TokenChequeHeader,
"target_num": u32?,
"id": String?
}
Описание полей
header
- заголовок чека. Для данного запроса полеcurrency
игнорируется.target_num
- номер чека, который необходимо аннулировать. Используется для валидацииid
- идентификатор операции
Используемые типы
Тип NewRollbackRequest
{
"rollback": NewRollback,
"comments": Comments?
}
Описание полей
rollback
- информация для совершения операции аннулирования
Используемые типы
Тип RollbackTotals
{
"other": Sum,
"cash": Sum,
"card": Sum,
}
Описание полей
cash
- сумма аннулирования наличнымиcard
- сумма аннулирования безналичнымиother
- сумма аннулирования др. способами оплаты
Используемые типы
Тип Rollback
{
"header": ChequeHeader,
"totals": RollbackTotals
}
Описание полей
Используемые типы
Изменения от 2025-03-01
- Ошибки
- Дополнен раздел с пояснениями для версии 2.x
- Общее описание принципов взаимодействия
- Дополнено описание разделение ошибок для версии 2.x
- Список поддерживаемых заголовков
- Удалены устаревшие заголовки
- Идентификатор операции
- Операция больше не поддерживается в том же виде.
- Работа с СКО
- Удалены устаревшие методы и разделы
- Добавлено описание работы в случае версий 2.x+
- Служба (Windows)
- Раздел помечен для 1.8.х
- Удалены разделы и методы приостановки и возобновления отправки док-в
- Сервисы
- Для версии 2.х параметр
token
не является обязательным, если подключено 1 СКО
- Для версии 2.х параметр
- Получение версии ПО
- Добавлен пример для версии 2.x
- Обновлена информация о типе данных Version
- Авторизация (authorize)
- Убраны примеры неверных запросов и примеры ошибок (коды ошибок отличаются на 2.х и их кол-во увеличивается)
- Смена пин-кода (change_pin)
- Метод помечен для версии
1.8.х
. В2.х
отсутствует
- Метод помечен для версии
- logout
- Убраны примеры неверных запросов и примеры ошибок (коды ошибок отличаются на 2.х и их кол-во увеличивается)
- Добавлен тип FiscalResponse
- Выдача (client_withdraw)
- Убраны примеры неверных запросов и примеры ошибок (коды ошибок отличаются на 2.х и их кол-во увеличивается)
- Убраны осуществляемые проверки
- Добавлен пример возвращаемого ответа для v2.x
- Добавлено указание возвращаемого типа для v2.x
- Внесение (deposit)
- Убраны примеры неверных запросов и примеры ошибок (коды ошибок отличаются на 2.х и их кол-во увеличивается)
- Убраны осуществляемые проверки
- Добавлен пример возвращаемого ответа для v2.x
- Добавлено указание возвращаемого типа для v2.x
- Изъятие (withdraw)
- Убраны примеры неверных запросов и примеры ошибок (коды ошибок отличаются на 2.х и их кол-во увеличивается)
- Убраны осуществляемые проверки
- Добавлен пример возвращаемого ответа для v2.x
- Добавлено указание возвращаемого типа для v2.x
- Возврат (create_money_back)
- Убраны примеры неверных запросов и примеры ошибок (коды ошибок отличаются на 2.х и их кол-во увеличивается)
- Убраны осуществляемые проверки
- Добавлен пример возвращаемого ответа для v2.x
- Добавлено указание возвращаемого типа для v2.x
- Аннулирование (create_rollback)
- Убраны примеры неверных запросов и примеры ошибок (коды ошибок отличаются на 2.х и их кол-во увеличивается)
- Убраны осуществляемые проверки
- Добавлен пример возвращаемого ответа для v2.x
- Добавлено указание возвращаемого типа для v2.x
- Добавлена возможность передачи номера аннулируемого док-та для проверки соответствия с фронт-офисом
- Продажа (create_sale)
- Убраны примеры неверных запросов и примеры ошибок (коды ошибок отличаются на 2.х и их кол-во увеличивается)
- Убраны осуществляемые проверки
- Добавлен пример возвращаемого ответа для v2.x
- Добавлено указание возвращаемого типа для v2.x
- Убраны примеры мат. вычислений
- Закрытие смены (close_shift)
- Убраны примеры неверных запросов и примеры ошибок (коды ошибок отличаются на 2.х и их кол-во увеличивается)
- Открытие смены (open_shift)
- Убраны примеры неверных запросов и примеры ошибок (коды ошибок отличаются на 2.х и их кол-во увеличивается)
- Добавлено описание входных значений для версии v2.x
- Получение X-отчёта (get_x_report)
- Убраны примеры неверных запросов и примеры ошибок (коды ошибок отличаются на 2.х и их кол-во увеличивается)
- Получение копии Z-отчёта
- В
2.x
версии метод отдает информацию только в закрытой смене и только по последней закрытой смене. Передача номера смены не требуется
- В
- Открытие смены (create_sale)
- Убраны примеры неверных запросов и примеры ошибок (коды ошибок отличаются на 2.х и их кол-во увеличивается)
- Получение наличных в СКО (create_sale)
- Убраны примеры неверных запросов и примеры ошибок (коды ошибок отличаются на 2.х и их кол-во увеличивается)
- Печать счёта
- Изменен входящий тип данных
- Отмена заказа
- Изменен входящий тип данных
- Печать отложенного чека
- Метод устарел и не поддерживается. Помечен "только для версии" 1.8.x
- Получение самого старого док-та в СКО (get_oldest_document)
- Убраны примеры неверных запросов и примеры ошибок (коды ошибок отличаются на 2.х и их кол-во увеличивается)
- Получение номера первого и последнего док-та в смене
- Не поддерживается в 2.x
- Получение ранее фискализированного чека
- Не поддерживается в 2.x
- Получение кол-во неотправленных док-в
- Добавлено описание того, как формируется выходное значение
- ShiftState
- Добавлены поля
trade_point_information
иuser_data
- Добавлены поля
- TokenInformation2
- Добавлен тип
- Получение информации об СКО
- Убраны примеры неверных запросов и примеры ошибок (коды ошибок отличаются на 2.х и их кол-во увеличивается)
- Добавлено уточнение типа данных, возвращаемого на версии 2.x
- Получение СКО
- Убраны примеры неверных запросов и примеры ошибок (коды ошибок отличаются на 2.х и их кол-во увеличивается)
- Добавлено уточнение типа данных, возвращаемого на версии 2.x
- Получение номера след. док-та
- Убраны примеры неверных запросов и примеры ошибок (коды ошибок отличаются на 2.х и их кол-во увеличивается)
- Печать ранее фиск. док-та
- Убраны примеры неверных запросов и примеры ошибок (коды ошибок отличаются на 2.х и их кол-во увеличивается)
- Установка наименования торг. точки
- Метод помечен как для версии
1.8.0
. Недоступен, т.к. информация обязана запрашиваться от СККО
- Метод помечен как для версии
- Доп. возможности
- Добавлено описание доп. возможностей для версии
2.x
- Добавлено описание доп. возможностей для версии
Изменения от 2025-02-03
- Переменные окружения
- Упразднены
TSRV_REST_MODE
иOPERATOR_CODE
.
- Упразднены
- Ошибки
- Страница актуальна для версий
1.8.x
- Страница актуальна для версий
- Логирование
- Добавлен раздел для версии
2.0.x
- Добавлен раздел для версии
- Добавлен раздел CLI
- Настройки
- Добавлен раздел для версии
2.0.x
- Добавлен раздел для версии
- Менеджер СКО
- Добавлена ссылка на Настройки для версии
2.x.y
- Добавлена ссылка на Настройки для версии
- Работа с СКО
- Раздел помечен как используемый для версий
1.8.x
- Раздел помечен как используемый для версий
- Заказы - Создан раздел
Изменения от 2024-07-01
Устревшие страницы документации:
- Удалена страница Сессии
- Удалена страница Инициализация сессии
- Удалена страница Хэш-значение id сессии
- Удалена страница Очистка сессии
- Удалена страница Регистрация продажи (внутр. БД товаров)
- Удалена страница Регистрация отмен
- Удалена страница ik.service.storage
- Удалена страница Сохранение товара
- Удалена страница Удаление товара
- Удалена страница Получение товара
- Удалена страница Получение известных идентификаторов товаров
- Удалена страница Комментарии
- Удалена страница HeaderComments
- Удалена страница BlockComments
- Удалена страница SaleComments
- Удалена страница ItemsBlockComments
- Удалена страница PaymentsComments
- Удалена страница DWComments
- Удалена страница RollbackComments
- Удалена страница MoneyBackComments
- Удалена страница BillComments
- Удалена страница ReportComments
- Удалена страница CountersComments
- Удалена страница ZReportCopyRequest
- Удалена страница NewMoneyBackEx
- Удалена страница ExNewMoneyBackRequest
- Удалена страница Возврат (внутр. БД товаров)
- Удалена страница ExSaleRequest
- Удалена страница NewSaleEx
- Удалена страница Хранилище
- Удалена страница StorageItem
- Удалена страница CancelRequest
- Удалена страница CloseShiftData
- Удалена страница CloseShiftRequest
- Удалена страница ExtendedCounters
- Удалена страница ItemEx
Устаревшие запросы:
Работа с сессиями:
- удалено action
init_session
- удалено action
clear_session
- удалено action
get_active_session_hash
- удалено Header
sid
Работа с принтерами и отрисовкой чеков
- удалено Header
printer.code.policy
- удалено Header
repr.text
- удалено Header
repr.html
- удалено Header
dreceipt.emails
Кассовые операции:
- удалено поле
extra
- удалено action
on_cancel
- Тип
CancelRequest
- Тип
- удалено поле
target_num
для операцииcreate_rollback
- удален Тип
CloseShiftRequest
- удален Тип
CloseShiftData
- удален Тип
Комментарии:
- удалено поле
comments
- удален Тип
MoneyBackComments
- удален Тип
PaymentsComments
- удален Тип
ReportComments
- удален Тип
RollbackComments
- удален Тип
SaleComments
- удален Тип
- удален Тип
BlockComments
- удален Тип
HeaderComments
- удален Тип
ItemsBlockComments
Временно недоступны операции для Ресторанного режима:
- Тип
OrderRequest
- Тип
Order
- Тип
PayOrderRequest
- Тип
PrintBillRequest
Изменения:
- Для операции
create_money_back
полеItem
заменено наItems
и теперь принимает массив - Изменения в структуре полей типа
Items
:- добавлено поле
section
:- добавлено поле
code
, - добавлено поле
name
.
- добавлено поле
- изменено поле
code
:- удалено поле
type
, - удалено поле
value
, - добавлено поле
scan
.
- удалено поле
- добавлено поле
markup
- поле
discount
больше не принимает отрицательные значения
- добавлено поле
- Добавлено поле
cheque_markup
- Добавлено поле
tp_tax_number
- Для операции
close_shift
больше не требуется полеcashier
- Добавлено новый action в Header
create_client_withdraw
- операция Выдачи наличных - Изменения в поле
type_id
и ТипаChequeType
- новый тип
client_withdraw_v2
- изменено
deposit
->deposit_v2
- изменено
money_back
->money_back_v2
- изменено
rollback
->rollback_v2
- изменено
sale
->sale_v2
- изменено
withdraw
->cashier_withdraw_v2
- изменено
z_report
->z_report_v2
дляChequeType
- новый тип
- изменено
counters
->currency_counters
и состав данных в сменных счетчиках - поле
cashier
количество символов увеличено до 20
Ошибки
Добавлены ошибки:
AVQFR_BAD_DOCUMENT_FORMAT
= "bad document format"AVQFR_CH_WITHDRAW_MAX_SUM
= 'Сумма выдачи наличных держателю превышает максимально допустимую'AVQFR_CH_WITHDRAW_ONLY_BYN
= 'Выдача наличных держателю возможна только в белорусских рублях'AVQFR_MAX_DOC_COUNT_OVERFLOW
= 'Превышено максимальное количество документов в смене'AVQFR_TOO_MANY_ITEMS
= 'Превышено максимальное количество позиций в документе или размер документа слишком большой'CRT_MISSING_LEGAL_ADDR
= "missing legal address in certificate"TIN_ONLY_SALE_ROLLBACK
= "rollback can only be applied to sale"TIN_MARKING_QUANTITY_1
= "marking quantity should be 1"TIN_MULTIPLE_CASH_PAYMENTS
= "multiple cash payments"TIN_TOO_MANY_MARKING_CODES
= "too many marking codes"TIN_MULTIPLE_MARKING_CODES
= "multiple marking codes"TIN_MARKING_CODE_LEN
= "marking code len is exhausted"TIN_MARKING_CODE_WITHOUT_GTIN
= "marking code without gtin"TIN_TOO_MANY_DISCOUNTS
= "too many discounts"TIN_TOO_MANY_MARKUPS
= "too many markups"TIN_EMPTY_ITEMS
= "empty items"TIN_MISSING_LAST_SALE
= "Отсутствует последний документ продажи"
Удалены ошибки:
SM_SESSION_EXISTS
= "session already exists. remove existing session or restart app"SM_INVALID_SESSION
= "invalid session id"SM_SID_NOT_FOUND
= "session id was not found"
Изменение от 2022-08-31
- Обновлен раздел Заголовки
-
- Устарел заголовок
printer.escpos.required
- Устарел заголовок
-
- Добавлены заголовки
repr.*
- Добавлены заголовки
- Добавлен раздел Настройки
- Добавлен раздел Служба (windows)
- Обновлен тип SaleRequest
-
- Устарело поле
link
- Устарело поле
Пример ответа со всеми переданными заголовками repr.*
:
{
"type": "send",
"data": {
"header": {
"cashier": "Test",
"company_name": "ИП Моров А.М.",
"currency": "BYN",
"date_time": "2022-08-31T09:56:22.794436+03:00",
"device_id": 131010705,
"number": 10398,
"serial_number": "AVQ11031010705",
"shift_number": 878,
"tax_number": 191832203,
"trade_point_name": null,
"type_id": "deposit",
"uid": "1A5663901D4B4CE607CF1091"
},
"sum": "15.00",
"repr": {
"link": "https://receipts.test.imlab.by/?documentId=1A5663901D4B4CE607CF1091",
"esc_pos": "G3QRICAgICAgICAgICAgICAgICCIjyCMruCuoiCALowuICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgk42POiAxOTE4MzIyMDMgICAgICAgICAgICAgICAgIAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KG0UBICAgICAgICCNhSCfgoufhZKRnyCPi4CShYaNm4wghI6Kk4yFjZKOjCAgICAgICAgG0UACi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIISuquOspa3iIOClo6jh4uCg5qioIK6vpeCg5qioIKKtpeGlrajvICAgICAKICAgICAgICAgICAgICAgICAgICD8IDEwMzk4ICAgICAgICAgICAgICAgICAgICAgChtFAZCloy78IIqg4eHrOiAbRQAxMzEwMTA3MDUgG0UBh6CiLvwgkYqOOiAbRQBBVlExMTAzMTAxMDcwNQobRQGCoKvu4qA6IBtFAEJZTiAgICAbRQGErqot4iCnoKrg6+I6IBtFADMxLjA4LjIwMjIgMDk6NTY6MjIKG0UBiqDh4ajgOhtFAC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5UZXN0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQobRQGCraXhpa2uOhtFAC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uMTUuMDAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICCTiDogMUE1NjYzOTAxRDRCNENFNjA3Q0YxMDkxICAgICAgICAgIAobYTEdKGsDADFDAx0oawMAMUUxHShrGwAxUDAxQTU2NjM5MDFENEI0Q0U2MDdDRjEwOTEdKGsDADFRMAoKCgoKCh1WAQ==",
"html": " ИП Моров А.М. <br/> УНП: 191832203 <br/>------------------------------------------------<br/><b> НЕ ЯВЛЯЕТСЯ ПЛАТЕЖНЫМ ДОКУМЕНТОМ </b><br/>------------------------------------------------<br/> Документ регистрации операции внесения <br/> № 10398 <br/><b>Рег.№ Кассы: </b>131010705 <b>Зав.№ СКО: </b>AVQ11031010705<br/><b>Валюта: </b>BYN <b>Док-т закрыт: </b>31.08.2022 09:56:22<br/><b>Кассир:</b>.....................................Test<br/>------------------------------------------------<br/><b>Внесено:</b>...................................15.00<br/>------------------------------------------------<br/> УИ: 1A5663901D4B4CE607CF1091 <br/><br/>",
"text": " ИП Моров А.М. \n УНП: 191832203 \n------------------------------------------------\n НЕ ЯВЛЯЕТСЯ ПЛАТЕЖНЫМ ДОКУМЕНТОМ \n------------------------------------------------\n Документ регистрации операции внесения \n № 10398 \nРег.№ Кассы: 131010705 Зав.№ СКО: AVQ11031010705\nВалюта: BYN Док-т закрыт: 31.08.2022 09:56:22\nКассир:.....................................Test\n------------------------------------------------\nВнесено:...................................15.00\n------------------------------------------------\n УИ: 1A5663901D4B4CE607CF1091 \n\n"
}
}
}
Изменения от 2022-04-18
- Добавлено описание заголовка
dreceipt.emails
в разделе Заголовки - Добавлено описание заголовка
printer.style
в разделе Заголовки - Добавлено описание заголовка
printer.prefix
в разделе Заголовки - Добавлено поле
cash_in
в типе ShiftState - Исправлено описание поведения в методе получения наличных СКО
- Добавлено описание поля
link
в SaleRequest - Добавление описание заголовка
printer.escpos.required
в разделе Заголовки
Изменения от 2022-02-09
Документация:
- Исправлено описание входных данных при закрытии смены
- Добавлен тип CloseShiftData
- Исправлено описание в разделе Закрытие смены
- Добавлен пример с комментариями в разделе Закрытие смены
Изменения от 2022-02-02:
Документация:
- Добавлен ReportComments
- Добавлен CountersComments
- Добавлено поле
comments
в CloseShiftRequest - Добавлен раздел "Очередь печати" в Работа с принтером
- Добавлена возможность печати копии Z-отчёта
- Добавлен тип ZReportCopyRequest
- Добавлена информация о конфигурации менеджера СКО
- Добавлены пути лог-конфигов в раздел Логирование