Введение
Данный документ является Руководством Программиста, а так же Руководством Пользователя по использованию Программной Кассы.
В данной документации описан протокол, типы и ошибки, которые могут возникать при использовании протокола 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_salecreate_withdrawcreate_rollbackcreate_client_withdrawcreate_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,RIGHTsize- размер 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,CODE39content- содержимое штрих-кода в 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"
}
Ошибки
В случае возникновения ошибки, сервер отправит сообщения с типом 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.
Список поддерживаемых заголовков
СКО
token- серийный номер СКОtokens.refresh- обновление списка СКОrendering.sn- вывод Серийного номера СКО после QR УИ (true/false)
Работа с принтерами и отрисовкой чеков
printer.[usb|dummy]- заголовки и подзаголовки для работы с принтерамиprinter.spl-spl - symbols per line. Указание кол-ва символов в ширину на бумаге, на которой будет происходить печать. По умолчанию:48printer.cp866- указание номера таблицы символов в принтере соответствующий кодировкеCP866. По умолчанию -17printer.cp1251- указание номера таблицы символов в принтере соответствующий кодировкеCP1251. По умолчанию -18printer.feed- указание кол-во строк прокрутки бумаги после печати. По умолчанию:5printer.cut- принудительное отрезание бумаги после завершения печати. По умолчанию:trueprinter.prefix- данные для печати перед печатью основного чека. Может быть использовано для печати лого или изменении шрифта для последующей печатиprinter.code.skip- отображение кода товара на чеке. По умолчанию:true
Представление чеков
repr.esc_pos- отдавать в объекте фискального документа дополнительный объектreprс полемesc_pos, в котором находитсяesc_pos(base64) представление чекаrepr.text- отдавать в объекте фискального документа дополнительный объектreprс полемtext, в котором находится текстовое представление чекаrepr.link- отдавать в объекте фискального документа дополнительный объектreprс полемlink, в котором находится ссылка на эл. чек
Представление ответа
response.calculations- возвращает рузультаты расчетов по чеку в ответе (true/false)printer.reports.zero_payments- при установленном значенииtrueна печатном X/Z отчёте будет всегда выводиться информация о расшифровках базовых способов оплат (Наличными, Банк. Пл. Карта)
Важно!
Печатать чеки для клиентов, отданные в repr.text, repr.link категорически запрещается, из-за отсутствия в них QR кода с УИ!
Работа с принтером
Для использования принтера требуется передать наборы заголовков, в зависимости от желаемого способа использования принтера.
Общее
Печать осуществляется путем построчного формирования для последующей печати, добавлением стилей, преобразованием в набор EscPos команд и отправкой на принтер данных.
Т.к. позиционирование построчное и основано на максимальном кол-ве символов
в строке, имеется возможность передать кол-во символов для правильного
формирования чека под конкретные размеры путем передачи заголовка printer.spl.
Значение по умолчанию для данного заголовка - 48
Процесс вывода на печать выглядит следующим образом:
- Осуществляется подключение к печатающему устройству
- Совершается запрашиваемая операция
- Осуществляется вывод на печать сформированных данных
В случае возникновения ошибки на последнем этапе (вывод на печать),
возвращается ошибка со всеми данными по совершенной операцией в
поле op_data структуры.
Все данные передаются в кодировке CP866 и для корректного отображения данных
на бумажном чеке, требуется, чтобы в принтере кодировкой по умолчанию
была установлена кодировка CP866, либо требуется передача заголовка printer.cp866
Принтер выбирается на основе printer.* заголовков в следующей приоритетности:
USBDummy
Если заголовки первого принтера не были найдены - будет попытка найти следующий принтер.
Dummy принтер всегда имеет низший приоритет.
USB-принтер
Для работы с USB принтером требуется передача двух заголовков:
printer.usb.vendor- строковое представлениеvendorIdустройстваprinter.usb.product- строковое представлениеproductIdустройства
Перед любой операцией печати с использованием USB принтера,
программная касса “забирает” контроль над USB устройством. В случае,
если программной кассе не удалось этого сделать, будет возвращена ошибка
с префиксом USB_
В случае, если требуется вывести какую-то информацию на принтер до или после печати - USB устройство доступно для подключения соответственно ДО выполняемой операции и после ее завершения
Очередь печати Windows
Данный способ работает только на ОС Windows с принтерами, которые поддерживают печать через очередь печати.
Для отправки чека в очередь печати требуется передача заголовка printer.spool.name с указанием
наименования принтера/очереди печати.
Dummy-принтер
Данный тип принтера не выводит ничего на печать. Для задействования требуется передача заголовка
printer.dummy с любым значением
Работа с СКО
Для работы с СКО не требуется дополнительных настроек.
В случае компрометации устройства, либо по решению РУП ИИЦ МНС или Оператора Программной Кассы СКО может быть заблокировано для совершения всех фискальных операций.
При попытке совершения фискальных в случаях, приведенных в абзаце выше,
будет возникать ошибка avtpcr.status.blocked.
В случае, если статус СКО устарел (Отсутствовала синхронизация с сервером более 7 дней),
будет возвращаться ошибка avtpcr.status.sync-required.
Для синхронизации с сервером требуется вызвать Обновление статуса. При первом запуске ПО и нахождении СКО требуется обязательное подключение к интернету, для получения данных об СКО и его конфигурации.
В случае, если конфигурация не удалась или не завершилась (отсутствие интернета или другие причины),
при попытке совершения фискальных операций будет возвращена ошибка avtpcr.not-configured.
Автоматическая попытка конфигурации СКО осуществляется раз в 2 секунды.
При последующих запусках, если данные не устарели и присутствуют, конфигурация может осуществляться без наличия интернета
Определить состояние работы с СКО можно путем запроса Данных об СКО.
Поля is_configured и is_compatible должны быть установлены в значение true, а status.block_reasons должен быть пустым
Обновление списка СКО
Важно помнить, что список доступных СКО обновляется в ручном режиме,
путем передачи заголовка tokens.refresh со значением "true".
Обновление списка так же может вести к потенциальным блокировкам и замедлению работы, т.к. происходит поиск СКО с последующей проверкой регистрационных данных СКО, которое точно так же блокирует возможность мгновенно совершить действие с СКО.
Исходя из изложенного выше, стоит передавать tokens.refresh исключительно
в том случае, если СКО не было найдено, либо по какой-то причине команда
отдала ошибку TSRV_TOKEN_NOT_FOUND
Переменные окружения
2.0.x
TSRV_ADDR- адрес, который будет слушаться HTTP сервером. По умолчанию -127.0.0.0:1828
Логирование
Пример файла логгирования с ротацией по дням:
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
# Логировать ответы и запросы
loggers:
srv::router::with_debug:
level: debug
Важно: В случае установки как службы, в поле path необходимо указывать абсолютный путь путь к файлу логирования.
Настройки:
- Путь по умолчанию:
./configs/log.yaml - Путь к файлу может быть настроен с помощью аргументов при запуске ПО
- Например:
tsrv --logs-config C:/tsrv/log-config.yaml
- Например:
Конфигурация Менеджера СКО
См Настройки
Настройки
Настройки:
trade_pointinformation- доп. информация о торговой точке для печати
tokens- настройки работы с СКО{СЕРИЙНЫЙ_НОМЕР_СКО}- указывается серийный номер СКОauto_login-true | false- флаг, для автоматической авторизации в СКО. Попытка авторизации совершается 1 раз, как только найдено СКОpin_code- значение пин кода для авторизации. Требуется при указанииauto_login
headersdefaults- перечисление заголовком по умолчанию
serveraddr- указание адреса и порта, который будет слушать ПО
rendererreplacements{кодировка}- указывается кодировка, либоcp866, либоcp1251- Список символов для замены
char- одиночный символ для заменыwith- символ, на который заменять
- Список символов для замены
comments- комментарии, которые будут печататься на всех док-тах продажиbefore- До чека- Список объектов
after- После чека- Список объектов
extra- дополнительные параметры отчётов
reformat_non_1_marking_quantity- (true/false) работает при указании в настройках и включении дополнительного параметра для УНП на бэкэнде. Позволяет принимать количество для маркированного весового товара не кратно 1, с пересчетом стоимости товара и отображением на печатном чеке. (в СККО уходит значение количества = 1, а цена согласно пересчета)
Пример файла настроек:
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:1828
renderer:
extra: ["income", "discounts", "markups", "saleItemPrepayments"]
replacements:
# Кодировка
cp866:
# char - символ, который заменять
# with - на что заменять
- char: '«'
with: '"'
- char: '»'
with: '"'
comments:
before:
- kind: text
dw: true
content: |
Добро пожаловать и спасибо, что выбрали магазин "У Лукоморья"!
С рождеством и новым годом!
after:
- kind: qr
content: 'aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS8='
size: 5
- kind: text
text: |
Скидка на бесплатный кофе!
- kind: barcode
content: 'MTIzNDU2Nzg5MA=='
width: 5
height: 5
format: code128
Установка TSRV как сервиса (службы) Windows
- Установить tsrv как сервис
- Рядом с tsrv.exe создать файл по имени install.bat со следующим содержимым:
cd %~dp0 .\tsrv.exe --install-service pause- Запустить
install.batот администратора
- Альтернативный способ:
- Запустить
cmd.exeот Администратора - Выполнить
c:\путь\к\tsrv.exe --install-service
- Запустить
- Проверить, что сервис успешно запустился:
sc query tsrv-native- В случае, если сервис не в статусе
RUNNINGнеобходимо посмотреть логи сервиса
Важно! Служба автоматически не создаёт файл настроек и конфигурации логирования.
Логи сервиса
- Настройка логирования сервиса находятся в файле
.configs/log.yaml, подробнее в разделе Логирование
Конфигурация сервиса
- Конфигурация сервиса находится в файле
.configs/settings.yaml, подробнее в разделе Конфигурация
Общее описание принципов взаимодействия
Пример взаимодействия с СКО
- Получение СКО с передачей заголовка
tokens.refreshсо значениемtrue, как описано в разделе Работа с СКО - Авторизация
- Получение состояния СКО с целью проверки, открыта ли смена
- Если смена закрыта - Открытие смены
- Внесение
- Продажа
- Аннулирование
- Возврат
- Изъятие
- Выдача
- Закрытие смены
Обработка ошибок
Ошибки разделяются на подтипы, на основании используемых префиксов, например:
$.avtpcr.*- ошибки, которые отдаются от СКО или связаны с внутренней работой с СКО, например:$.avtpcr.not_authorized- Не пройдена авторизация в СКО$.avtpcr.space.insufficient- Недостаточно памяти в СКО для записи данных
$.io.*- ошибки, связанные с передачей данных из/в СКО$.transport.*- ошибки, связанные с обработкой данных от СКО$.internal.*- ошибки, связанные с внутренними особенностями реализации протоколов взаимодействия с ПК. В случае возникновения ошибок такого рода стоит сообщать операторуavtpcr.*- ошибки связанные с несоблюдением требований при взаимодействии с ПК. Например:avtpcr.status.blocked- Касса заблокированаavtpcr.bundle.unique_id.length- Превышена макс. длина уникального идентификатора для чека
rendering.*- ошибки, связанные с отрисовкой или печатью данныхsko.core.receipt.*- ошибки, связанные непосредственно с функционалом ПК, который отвечает за обработку и формирование кассовых документовorders.*- ошибки работы с функционалом обслуживания за столиками
Command Line Interface
Usage: tsrv [OPTIONS] [COMMAND]
Commands:
upgrade-sko Запустить проверку и установку обновлений СКО. Требуется передача PUK кода для обновления
analyze Запустить анализ СКО
detach-avtpcr Перезапустить все найденные AvTPCR устройства
help Print this message or the help of the given subcommand(s)
Options:
--install-service
Установить TSRV как службу. Доступно только для Windows.
--logs-config <LOGS_CONFIG>
Путь к файлу с настройками логгирования. По умолчанию: './configs/log.yaml'
--data-dir <DATA_DIR>
Путь к папке, в которой будут находиться данные. По умолчанию: './tstorage'
--settings-config <SETTINGS_CONFIG>
Путь к файлу настроек. По умолчанию: './configs/settings.yaml'
-h, --help
Print help
-V, --version
Print version
Дополнительные возможности при фискализации
Для перечисленных ниже операций доступны доп. возможности:
create_salecreate_withdrawcreate_rollbackcreate_client_withdrawcreate_money_backpay_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 штук
Данные хранятся внутри СКО, соответственно объем данных может повлиять на скорость фискализации.
Отображение маркировки в чеке (expand_marking_items)
Позволяет управлять отображением маркировки в печатном чеке, построчно, по умолчанию включено (true)
* - Функционал на стадии разработки
Транспортный уровень
Данный раздел будет дополняться поддерживаемыми транспортными протоколами.
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 - Длина поля
cashierне превышает20символов
Проверка суммы
Список проверок
valueимеет не более2знаков после запятойvalueявляется положительным числомvalueне превышает максимального значения
Проверка скидки и надавки тов. позиции
Список проверок
discountиmarkupимеет не более2знаков после запятойdiscountиmarkupнаходится в интервале от-549755813887.99до549755813887.99включительно
Проверка наименования тов. позиции
Важно: перед началом проверки удаляются пробелы в начале и конце строки.
Осуществляемые проверки
- Длина
nameне равна 0 - Длина
nameне превышает 128 символов
Проверка способов оплат и сдачи
Осуществляемые проверки
cash + cashless + otherбольше, либо равно суммеК оплатепо чекуcashless + otherменьше, либо равно суммеК оплатепо чекуcashless + otherравно суммеК оплатепо чеку и сумма оплат наличными равна0. Обьяснение: если сумма наличных и безналичных платежей равна требуемой сумме к оплате, то нет возможности дать сдачу, а значит сумма наличных должна быть равна 0.change(сдача) должна быть больше либо равна0
Правила округления
Все значения, имеющий тип Sum и требующие округления, округляются в 2 этапа:
- Округление до 3 знаков в сторону 0 (было:
1.2356, стало:1.235) - Округление до 2 знаков, по правилам математики
- Пример 1. было:
1.235, стало:1.24 - Пример 2. было:
1.234, стало:1.23
- Пример 1. было:
Все поля, требующие округления, описаны в соответствующих запросах, либо описании полей.
Последовательность расчетов для магазинов беспошлинной торговли:
- При добавлении товара, цена отображается в чеке в BYN;
- Предоставляется возможность оплаты в любой используемой валюте и их комбинации;
- Порядок действий после каждого внесения суммы оплаты**:
- конвертация суммы остатка к оплате по чеку в валюту внесенной оплаты;
- вычитание внесенной суммы из результата конвертированной суммы по чеку;
- обратное приведение суммы остатка по чеку к базовой валюте (BYN);
- суммы остатка к оплате и сдачи округляются до 2х знаков после запятой после каждого последующего внесения суммы;
** Если стоимость чека не закрыта действия повторяются в цикле от остатка в BYN последовательно для каждой валюты оплаты.
Формирование и передача документов для магазинов беспошлинной торговли
- Документы Продажа, Возврата и Аннулирования формируется в базовой валюте BYN:
- В СККО и на печатном форме документы будут содержать данные, приведенные к одной валюте – BYN
- Документы Внесения и Изъятия формируются в валюте совершаемой операции:
- В СККО и на печатной форме документы будут содержать данные о средствах в тех валютах, в которых осуществлялись кассовые операции (без приведения к одной валюте – BYN)
- Z-отчет формируется по каждой валюте отдельно:
- Документы Продажа, Возврата и Аннулирования в СККО и на печатной форме отражаются в BYN;
- Документы Внесения и Изъятия в СККО и на печатной форме отражаются в соответствии с валютой операции;
Сервисы
Сервисы представляют собой наборы функций, агрегированные по назначению.
Название каждого сервиса (например - app) передается в поле
address клиентского сообщения. Сервер, в свою очередь, передает
обработку данного сообщения “сервису”, с указанным наименованием,
который в свою очередь пытается найти функцию для вызова на основании
заголовка action. Стандартные сервисы, описанные в данном документе,
преобразуют значение поля action в camel_case вне зависимости от
переданного значения.
Напоминание: поле action может быть передано с любой политикой
наименования, для сервисов, описанных в данной документации.
Важно: термин “возвращаемое значение” подразумевает под собой данные,
передающиеся в поле data ответа сервера.
Все сервисы в данном разделе, которые взаимодействуют с конкретным СКО, принимают следующие заголовки:
token- серийный номер СКО. В случае, если подключено 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"
}
}
Ответ
{
"type": "send",
"data": {
"version": "2.0.1",
"kind": "tsrv",
"build": "20250225.075316"
}
}
Работа с принтерами
request
Метод позволяет послать данные на принтер и опционально ожидать ответа на ту или иную команду.
Входные данные: EscPosReq
Возвращаемые данные:
- Error - если произошла ошибка чтения/записи при работе с принтером
String-base64представление ответа, если имеетсяnull- если в полеreply_sizeзапроса отсутствует или имеет значение0
ik.service.token
Данный сервис предназначен для получения информации об СКО.
get_tokens
Данный метод предназначен для получения информации о доступных СКО.
Данный метод не требует передачи поля data в сообщении.
Возвращаемое значение: Массив значений TokenInformation
Важно: данный метод сканирует список USB-устройств автоматически при вызове, вне зависимости от того, было ли найдено СКО или нет. После сканирования СКО попадает в список доступных к использованию.
Примеры
Запрос:
{
"type": "send",
"address": "ik.service.token",
"reply_address": "example",
"data": null,
"headers": {
"action": "get_tokens"
}
}
Ответ:
{
"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_token_by_serial
Данный метод предназначен для получения информации об СКО по серийному номеру.
Необходимость во входных данных отсутствует, однако серийный номер требуется к
передаче в заголовке token. (в версии v2.x заголовок опционален, если подключено только 1 СКО)
Так же, опционально может быть передан заголовок tokens.refresh
со следующими значениями:
"true"- будет совершено обновление сканирование USB-устройств"false"(по умолчанию) - сканирование USB-устройств совершено не будет
Возвращаемое значение: TokenInformation
Примеры
Пример успешного выполнения
Запрос с заголовком tokens.refresh:
{
"type": "send",
"address": "ik.service.token",
"reply_address": "example",
"data": null,
"headers": {
"action": "get_token_by_serial",
"tokens.refresh": "true",
"token": "AVQ11031010703"
}
}
Ответ:
{
"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
print_prev_receipt
Получение и печать ранее фискализированного документа.
Входные данные: ReceiptRequest
Возвращаемые данные:
null- если чек не найден- [FiscalResponse) - если чек найден
Важно: Данный метод требует авторизации в СКО.
Важно: если data.shift_number передано значение null требуется наличие
открытой смены
Важно: для данного запроса требуются заголовки для работы с принтером
Пример запрос:
{
"address": "ik.service.token",
"headers": {
"action": "print_prev_receipt",
"printer.usb.vendor": "0x0471",
"printer.usb.product": "0x0055",
"printer.feed": "2",
"tokens.refresh": "true",
"printer.debug": true
},
"type": "send",
"data": {
"shift_number": 59,
"number": 242
}
}
Ответ (успех)
{
"type": "send",
"data": {
"repr": {
"text": "Добро пожаловать и спасибо, что выбрали магазин \n\"У Андрея Кирилловича\"! \nС рождеством и новым годом! \n ООО \"АйЭмЛэб\" \n Офис Скорины \n г. Минск УЛ. СКОРИНЫ ФРАНЦИСКА, 8 \n Время работы магазина зависит только от вас: \n Пн-Пт: 10:00-20:00 \n Сб-Вс: 10:00-18:00 \nУНП 193141246 РН СККО 119026738\n Не является платежным документом \n Документ внесения \n N док. 343 \n------------------------------------------------\nСумма: 100.00\n------------------------------------------------\nКассир: Test 04.11.2025 17:55:55\n УИ D756D6D53709586B07183432 \n Скидка % на бесплатный кофе! \n\n",
"link": "https://receipts.cloud.stage.imlab.by/render/D756D6D53709586B07183432"
},
"unique_id": "123774",
"header": {
"uid": "D756D6D53709586B07183432",
"number": 343,
"date_time": "2025-11-04T17:55:55.352882+03:00",
"shift_number": 104
},
"errors": null
}
}
get_minmax_receipts
Получение информации о первом и последнем известном документе в рамках текущей, либо одной из предыдущих смен.
Входные данные:
null- получение чеков в текущей сменеu16- номер смены, из которой требуется получение номеров первого и последнего документа
Возвращаемые данные:
AVQFR_SHIFT_IS_CLOSED- если переданоnullво входных данных и смена закрытаAVQFR_SESSION_NOT_AUTHORIZED- если не пройдена авторизация в СКО- MinMaxReceipts - в случае успеха
set_trade_point_info
Входные данные:
{
"content": "TradePointInformation"
}
TradePointInformation- указывается режим работы торгового объекта, контактные данные (телефон) и другое
firmware
Добавлены эндпоинты для обновления прошивки СКО.
⚠️Важно! Этот процесс достаточно чувствительный к питанию СКО
⚠️При отключении питания СКО может стать неисправно
⚠️Процесс может занять до нескольких минут времени. Ответ на запрос будет выдан только по завершении обновления.
⚠️После завершения обновления СКО “переподключается”, соответственно без передачи заголовка tokens.refresh со значением true будет не найдено.
Проверить совместимость tsrv c версией СКО можно следующим образом:
- Запросить информацию об СКО: Получение СКО
- В ответе извлечь поле
is_compatible. В случае, если версия ПО несовместима с версией прошивки СКО, значение будет равноfalse
Перед обновлением стоит убедиться, что прошивка доступна: 1.
{
"address": "ik.service.token.firmware",
"headers": {
"action": "check",
},
"data": null,
"type": "send"
}
Ответ следующего формата:
{
"type": "send",
"data": {
"version": "1.17" <--- или `null`, если прошивка отсутствует
}
}
В случае, если is_compatible == false и в ответе на наличие обновления прошивки пришел null в поле version, следует обратиться в соответствующий интеграционный чат с предоставлением информации о рег. номере и серийном номере СКО.
Процесс обновления прошивки через эндпоинты выглядит следующим образом:
- Требуется авторизация по PUK коду:
{
"address": "ik.service.token.authority",
"headers": {
"action": "authorize",
"tokens.refresh": true
},
"type": "send",
"data": {
"puk": "12345678"
}
}
⚠️Если авторизация по пин-коду была пройдена, требуется сделать logout
- Выполнить запрос на обновление прошивки:
{
"address": "ik.service.token.firmware",
"headers": {
"action": "upgrade",
"tokens.refresh": "true"
},
"data": null,
"type": "send"
}
В ответ будет отдан ответ в формате:
{
"type": "send",
"data": {
"version": "1.17" <--- Либо null, если обновление не найдено
}
}
⚠️ Этот этап может занять существенно времени в зависимости от ряда условий: интернет соединение, скорость и стабильность USB порта. Важно, что на этом этапе отключение tsrv, перезапуск ПК или отключение СКО в том числе из-за сбоя питания недопустимо и может привести к полной неисправности СКО
- После получения ответа СКО будет переподключено и можно выполнить авторизацию по пин-коду. При авторизации рекомендуется передать
tokens.refreshсо значением true для поиска СКО среди USB устройств
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
}
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
Данный метод предназначен для открытия смены.
Входные данные: OpenShiftRequest
{
"mode": "default" | "restaurant" | null
}
mode- Необязательный параметр для работы в режиме ретейла.
Возвращаемые данные:
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-отчета.
Входные данные:
null
Возвращаемые данные:
Важно: требуется авторизация
Важно: : Метод доступен только в закрытой смене и отдает информацию только о последней закрытой смене
ik.service.token.deposit
create_deposit
Входные данные: NewSumChequeRequest
Возвращаемые данные: 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"
}
Ответ:
{
"type": "send",
"data": {
"repr": {
"text": "Добро пожаловать и спасибо, что выбрали магазин \n\"У Андрея Бракодела\"! \nС рождеством и новым годом! \n ООО \"АйЭмЛэб\" \n Офис Скорины \n г. Минск УЛ. СКОРИНЫ ФРАНЦИСКА, 8 \n Время работы магазина зависит только от вас: \n Пн-Пт: 10:00-20:00 \n Сб-Вс: 10:00-18:00 \nУНП 193141246 РН СККО 119026738\n Не является платежным документом \n Документ внесения \n N док. 359 \n------------------------------------------------\nСумма: 100.00\n------------------------------------------------\nКассир: Test 05.11.2025 17:23:12\n УИ 78E24333F1D9399507183432 \n Скидка % на бесплатный кофе! \n\n",
"link": "https://receipts.cloud.stage.imlab.by/render/78E24333F1D9399507183432"
},
"header": {
"uid": "78E24333F1D9399507183432",
"number": 359,
"date_time": "2025-11-05T17:23:12.498732+03:00",
"shift_number": 112
},
"errors": null
}
}
ik.service.token.withdraw
create_withdraw
Входные данные: NewSumChequeRequest
Возвращаемые данные: 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"
}
Ответ:
{
"type": "send",
"data": {
"header": {
"uid": "EEBAE74068406C4509894303",
"number": 362,
"date_time": "2025-03-01T18:54:35.761641+03:00",
"shift_number": 78
},
"errors": null
}
}
create_client_withdraw
Входные данные: NewSumChequeRequest
Возвращаемые данные: 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"
}
Ответ:
{
"type": "send",
"data": {
"header": {
"uid": "598813A9ECD7CB4B09894303",
"number": 356,
"date_time": "2025-03-01T17:25:14.490005+03:00",
"shift_number": 78
},
"errors": null
}
}
ik.service.token.sales.retail
create_sale
Данный метод предназначен для совершения операции продажи.
Входные данные: SaleRequest
Возвращаемые данные: 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"
}
Ответ:
{
"type": "send",
"data": {
"repr": {
"link": "https://receipts.cloud.stage.imlab.by/render/60061721731D714C07183432"
},
"header": {
"uid": "60061721731D714C07183432",
"number": 344,
"date_time": "2025-11-04T18:25:31.139989+03:00",
"shift_number": 104
},
"errors": null
}
}
ik.service.token.moneyback
create_money_back
Операция возврата.
Входные данные: NewMoneyBackRequest
Возвращаемые данные: 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"
}
Ответ:
{
"type": "send",
"data": {
"header": {
"uid": "20DDAEBDBD0A31E309894303",
"number": 357,
"date_time": "2025-03-01T17:40:45.794886+03:00",
"shift_number": 78
},
"errors": null
}
}
ik.service.token.rollback
create_rollback
Операция аннулирования
Входные данные: NewRollbackRequest
Возвращаемые данные: 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"
}
Ответ:
{
"type": "send",
"data": {
"header": {
"uid": "F9BC5D1B0A3D061709894303",
"number": 359,
"date_time": "2025-03-01T17:50:25.365454+03:00",
"shift_number": 78
},
"errors": null
}
}
Ресторанный режим
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 будет изменен на Other |
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",
"comments": Comments?
}
В поле id передается идентификатор заказа для печати счёта
Используемые типы
Ответ:
{
"type": "send",
"data": {
"number": 43,
"errors": null
}
}
number- сформированный / присвоенный номер счёта
Типы данных
Errors
| Поле | Тип | Примечание |
|---|---|---|
printing | Error? | Ошибка печати |
storage | Error? | Ошибка работы с хранилищем данных |
Error
| Поле | Тип | Примечание |
|---|---|---|
name | String | Код ошибки |
description | String | Текст ошибки |
Тип extra
[
"income", "discounts", "markups", "saleItemPrepayments"
]
Описание полей
income- накопленный оборотdiscounts- скидкиmarkups- надбавкиsaleItemPrepayments- авансовые платежи
Тип Version
{
"version": "2.0.1",
"kind": "tsrv",
"build": "20250225.075316"
}
version- Версия ПКkind- Тип ПКbuild- Версия сборки API-слоя (tsrv)
Поле version отдается в формате SemVer.
Результат выполнения фискальной операции
{
"repr": Repr?,
"unique_id": String?,
"header": {
"uid": String,
"number": Int,
"date_time": String,
"shift_number": Integer
},
"errors": Errors?
}
Поля:
| Поле | Тип | Примечание |
|---|---|---|
repr | Repr? | Результаты отрисовки чека и прочие доп. данные |
unique_id | String? | Может отсутствовать. Уникальный ID операции |
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?
"extra": Extra?
}
Тип CloseShiftRequest
{
"comments": Comments?
}
Описание полей
comments- Comments
Тип 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 -
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- наименование торговой точки (отсутствует, если не было установлено)
Пример:
{
"type": "send",
"data": [
{
"device_id": 119026738,
"operator_code": 910000001,
"organization": "Общество с ограниченной ответственностью \"АЙЭМЛЭБ\"",
"pin_code_length": 6,
"puk_code_length": 8,
"serial": "AVQ11159990839",
"tax_number": 193141246,
"is_configured": true,
"is_compatible": true,
"version": "1.17.643",
"status": {
"last_update": "2025-11-05T18:46:09.192369818+03:00",
"block_reasons": []
},
"server_config": {
"last_update": "2025-11-05T18:48:10.816893147+03:00",
"chw_max_value": 21000,
"trade_point": {
"addr": "г. Минск УЛ. СКОРИНЫ ФРАНЦИСКА, 8",
"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"
}
Тип MinMaxReceipts
{
min: u32,
max: u32
}
Описание полей
min- номер первого документа в сменеmax- номер последнего документа в смене
Пример
{
"min": 5981,
"max": 5981
}
Тип 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
Тип 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-отчете всегдаnulldevice_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- счетчик аннулирования УКЗ
Используемые типы:
Тип TaxRate
enum имеющий следующие поддерживаемые значения:
tax0tax10tax20tax25
Пример:
"tax0"
Тип TokenChequeHeader
{
"cashier": String,
"currency": Currency?
}
Описание полей
cashier- имя кассира. Не может превышать 20 символов длинной, не может быть пустым. Пробелы в начале и конце строки удаляются и таким образом гарантируется, что не будет передано пустое имя кассираcurrency- Валюта совершаемой операции, если не передано -byn
Используемые типы
Тип Items
{
"id": String?,
"price": Sum,
"quantity": Quantity,
"discount": Sum?,
`discount_info`: Discount_info?
"markup": Sum?,
`markup_info`: Markup_info?
"code": ItemCode,
"section": ItemSection,
"name": String,
"tax_rate": TaxRate?
}
Важно!: Поле name поддерживает только символы кодировки CP1251.
Описание полей
id- клиентский идентификатор товарной позиции, на текущий момент не используется сервисомprice- Цена товарной позиции за 1 единицуquantity- Кол-во товарной позицииdiscount- Скидка товарной позиции. В случае, если скидка не должна быть применена, должно быть передано значение nullmarkup- Надбавка товарной позиции. В случае, если надбавка не должна быть применена, должно быть передано значение nullcode- Описание Кода товарной позицииsection- Описание Секции товарной позицииname- Наименование товарной позиции. Не может быть пустым. Максимальная длина: 128 символовtax_rate- НДС. Важно помнить, что НДС0 и отсутствие НДС - разные вещи.discount_info/markup_infoНаименования скидок/надбавок - позволяет указывать наименования и ключи группировки скидок/надбавок
Используемые типы
Тип 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?,
"currency": String?
}
Описание полей
payment_type- Тип платежаname- Наименование платежа. Может отсутствоватьvalue- Сумма платежаref- Идентификатор платежного средства. Является опциональным полем и может быть использовано для идентификации RRN банковской транзакции, информации о банковском платеже, либо номере сертификатаcurrency- Валюта способа оплаты (применяется только в магазинах беспошлинной торговли)
Используемые типы
Change
Тип Change
{
"currency": String?,
"sum": Sum
}
Описание полей
currency- Валюта сдачиsum- Сумма сумма сдачи
Используемые типы
Тип Dfs
{
"customer": String?,
"doc_number": String?,
"train": String?,
"flight": String?
}
Описание полей
customer- Собственное имя и фамилия покупателя. Может отсутствоватьdoc_number- Номер документа для выезда за границу. Может отсутствоватьtrain- Номер поезда. Может отсутствоватьflight- Номер авиарейса. Может отсутствовать
Тип PaymentType
enum имеющий следующие поддерживаемые значения:
cashcashlessother
Пример:
"cashless"
Тип Quantity
Данный тип представляет собой значение, с плавающей точкой, представленное в строковом виде.
В случае, если данное значение фигурирует во входных данных, оно обязано
содержать 3 знака после запятой (иметь формат X.XXX), даже если последние
равны 0 (например: 12345.000)
На данный тип наложен ряд ограничений:
- Максимальное значение:
16777.215 - Минимальное значение:
0
Данные ограничения продиктованы ограничениями протокола СККО.
Пример валидного значения Quantity:
"12345.607"
Тип DiscountInfo
Скидка
"discount_info": {
"name": String?
}
Надбавка
"markup_info": {
"name": String?
}
Описание полей
name - не обязательное поле, наименование скидки/надбавки
Тип State
{
"last_uid": UID,
"shift_state": ShiftState?
}
Описание полей
last_uid- УИ последнего документаshift_state- информация о смене. Отсутствует в случае, если смена закрыта
Используемые типы
Тип Status
Возможные значения:
enum имеющий следующие поддерживаемые значения:
unknownactiveblocked
Пример:
"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- Информация о торговой точке
Внесение/Изъятие/Выдача
Тип 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?,
"change": [ *Change* ]?,
"dfs": Dfs?
}
Описание полей
header- описание заголовка чекаitems- массив товарных позицийpayments- массив способов оплатcheque_discount- скидка по чекуcheque_markup- надбавка по чекуtp_tax_number- УНП 3-го лицаid- идентификатор операции
Дополнительные поля. Применяется только в магазинах беспошлинной торговли
change- массив сумм и валют сдачиdfs- иная обязательная информация
Используемые типы
Возврат
Тип 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- информация для совершения операции возврата
Используемые типы
Аннулирование
Тип NewRollback
{
"header": TokenChequeHeader,
"target_num": u32?,
"id": String?
}
Описание полей
header- заголовок чека. Для данного запроса полеcurrencyигнорируется.target_num- номер чека, который необходимо аннулировать. Используется для валидацииid- идентификатор операции
Используемые типы
Тип NewRollbackRequest
{
"rollback": NewRollback,
"comments": Comments?
}
Описание полей
rollback- информация для совершения операции аннулирования
Используемые типы
Открытие смены
Тип OpenShiftRequest
{
"mode": Mode?
}
Возможные значения mode. Необязательное поле:
defaultилиnull- режим смены ретейлrestaurant- режим смены ресторан (обслуживание за столиками)dfs- режим смены МБТ (магазин беспошлинной торговли)
Используемые типы
Тип ModeDfs
{
"kind": Kind?,
"rates": Rates?
}
Описание полей
kind- тип смены МБТrates- курсы валют в смене
Возможные значения Kind:
0- указывается для магазинов типа 1 и магазинах типа 31- указывается для магазинов типа 2
Используемые типы
Тип Rates
{
"USD": {
"sum": Sum,
"per": Per
}
}
Описание полей
currency- указывается валюта для применения заданных курсовsum- значение курса валютыper- количество единиц иностранной валюты,
- Для работы в режиме магазина беспошлинной торговли (МБТ), при каждом открытии смены требуется ввести курсы валют:
- Значение устанавливается для каждой валюты отдельно в эквиваленте добавленных валют с бэкофиса кассы с указанием суммы валюты при пересчете курса (за 1, 10, 100);
- Курсы устанавливаются в BYN и передаются с 4 знаками после запятой;
Возможные значения Per:
110100
Используемые типы
Changelog
Изменения от 2025-12-15
- Удалены разделы, относящиеся к версии
1.8.x - Добавлены типы относящиеся к режиму МБТ:
- В NewSale добавлены поля для режима МБТ
- Для Windows добавлена команда
detach-avtpcr, подробнее в CLI - Добавлена информация про правила округления в режиме МБТ в Проверки
- Добавлены эндпоинты для обновления прошивки СКО в Firmware
- Добавлена возможность передавать наименования скидок/надбавок в Item
- Добавлена возможность вывода кол-ва и суммы авансовых платежей в X/Z-отчётах
Изменения от 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
- Добавлена информация о конфигурации менеджера СКО
- Добавлены пути лог-конфигов в раздел Логирование