← API Reference Протокол передачи данных с ККМ на сервер ОФД
Низкоуровневый протокол обмена между ККМ и сервером ОФД. Для интеграции через REST используйте API Reference — поля чеков (TicketRequest) и отчётов соответствуют этому протоколу.

Протокол передачи данных

с контрольно-кассовых машин с функцией фиксации и (или) передачи данных на сервер операторов фискальных данных

Оглавление

№ п.п.

Наименование разделов/подразделов

Номера страницe

Общая информация

3

Структура сообщений

3

Сообщения

3

Заголовки сообщений

3-5

Коды команд

5

Коды ответов

5-9

Структура запроса к серверу

9-10

Структура ответа сервера

10-11

Сообщения

11

Служебный обмен

11

Инициализация

11-12

Обработка чека

12-15

Отраслевые реквизиты

15-16

Товары, работы, услуги

16-22

Дополнительные сервисные поля

22

Открытие смены

22-23

Закрытие смены

23-26

Внесение и снятие денег

25-26

Отправка и получение отчетов

26-33

Получение номенклатуры

33-35

Служебная часть сообщений

35-40

Авторизация

41-42

Типы данных

42

Дата

42

Время

42-43

Дата и время

43

Деньги

43

Вид отрасли

43

Операции с чеком

43

Типы оплат

44

Виды налогообложение

44

Типы налогов

44

Роли пользователей

44

Типы рекламных текстов для чека

44

Информация о рекламных текстах для чека

44

Процедуры установления связи

45

Работа в нормальном режиме

45

Работа в режиме блокировки

46-47

Работа в режиме серверной блокировки

47-48

Приложение

49-52

1. Общая информация

Обмен контрольно-кассовых машин с функцией фиксации и (или) передачи данных (далее - устройство) с сервером оператора фискальных данных (далее-ОФД) осуществляется по TCP/IP протоколу. Инициатором всех сеансов связи является устройство. При обращении устройства к серверу ОФД устанавливается TCP соединение и производится обмен сообщениями. Поскольку TCP гарантирует доставку данных в неизменном виде. использование контрольных сумм не требуется.

В качестве основы для кодирования и декодирования (сериализации) информации предметной области предлагается использование Protocol Buffers, далее - protobuf. Особенности данного подхода:

В этом документе типы данных описаны в терминах protobuf. Если для конкретных случаев не сказано иное, диапазоны значений беззнаковых типов ограничиваются максимально допустимыми положительными значениями соответствующих знаковых чисел:

uint32

0 – 2 147 483 647

uint64

0 – 9 223 372 036 854 775 807

Все строковые переменные должны быть в кодировке UTF-8.

2. Структура сообщений

2.1. Сообщения

Сообщения, посылаемые клиентом, и ответы от сервера структурированы идентично. Шесть полей заголовка, описанного ниже, предваряют байты сериализованной с помощью protobuf структуры.

HEADER

PAYLOAD

APPCODE

VERSION

SIZE

ID

TOKEN

REQNUM

Protocol buffer bytes

2.2. Заголовки сообщений

В заголовке передаются следующие обязательные поля:

Наименование

Тип данных

Длина, байт

Описание

APPCODE

word

2

Код обозначения протокола, всегда равен 81A2h

VERSION

word

2

Номер версии протокола. Нумеруется последовательно, начиная с 1. Соответствует текстовой версии протокола вида X.Y.Z, где:

  • X – ревизия с нововведениями, не имеющая обратную совместимость с пред. версиями X, Y, Z
  • Y – ревизия с нововведениями, имеющую обратную совместимость с предыдущей версией, допустимые значения: 0-9
  • Z – ревизия с исправлениями ошибок, допустимые значения: 0-9;

Например, версия 101 эквивалентна «1.0.1».

При достижении младшего разряда версии значения 9 следующее увеличение версии возможно только путем увеличения старшего разряда. Например:

139->140 («1.3.9» -> «1.4.0»), 194 -> 200 («1.9.4» -> «2.0.0»)

SIZE

double word

4

Общая длина всего сообщения, включая заголовок

ID

double word

4

Идентификатор устройства, выданный ему во время регистрации

TOKEN

double word

4

Cменяемый ключ обмена данными, предотвращающий компрометацию устройства. Сервер может прислать измененный токен в ответ на любую из команд COMMAND_TICKET, COMMAND_CLOSE_SHIFT, COMMAND_RESERVED, COMMAND_MONEY_PLACEMENT, COMMAND_CANCEL_TICKET описанных ниже.

Сервер не может прислать измененный токен в ответ на любую из команд COMMAND_SYSTEM, COMMAND_REPORT, COMMAND_AUTH.

REQNUM

word

2

Порядковый номер обращения к серверу. Инкрементный счетчик с шагом 1 с обнулением при достижении максимума.

Все числа заголовка передаются в little-endian виде – сначала следуют младшие байты, затем старшие. Данный формат заголовка используется в обоих направлениях. Перед отправкой запроса устройство инкрементирует REQNUM и далее передает свой ID, последний TOKEN и новый REQNUM. Сервер отвечает устройству с теми же ID и REQNUM и может создать новый TOKEN или ответить с прежним. Устройство должно запомнить новое значение TOKEN, если он изменился, и в следующем обращении использовать его.

2.3. Коды команд

Функционал взаимодействия устройства и сервера описывается набором команд.

CommandTypeEnum

Название команды

Код команды

Значение

Описание

Системный обмен

0

COMMAND_SYSTEM

Отправка серверу служебного пакета.

Фискализация

1

COMMAND_TICKET

Отправка данных чека на сервер и обратное получение номера чека.

Закрытие смены

2

COMMAND_CLOSE_SHIFT

Фиксация факта перехода смены

Запрос отчета

3

COMMAND_REPORT

Команда на получение X, Z или иных отчетов

Запрос номенклатуры

4

COMMAND_NOMENCLATURE

Запрос на загрузку текущей версии номенклатуры

Инициализация

5

COMMAND_INFO

Запрос на получение информации о кассе

Внесение/снятие денег

6

COMMAND_MONEY_PLACEMENT

Внесение и снятие наличных денежных средств

Авторизация

8

COMMAND_AUTH

Запрос на авторизацию в системе

Зарезервировано

127

COMMAND_RESERVED

Зарезервировано

2.4. Коды ответов

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

ResultTypeEnum

Код ответа

Значение

Наименование

Описание

0

RESULT_TYPE_OK

Команда выполнена успешно

Аппарат работает в штатном режиме

1

RESULT_TYPE_UNKNOWN_ID

Неизвестный ID устройства

Аппарат не зарегистрирован в системе. Устройство должно заблокироваться.

2

RESULT_TYPE_INVALID_TOKEN

Неверный токен

Отправка данных невозможна, необходимо произвести сброс токена. Устройство блокируется до момента ввода корректного токена.

3

RESULT_TYPE_PROTOCOL_ERROR

Ошибка протокола

Ошибка протокола, обратитесь в сервисную службу. Устройство не должно проводить никаких операций до устранения проблемы.

4

RESULT_TYPE_UNKNOWN_COMMAND

Неизвестная команда

Ошибка протокола, обратитесь в сервисную службу. Устройство не должно проводить никаких операций до устранения проблемы.

5

RESULT_TYPE_UNSUPPORTED_COMMAND

Команда не поддерживается

Данная команда не поддерживается сервером, обратитесь в сервисную службу. Устройство не должно проводить никаких операций до устранения проблемы.

6

RESULT_TYPE_INVALID_CONFIGURATION

Неверные настройки устройства

сейчас не используется

7

RESULT_TYPE_SSL_IS_NOT_ALLOWED

Использование SSL не разрешено

Использование защищенного соединения запрещено. Подключите услугу или используйте открытый канал связи. Устройство должно перейти в аварийный режим до момента исправления конфигурации.

8

RESULT_TYPE_INVALID_REQUEST_NUMBER

Неправильный номер запроса

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

9

RESULT_TYPE_INVALID_RETRY_REQUEST

Неправильная попытка отправки повторного запроса

REQNUM и TOKEN имеют те же значения, что и в предыдущем запросе, но код команды отличается. Необходимо устранить эту проблему, и только потом продолжать обрабатывать другие операции.

11

RESULT_TYPE_OPEN_SHIFT_TIMEOUT

_EXPIRED

Время открытой смены истекло

Если истек период, в течение которого смена может быть открыта, то сервер будет возвращать эту ошибку, пока не закроется смена соответствующей командой.

Сервер не будет возвращать такой код в ответ на досылку сообщений при выходе из автономного режима.

12

RESULT_TYPE_INVALID_LOGIN_PASSWORD

(DEPRECATED)

Неправильное имя или пароль

13

RESULT_TYPE_INCORRECT_REQUEST_DATA

Неверные входные данные

Данные корректны с точки зрения протокола, но неверны в конкретном контексте. Необходимо устранить эту проблему, и только потом продолжать обрабатывать другие операции.

14

RESULT_TYPE_NOT_ENOUGH_CASH

Недостаточно наличных

Указывает на недостаточность наличных в кассе во время расходных операций.

15

RESULT_TYPE_BLOCKED

Касса заблокирована

Если касса была заблокирована на сервере ОФД или Касса была снята с учета или Касса в команде COMMAND_TICKET не передала какой-либо из обязательных параметров, сервер ОФД вернет данную ошибку. Устройство должно перейти в режим блокировки. (см. п. 5.4)

17

RESULT_TYPE_SAME_TAXPAYER_AND_CUSTOMER

Совпадает значение ИИН/БИН покупателя и продавца

Необходимо устранить совпадение ИИН/БИН в чеке и отправить его повторно

254

RESULT_TYPE_SERVICE_TEMPORARILY
_UNAVAILABLE

Сервис временно недоступен

Устройство должно разорвать соединение, и далее пытаться соединяться и отправлять данные в течение общего времени на обработку транзакции (см. п.50), по истечении которого устройство должно разорвать соединение и перейти в автономный режим.

255

RESULT_TYPE_UNKNOWN_ERROR

Неизвестная ошибка

Устройство должно разорвать соединение, и далее пытаться соединяться и отправлять данные в течение общего времени на обработку транзакции (см. п.50), по истечении которого устройство должно разорвать соединение и перейти в автономный режим.

2.5. Структура запроса к серверу

Запрос устройства к серверу описан в таблице.

Request

Поле

Наименование

Тип данных

Обязательно

Примечания

command

Код команды

CommandTypeEnum

Да

см. п. 2.3. 0данного документа

ticket

Чековая транзакция

TicketRequest

да, если command = COMMAND_TICKET

игнорируется в остальных случаях

close_shift

Закрытие смены

CloseShiftRequest

да, если command = COMMAND_CLOSE_SHIFT

игнорируется в остальных случаях

report

Запрос отчета

ReportRequest

да, если command = COMMAND_REPORT

игнорируется в остальных случаях

nomenclature

Синхронизация номенклатуры

NomenclatureRequest

да, если command = COMMAND_NOMENCLATURE

игнорируется в остальных случаях

service

Системная часть

ServiceRequest

обязательно для протокола 2.0.3

см. п.0 3.10.

money_placement

Снятие/внесение наличных

MoneyPlacementRequest

да, если command = COMMAND_MONEY_PLACEMENT

игнорируется в остальных случаях

auth

Авторизация

AuthRequest

да, если command = COMMAND_AUTH

игнорируется в остальных случаях

2.6. Структура ответа сервера

Ответ сервера на запрос устройства описан в таблице.

Response

Поле

Наименование

Тип данных

Обязательно

Примечания

command

Код команды

CommandTypeEnum

да

Тот же код, который был в запросе

result

Статус ответа

Result

да

ticket

Ответ на COMMAND_TICKET

TicketResponse

обязательно только в ответ на указанную команду, игнорируется в остальных случаях

report

Ответ на COMMAND_REPORT, COMMAND_CLOSE_SHIFT, COMMAND_INFO

ReportResponse

обязательно только в ответ на указанные команды, игнорируется в остальных случаях

nomenclature

Ответ на COMMAND_NOMENCLATURE

NomenclatureResponse

обязательно только в ответ на указанную команду, игнорируется в остальных случаях

service

Системная часть

ServiceResponse

Нет

см. п.03.9.

auth

Ответ на COMMAND_AUTH

AuthResponse

обязательно только в ответ на указанную команду, игнорируется в остальных случаях

Статус ответа сервера

Result

Поле

Наименование

Тип данных

Обязательно

Примечания

result_code

Код ответа

uint32

да

Тип uint32 позволяет использовать весь диапазон значений этого типа, что дает возможность не ломать бинарную совместимость при расширении набора кодов ответов. Однако для каждой конкретной версии протокола данное поле должно иметь значения из диапазона, задаваемого типом ResultTypeEnum.

result_text

Строка ответа

string

нет

Строка с текстом системного характера для обработки ошибок

3. Сообщения

3.1. Служебный обмен

Код команды

COMMAND_SYSTEM

Служебный обмен предназначен для случаев, когда на сервер нужно отправить данные, не относящиеся к предметной области. Может рассматриваться как ping или keep-alive пакет. При низкой активности устройство может проводить регулярный служебный обмен с сервером для мониторинга его доступности. Специфичных данных не имеет, однако, как и все другие пакеты может содержать служебную информацию, описанную в пункте 3.9.0

Устройство может игнорировать ответ от сервера, так как сервер гарантированно не меняет текущий токен обмена в ответ на эту команду.

3.2. Инициализация

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

В свою очередь устройство получает с сервера всю необходимую информацию для работы: текущее состояние счетчиков (X-отчет), рекламные тексты, регистрационную информацию и параметры налогообложения, установленные на серверной стороне.

Отправка на сервер

Код команды

COMMAND_INFO

Данных не предусмотрено

Ответ сервера

Заполнены два поля ответа. Более подробно поля описаны в п. 3.7. и 0п. 3.9.

ReportResponse

Поле

Наименование

Тип данных

Обязательно

Примечания

report

Тип отчета

ReportTypeEnum

Да

  • REPORT_X, если на настоящий момент смена открыта
  • REPORT_Z, если на настоящий момент смена не открыта

zx_report

Данные X\Z отчета

ZXReport

Да

Текущий X отчет, если смена открыта (report = REPORT_X), или же последний снятый Z отчёт, если открытой смены нет (report = REPORT_Z)

Служебный ответ (ServiceResponse)

Поле

Наименование

Тип данных

Обязательно

Примечания

ticket_ads

Рекламные тексты

List<TicketAd>

0…n

Версии и типы рекламных текстов, распечатанных на чеке

n==TicketAdTypeEnum::size

reg_info

Регистрационная информация

ServiceResponse::RegInfo

Да

Информация об организации, кассе и торговой точке

last_document_info

Информация о последнем принятом документе

ServiceResponse::LastDocumentInfo

Нет

Сервер передает номер смены и номер последнего принятого документа

binded_taxation

Привязанное налогообложение

ServiceResponse::BindedTaxation

нет

3.3 Обработка чека

Процедура обработки чека заключается в передаче данных о чеке на сервер и получении от него номера чека.

Отправка на сервер

Код команды

COMMAND_TICKET

Чек записывается в поле ticket запроса0.

Основная часть чека (TicketRequest)

Поле

Наименование

Тип данных

Обязательно

Примечания

operation

Код операции с чеком

OperationTypeEnum

Да

date_time

Дата и время операции

DateTime

Да

operator

Оператор-кассир

Operator

Да

domain

Вид отрасли

TicketRequest::Domain

Нет

items

Список товаров, работ,услуг

List<TicketRequest::Item>

1…n

payments

Список платежей разных типов

List<TicketRequest::Payment>

0…n

Не более одного платежа каждого типа. См также

PaymentTypeEnum

taxes

Список налогов на сумму чека

List<TicketRequest::Tax>

0…n

Налоги на позиции и налог на весь чек являются взаимоисключающими. При формировании чека можно указывать налоги либо для каждого элемента списка товаров, работ, услуг – items или на всю сумму чека в данном поле с разбивкой по типам налогов. Процент налога – уникальное поле (налог с определённым процентом должен встречаться не более одного раза).

amounts

Итоги по чеку

Amounts

да

extension_options

Дополнительные сведения о покупателе

TicketRequest::ExtensionOptions

нет

offline_ticket_

number

OFFLINE номер чека

uint32

нет

Номер чека, сгенерированный устройством при работе в автономном режиме

printed_document_

number

Номер печатного документа

uint64

нет

printed_ticket

Напечатанный чек, представленный одной строкой

string

нет

fr_shift_number

Номер текущей смены, считанный с ФР

uint32

нет

Если поле отсутствует, сервер самостоятельно вычисляет номер смены

parent_Ticket

Родительский чек

TicketRequest::ParentTicket

Нет

Поля содержат

данные чека продажи или покупки, на основании которого оформляется

возврат. (*) Обязательно при OperationTypeEnum == OPERATION_BUY_RETURN или OperationTypeEnum == OPERATION_SELL_RETURN

3.3.1. Отраслевые реквизиты

Сфера деятельности (TicketRequest::Domain)

Поле

Наименование

Тип данных

Обязательно

Примечания

type

Вид отрасли

DomainTypeEnum

Нет

services

Атрибуты сферы услуг

TicketRequest::Domain::Services

Обазательно только если type == [DOMAIN_SERVICES | DOMAIN_HOTELS], игнорируется в остальных случаях

gasoil

Атрибуты сферы обеспечения нефтепродуктами

TicketRequest::Domain::GasOil

Обазательно только при type == DOMAIN_GASOIL, игнорируется в остальных случаях

taxi

Атрибуты такси

TicketRequest::Domain::Taxi

Обазательно при type == DOMAIN_TAXI, игнорируется в остальных случаях

parking

Атрибуты стоянок

TicketRequest::Domain::Parking

Обазательно при type == DOMAIN_PARKING, игнорируется в остальных случаях

3.3.2. Товары, работы, услуги

Элемент списка товаров, работ, услуг(TicketRequest::Item)

Поле

Наименование

Тип данных

Обязательно

Примечания

type

Тип элемента

TicketRequest::Item::

ItemTypeEnum

Да

commodity

Предмет потребления

TicketRequest::Item::Commodity

Обязательно только если type == ITEM_TYPE_COMMODITY игнорируется в остальных случаях

storno_commodity

Сторно предмета потребления

TicketRequest::Item::

StornoCommodity

Обязательно только если type == ITEM_TYPE_STORNO_COMMODITY игнорируется в остальных случаях

markup

Наценка

TicketRequest::Modifier

Обязательно, только если type == ITEM_TYPE_MARKUP игнорируется в остальных случаях

storno_markup

Сторно наценки

TicketRequest::Modifier

Обязательно, только если type == ITEM_TYPE_STORNO_MARKUP игнорируется в остальных случаях

discount

Скидка

TicketRequest::Modifier

Обязательно, только если type == ITEM_TYPE_DISCOUNT

игнорируется в остальных случаях

storno_discount

Сторно скидки

TicketRequest::Modifier

Обязательно, только если type == ITEM_TYPE_STORNO_DISCOUNT игнорируется в остальных случаях

Тип элемента списка товаров, работ, услуг (TicketRequest::Item::ItemTypeEnum)

Код

Значение

Описание

1

ITEM_TYPE_COMMODITY

Предмет потребления

2

ITEM_TYPE_STORNO_COMMODITY

Сторно предмета потребления

3

ITEM_TYPE_MARKUP

Наценка

4

ITEM_TYPE_STORNO_MARKUP

Сторно наценки

5

ITEM_TYPE_DISCOUNT

Скидка

6

ITEM_TYPE_STORNO_DISCOUNT

Сторно скидки

Элемент списка товаров, работ, услуг (TicketRequest::Item::Commodity)

Поле

Наименование

Тип данных

Обязательно

Примечания

code

Код товара, работ, услуги

uint64

нет

(*) Обязательно, если нет наименования товара, работы, услуги.

Данное поле используется только в том случае, если касса работает с номенклатурой ОФД.

name

Наименование товара, работ, услуги

string

да

section_code

Код секции или отдела

string

да

Сюда также входят:

- номер раздаточного крана для бензоколонок;

- тип услуги или подразделения для отелей и ресторанов.

quantity

Количество товара, работы, услуги

Uint64

да

В тысячных долях, например 1000 == 1,0, 2500 == 2,5

Сюда также входит оплаченный пробег для такси

price

Цена товара, работы, услуги

Money

да

Стоимость единицы товара, работы, услуги

sum

Итоговая сумма товара, работы, услуги

Money

да

Итоговая сумма товара, работы, или услуги с учетом количества и исчисляемых налогов

taxes

Список налогов

List<TicketRequest::Tax>

0…n

Налоги на позиции и налог на весь чек являются взаимоисключающими. При формировании чека нельзя указывать налоги в обеих секциях.

Налог с определённым процентом должен встречаться не более одного раза.

list_excise_stamp

Список кодов

List<string>

нет

Поле содержит список кодов DataMatrix из информационной системы маркировки и прослеживаемости товаров при его наличии для товаров имеющих одинаковый штрихкод (gtin/ntin).

physical_label

Серия и номер акцизной марки

string

нет

Поле содержит серию и номер акцизной марки при её наличии.

product_id

Сквозной идентификатор товара

uint64

нет

(*) Обязательно для товаров модуля Виртуальный склад ИС ЭСФ, если не задано поле barcode.

barcode

Штрих-код

string

нет

Поле содержит штрих-код GTIN при его наличии. (*) Обязательно для товаров модуля Виртуальный склад ИС ЭСФ, если не задано поле product_id.

Ntin

Штрих-код

string

нет

Поле содержит штрих-код NTIN при его наличии. (*) Обязательно для товаров модуля Виртуальный склад ИС ЭСФ, если не задано поле product_id.

measure_unit_code

Код единицы измерения

string

Нет – для версии протокола 2.0.2 и ниже

Да – для версии протокола выше 2.0.0

Код единицы измерения в ИС ЭСФ

auxiliary

Дополнительная информация

KeyValuePair

0…n

Налог элемента списка товаров, работ, услуг (TicketRequest::Tax)

Поле

Наименование

Тип данных

Обязательно

Примечания

type

Тип налога

TaxTypeEnum

да

taxation_type

Вид налогообложения

TaxationTypeEnum

нет

percent

Значение налога в процентах

uint32

да

В тысячных долях процента, например 12000 == 12,0%

sum

Значение налога в деньгах

Money

да

is_in_total_sum

Заложен ли налог в сумму

bool

да

Признак того, включена ли сумма налога в сумму товара, работы, услуги

Элемент списка товаров, работ, услуг(TicketRequest::Item::StornoCommodity)

Поле

Наименование

Тип данных

Обязательно

Примечания

name

Наименование операции сторно

string

нет

section_code

Код секции или отдела

string

да

Сюда также входят:

- номер раздаточного крана для бензоколонок;

- тип услуги или подразделения для отелей и ресторанов.

quantity

Количество товара, работы, услуги

uint64

да

В тысячных долях, например 1000 == 1,0, 2500 == 2,5

Сюда также входит оплаченный пробег для такси

price

Цена товара, работы, услуги

Money

да

Стоимость единицы товара, работы, услуги

sum

Итоговая сумма товара, работы, услуги

Money

да

Итоговая сумма товара или услуги с учетом количества и исчисляемых налогов

taxes

Список налогов

List<TicketRequest::Tax>

0…n

Налоги на позиции и налог на весь чек являются взаимоисключающими. При формировании чека нельзя указывать налоги в обеих секциях.

Налог с определённым процентом должен встречаться не более одного раза.

list_excise_stamp

Список кодов

List<string>

нет

Поле содержит список кодов DataMatrix из информационной системы маркировки и прослеживаемости товаров при его наличии для товаров имеющих одинаковый штрихкод (gtin/ntin).

physical_label

Серия и номер акцизной марки

string

нет

Поле содержит серию и номер акцизной марки при её наличии.

product_id

Сквозной идентификатор товара

uint64

нет

(*) Обязательно для товаров модуля Виртуальный склад ИС ЭСФ, если не задано поле barcode.

barcode

Штрих-код

string

нет

Поле содержит штрих-код GTIN при его наличии. (*) Обязательно для товаров модуля Виртуальный склад ИС ЭСФ, если не задано поле product_id.

ntin

Штрих-код

string

нет

Поле содержит штрих-код Ntin при его наличии. (*) Обязательно для товаров модуля Виртуальный склад ИС ЭСФ, если не задано поле product_id.

measure_unit_code

Код единицы измерения

string

Да – для версии протокола выше 2.0.3

Код единицы измерения в ИС ЭСФ

auxiliary

Дополнительная информация

KeyValuePair

0…n

Модификатор стоимости (скидка/надбавка/сторно) (TicketRequest::Modifier)

Поле

Наименование

Тип данных

Обязательно

Примечания

name

Наименование

string

да

sum

Сумма

Money

да

taxes

Список налогов

List<TicketRequest::Tax>

0…n

Налог с определённым процентом должен встречаться не более одного раза.

auxiliary

Дополнительная информация

KeyValuePair

0…n

Оплата(TicketRequest::Payment)

Поле

Наименование

Тип данных

Обязательно

Примечания

type

Вид оплаты

PaymentTypeEnum

да

sum

Уплаченная сумма

Money

да

card_payment_fields

Реквизиты оплаты картой

CardPaymentFields

нет

mobile_payments_fields

Реквизиты мобильного платежа

MobilePaymentFields

нет

Реквизиты оплаты картой (TicketRequest::Payment::CardPaymentFields)

Поле

Наименование

Тип данных

Обязательно

Примечания

pos_terminal_id

Уникальный идентификатор терминала

String

Нет

pos_card_type

Тип карты

String

Нет

pos_autorization_code

Код авторизации

Uint32

Нет

pos_rrn

Уникальное значения номера операции (Reference

Number)

Uint64

Нет

pos_receipt_number

Номер чека в системе банка

Uint32

Нет

Реквизиты мобильного платежа(TicketRequest::Payment::MobilePaymentFields)

Поле

Наименование

Тип данных

Обязательно

Примечания

qr_type

Тип оплаты QR

String

Нет

qr_id

Уникальный идентификатор платежа QR

String

Нет

Итоги по чеку (TicketRequest::Amounts)

Поле

Наименование

Тип данных

Обязательно

Примечания

total

Общая сумма чека

Money

да

taken

Полученная сумма

Money

нет*

(*) Обязательно при наличной оплате

change

Сумма сдачи

Money

нет*

(*) Обязательно при наличной оплате

markup

Общая сумма наценки

TicketRequest::Modifier

нет*

(*) Это поле должно отсутствовать, если указана сумма скидок

discount

Общая сумма скидки

TicketRequest::Modifier

нет*

(*) Это поле должно отсутствовать, если указана сумма наценок

Родительский чек (TicketRequest::ParentTicket)

Поле

Наименование

Тип данных

Обязательно

Примечания

parent_ticket_number

Фискальный признак чека основания для возврата

String

Нет*

Поля содержат

данные чека продажи или покупки, на основании которого оформляется

возврат. (*) Обязательно при OperationTypeEnum == OPERATION_BUY_RETURN или OperationTypeEnum == OPERATION_SELL_RETURN

parent_ticket_data_time

Дата и время операции родительского чека (чека основаия)

DateTime

Нет*

kgd_kkm_id

Регистрационный номер ККМ КГД чека основания для возврата

string

Нет*

parent_ticket_total

Общая сумма покупки или продажи чека основания для возврата

Money

Нет*

parent_ticket_is_offline

Флаг того, что чека основания для возврата был автономным.

bool

Нет*

3.3.3. Дополнительные сервисные поля

Дополнительные сервисные поля (TicketRequest::ExtensionOptions)

Поле

Наименование

Тип данных

Обязательно

Примечания

customer_email

E-mail покупателя

string

нет

Рекомендуем отправлять покупателю копию чека, в случае, если данное поле заполнено e-mail адресом покупателя

customer_phone

Телефон покупателя

string

нет

customer_iin_or_bin

ИИН/БИН покупателя

string

нет

auxiliary

Дополнительная информация

KeyValuePair

0…n

Ответ сервера

TicketResponse

Поле

Наименование

Тип данных

Обязательно

Примечания

ticket_number

Номер чека

String

Да

qr_code

QR код

байтовый массив

Да

Для определенных видов устройств

3.6. Закрытие смены

Отправка на сервер

Код команды

COMMAND_CLOSE_SHIFT

CloseShiftRequest

Поле

Наименование

Тип данных

Обязательно

Примечания

close_time

Дата и время закрытия

DateTime

Да

is_offline

Происходило ли закрытие смены в автономном режиме

bool

Нет

Если поле отсутствует, считается, что закрытие смены происходило в нормальном режиме

fr_shift_number

Номер текущей (закрываемой) смены, считанный с ФР

uint32

Нет

Если поле отсутствует, сервер самостоятельно вычисляет номер смены

withdraw_money

Производить автоматическое изъятие (COMMAND_MONEY_PLACEMENT) всей наличности из кассы перед закрытием смены

bool

Нет

Если поле отсутствует, изъятие не производится

z_report

Данные Z отчета

ZXReport

Да — для версии протокола 2.0.2 и выше

Если поле отсутствует, сервер самостоятельно формирует Z-отчет

printed_document_number

Номер печатного документа

uint64

нет

Номер, определяемый в рамках собственной пользовательской нумерации печатных документов.

operator

Оператор-кассир

Operator

Да — для версии протокола 2.0.2 и выше

Ответ сервера

В ответ присылается Z отчет. См. также Ошибка! Источник ссылки не найден.

ReportResponse

Поле

Наименование

Тип данных

Обяз.

Примечания

report

Тип отчета

ReportTypeEnum

Да

REPORT_Z

zx_report

Данные Z отчета

ZXReport

Да

Отчет по закрываемой смене

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

3.7. Внесение и снятие денег

MoneyPlacementEnum

Код

Значение

Описание

0

MONEY_PLACEMENT_DEPOSIT

Внесение денег в кассу

1

MONEY_PLACEMENT_WITHDRAWAL

Снятие денег из кассы

Отправка на сервер

Код команды

COMMAND_MONEY_PLACEMENT

MoneyPlacementRequest

Поле

Наименование

Тип данных

Обязательно

Примечания

datetime

Дата и время операции

DateTime

да

operation

Тип операции

MoneyPlacementEnum

да

sum

Сумма

Money

да

is_offline

Происходила ли операция внесения/снятия в автономном режиме

bool

нет

Если поле отсутствует, то считается, что операция происходила в нормальном режиме

fr_shift_number

Номер текущей смены, считанный с ФР

uint32

нет

Если поле отсутствует, сервер самостоятельно вычисляет номер смены

printed_document_number

Номер печатного документа

uint64

нет

Номер, определяемый в рамках собственной пользовательской нумерации печатных документов.

operator

Оператор-кассир

Operator

Да — для версии протокола 2.0.2 и выше

Если изъятие денег происходит в автономном режиме, клиентская сторона самостоятельно должна проверить, достаточно ли наличности в кассе, на основании локально вычисляемых счётчиков.

Ответ сервера

Данных не предусмотрено.

3.8. Отправка и получение отчетов

Отправка на сервер текущего X отчета или последнего Z отчет и получение данные от сервера для формирования и вывода стандартных отчетов по закрытиям смен и переходным остаткам.

ReportTypeEnum

Код

Значение

Описание

0

REPORT_Z

Z-отчет

1

REPORT_X

X-отчет

Отправка на сервер

Код команды

COMMAND_REPORT

ReportRequest

Поле

Наименование

Тип данных

Обязательно

Примечания

report

Тип отчета

ReportTypeEnum

Да

Возможные значения:

- REPORT_Z для запроса последнего Z отчета;

- REPORT_X для запроса текущего X отчета

date_time

Дата и время

DateTime

Да

Дата и время совершения запроса.

is_offline

Происходил ли запрос в автономном режиме

bool

Нет

Если поле отсутствует, значит, запрос происходил в нормальном режиме.

zx_report

Данные X или Z отчета

ZXReport

Да, для версии протокола 1.2.5 и выше.
Нет. Для версии протокола ниже 1.2.5.

Ответ сервера

ReportResponse

Поле

Наименование

Тип данных

Обязательно

Примечания

report

Тип отчета

ReportTypeEnum

Да

То же значение, что и при отправке на сервер

zx_report

Данные X или Z отчета

ZXReport

Да

В этом поле всегда будет отчет.

Если был запрошен Z-отчёт, но это первая смена и еще нет ни одного Z отчета, то в ответ будет возвращён пустой отчёт, у которого проставлен номер смены 0 и дата, скопированные из запроса.

Устройство может игнорировать ответ от сервера, так как сервер гарантированно не меняет текущий токен обмена в ответ на эту команду.

Z-отчет и X-отчет имеют одинаковую структуру.

Основная часть ZX-отчета (ZXReport)

Поле

Наименование

Тип данных

Обязательно

Примечания

date_time

Дата и время отчета

DateTime

да

open_shift_time

Дата и время открытия смены

DateTime

Да, для протокола версии 2.0. и выше.

close_shift_time

Дата и время закрытия смены

DateTime

Да, для Z-отчета и для протокола версии 2.0.2 и выше.

shift_number

Номер смены

uint32

да

Сквозной номер смены с момента регистрации кассы

sections

Итоги по операциям в каждом отделе

List<ZXReport::Section>

0…n

Без учета скидок и надбавок

operations

Итоги по операциям суммарно по всем отделам

List<ZXReport::Operation>

n

Без учета скидок и надбавок

n == OperationTypeEnum::size

discounts

Итоги по скидкам

List<ZXReport::Operation>

n

n == OperationTypeEnum::size

markups

Итоги по наценкам

List<ZXReport::Operation>

n

n == OperationTypeEnum::size

total_result

Окончательные итоги по операциям

List<ZXReport::Operation>

n

С учетом скидок и надбавок

n == OperationTypeEnum::size

taxes

Итоги по налогам

List<ZXReport::Tax>

0…n

Налог с определённым процентом должен встречаться не более одного раза.

start_shift_

non_nullable_sums

Необнуляемые суммы на начало смены

List<ZXReport::NonNullableSum>

n

Список с необнуляемыми суммами по операциям на начало смены

n == OperationTypeEnum::size

ticket_operations

Итоги по чекам по каждой операции

List<ZXReport::TicketOperation>

n

n == OperationTypeEnum::size

money_placements

Итоги по операциям с наличными

List<ZXReport::MoneyPlacement>

n

n == MoneyPlacementEnum::size

cash_sum

Сумма наличных в кассе

Money

да

revenue

Выручка

ZXReport::Revenue

да

non_nullable_sums

Необнуляемые суммы на момент снятия отчёта (для Z-отчёта – на конец смены)

List<ZXReport::NonNullableSum>

n

Список с необнуляемыми суммами по операциям

n == OperationTypeEnum::size

checksum

Контрольная сумма

string

Да, для протокола 2.0.2 и выше.

Итоги по отделу(ZXReport::Section)

Поле

Наименование

Тип данных

Обязательно

Примечания

section_code

Номер/название отдела

string

да

operations

Итоги по видам операций

List<ZXReport::Operation>

n

n == OperationTypeEnum::size

Итоги по виду операции (продажа, покупка, возвраты) ZXReport::Operation

Поле

Наименование

Тип данных

Обязательно

Примечания

operation

Тип операции

OperationTypeEnum

да

count

Количество операций

uint32

да

sum

Операций на сумму

Money

да

Итоги по налогу (ZXReport::Tax)

Поле

Наименование

Тип данных

Обязательно

Примечания

type

Тип налога

TaxTypeEnum

да

percent

Значение налога в процентах

uint32

да

В тысячных долях, например 12000 == 12,0%

operations

Итоги по операциям по данному налогу

List<ZXReport::Tax::TaxOperation>

n

n == OperationTypeEnum::size

Итоги по виду операции в рамках налога (продажа, покупка, возвраты) (ZXReport::Tax::TaxOperation)

Поле

Наименование

Тип данных

Обязательно

Примечания

operation

Тип операции

OperationTypeEnum

да

turnover

Итоговая сумма по операциям, облагаемым налогом

Money

да

turnover_without_tax

Итоговая сумма по операциям, без учета налога

Money

да

sum

Сумма налога

Money

да

Необнуляемая сумма (ZXReport::NonNullableSum)

Поле

Наименование

Тип данных

Обязательно

Примечания

operation

Тип операции

OperationTypeEnum

да

sum

Сумма

Money

да

Итоги по операциям с чеками (ZXReport::TicketOperation)

Поле

Наименование

Тип данных

Обязательно

Примечания

operation

Тип операции

OperationTypeEnum

да

tickets_total_count

Общее количество чеков по данной операции

uint32

да

tickets_count

Количество чеков по данной операции за смену

uint32

да

tickets_sum

Сумма по чекам по данной операции за смену

Money

да

payments

Итоги по видам расчетов

List<ZXReport::TicketOperation::Payment>

n

n == PaymentTypeEnum::size

offline_count

Количество чеков за смену в автономном режиме

uint32

Да, для протокола версии 2.0.2 и выше.

discount_sum

Сумма скидки по всем чекам за смену

Money

markup_sum

Сумма наценки по всем чекам за смену

Money

change_sum

Сумма сдачи по всем чекам за смену

Money

Итоги по виду расчетов (ZXReport::TicketOperation::Payment)

Поле

Наименование

Тип данных

Обязательно

Примечания

payment

Вид расчетов

PaymentTypeEnum

да

То же, что «Вид оплаты» в чеке.

sum

Сумма по данному виду расчетов

Money

да

count

Количество платежей

uint32

Да, для протокола версии 2.0.2 и выше.

Итоги по виду операций с наличными (ZXReport::MoneyPlacement)

Поле

Наименование

Тип данных

Обязательно

Примечания

operation

Вид операции

MoneyPlacementEnum

да

operations_total_count

Общее количество операций данного вида

uint32

да

operations_count

Количество операций данного вида за смену

uint32

да

operations_sum

Сумма денег по операции данного вида за смену

Money

да

offline_count

Количество операций данного вида за смену в автономном режиме

uint32

Да, для протокола версии 2.0.2 и выше.

Выручка(ZXReport::Revenue)

Поле

Наименование

Тип данных

Обязательно

Примечания

sum

Сумма выручки

Money

да

is_negative

Является ли сумма выручки отрицательной

bool

да

При снятии отчёта в автономном режиме клиентская сторона генерирует соответствующий отчёт на основании локально вычисляемых счётчиков. При возврате в нормальный режим, значения счетчиков синхронизируется с X отчетом, получаемым в процессе инициализации, описанном в п.3.2. 0

3.9. Получение номенклатуры

Загрузка и обновление номенклатуры в ККМ устройствах. Касса обращается к серверу, передавая номер версии номенклатуры, загруженной в нее. Если на сервере версия номенклатуры отличается, то на кассу будет произведена загрузка всей номенклатуры текущей версии. Если Касса передает GTIN либо NTIN в поле barcode, то сервер отправляет актуальную информацию по данному товару согласно сведений государственной база данных национального каталога товаров.

Отправка на сервер

Код команды

COMMAND_NOMENCLATURE

NomenclatureRequest

Поле

Наименование

Тип данных

Обязательно

Примечания

current_version

Текущая версия

uint32

Да

Если номенклатуры на устройстве нет, то current_version=0

barcode

Штрих код

string

Нет

В данном поле ККМ передаёт либо GTIN либо NTIN.

Ответ сервера

NomenclatureResponse

Поле

Наименование

Тип данных

Обязательно

Примечания

version

Версия номенклатуры

uint32

Да, нет с версии 2.0.3

created_time

Дата и время создания версии номенклатуры

DateTime

нет

elements

Список номенклатурных единиц (группа или товар)

List<NomenclatureResponse:: Element>

0…n

Если актуальная версия номенклатуры совпадает с текущей версией на кассе, то список пуст.

result

Статус ответа

NomenclatureResultTypeEnum

да

Код ответа (NomenclatureResponse ::NomenclatureResultTypeEnum)

Код

Значение

Описание

0

RESULT_TYPE_OK

Номенклатура найдена, и все её элементы загружены на кассу.

1

RESULT_TYPE_VERSION_IS_ACTUAL

Актуальная версия номенклатуры совпадает с версией, загруженной на кассу.

2

RESULT_TYPE_NO_VERSION

Не найдены версии номенклатуры, готовые к загрузке

3

RESULT_TYPE_ELEMENT_NOT_FOUND_BY_BARCODE

Товар в НКТ отсутствует

Номенклатурная единица (NomenclatureResponse::Element)

Поле

Наименование

Тип данных

Обязательно

Примечания

type

Тип элемента

ElementTypeEnum

Да

title

Название товара, работы, услуги/группы

string

Да

На русском языке

title_kk

Название товара, работы, услуги/группы

string

Нет

На казахском языке

parent_group_id

ID родительской группы

uint64

Нет

id родительской группы, у корневого элемента отсутствует.

id

ID элемента

uint64

да

item

описание товара

NomenclatureResponse::Item

Нет (см. примечания)

если type== ITEM, то обязательно

Тип элемента номенклатуры (NomenclatureResponse::ElementTypeEnum)

Код

Значение

Описание

0

GROUP

Элемент является группой

1

ITEM

Элемент является товаром, работ, услуг

Номенклатурная единица (NomenclatureResponse::Item)

Поле

Наименование

Тип данных

Обязательно

Примечания

article

Артикул

string

нет

barcode

Штрих код

string

нет

Обязательно при ntin== null

ntin

Штрих код

string

нет

Обязательно при barcode == null

description

Описание позиции

string

нет

purchase_price

Цена закупки

Money

Да, нет версии 2.0.3

sell_price

Цена продажи

Money

Да, нет с версии 2.0.3

taxes

Налоги

List<NomenclatureResponse::Tax>

0…n

n == TaxTypeEnum::size

measure_count

Количество единиц измерения

uint32

нет

В тысячных долях

Например, если имеется товар, расфасованный по 100 грамм, тогда:

- если measure_title= «граммы», то measure_count=100000

- если measure_title= «килограммы», то measure_count=1000

measure_title

Наименование единицы измерения

string

нет

measure_fractional

Признак, является ли единица измерения дробной

bool

нет

Например, килограммы – дробная, штуки – нет.

measure_unit_code

Код единицы измерения

string

нет

Код единицы измерения в ИС ЭСФ

is_markedeac

Признак маркировки

bool

Нет

Для товаров подлежащих обязательной маркировки

is_social

Признак социально значимого потребительского товара

bool

Нет

Для товаров относящихся к СЗПТ

Налог элемента номенклатуры(NomenclatureResponse::Tax)

Поле

Наименование

Тип данных

Обязательно

Примечания

taxation_type

Вид налогообложения

TaxationTypeEnum

да

tax_type

Тип налога

TaxTypeEnum

да

tax_percent

Значение налога в процентах

uint32

да

В тысячных долях процента, например 12000 == 12,0%

3.10. Служебная часть сообщений

Служебная часть предназначена для контроля состояния ККМ и его обслуживания. Возможна передача системных пакетов при каждом обращении к серверу. Задачи:

Код команды

COMMAND_SYSTEM если команда идет в отдельном запросе, иначе код основной команды запроса.

Служебный запрос (ServiceRequest)

Поле

Наименование

Тип данных

Обязательно

Примечания

comm_quality

Качество связи

ServiceRequest:CommQuality

нет

software_information

Информация о среде исполнения

ServiceRequest::SoftwareInformation

нет

security_stats

Безопасность и статистика

ServiceRequest::SecurityStats

нет*

Обязательно для команд;

COMMAND_TICKET

COMMAND_CLOSE_SHIFT

COMMAND_REPORT

COMMAND_MONEY_PLACEMENT

offline_period

Автономный режим

ServiceRequest::OfflinePeriod

да

Время перехода в автономный режим и возврата в нормальный режим

nomenclature_version

Версия номенклатуры

uint32

нет

Текущая версия номенклатуры, загруженной в кассу

ticket_ad_infos

Информация о рекламных текстах

List<TicketAdInfo>

0…n

Версии и типы рекламных текстов, загруженных на ККМ

n==TicketAdTypeEnum::size

get_reg_info

Признак получения регистрационной информации

bool

да

С помощью этого флага ККМ может запросить информацию об организации, кассе и/или торговой точке

get_binded_taxation

Признак получения привязанного налогообложения

bool

нет

Устройство может получить привязанное налогообложение, выставив это флаг в true

auxiliary

Дополнительная информация

KeyValuePair

0…n

reg_info

Регистрационные данные

ServiceRequest::RegInfo

да

Устройство должно отправлять эти данные в каждом фискальном запросе

Качество соединения (ServiceRequest::CommQuality)

Поле

Наименование

Тип данных

Обязательно

Примечания

avg_connect_time

uint32

да

avg_ping

uint32

нет

loss_ratio

uint32

нет

Информация о среде исполнения (ServiceRequest::SoftwareInformation)

Поле

Наименование

Тип данных

Обязательно

Примечания

module_infos

Информация о программном модуле

ServiceRequest::SoftwareInformation::ModuleInformation

0…n

hardware_arch

Архитектура процессора

string

нет

os_family

Семейство ОС

string

нет

os_version

Версия ОС

string

нет

os_extended_info

Дополнинельная информация об ОС

string

нет

runtime_version

версия платформы для Java и C# библиотек

string

нет

partner_id

Id партнера

uint32

нет

Информация о модуле ПО (ServiceRequest::SoftwareInformation::ModuleInformation)

Поле

Наименование

Тип данных

Обязательно

Примечания

name

Название модуля

uint32

да

version

Версия модуля

uint32

да

build_info

Информация о сборке

uint32

нет

device_info

Информация об устройстве

ServiceRequest::SoftwareInformation::ModuleInformation::

DeviceInformation

нет

extended_info

Дополнительная информация

KeyValuePair

0…n

build_arch

Архитектура сборки

string

нет

Информация об устройстве (ServiceRequest::SoftwareInformation::ModuleInformation::DeviceInformation)

Поле

Наименование

Тип данных

Обязательно

Примечания

manufacturer

Производитель

string

нет

model

Модель

string

нет

firmware_version

Версия прошивки

string

нет

Безопасность и статистика (ServiceRequest::SecurityStats)

Поле

Наименование

Тип данных

Обязательно

Примечания

geo_position

Геопозиция

ServiceRequest::SecurityStats::GeoPosition

Да

Геоданные (ServiceRequest::SecurityStats::GeoPosition)

Поле

Наименование

Тип данных

Обязательно

Примечания

latitude

Широта

uint32

да

в 10000 долях

longitude

Долгота

uint32

да

в 10000 долях

source

Источник геолокации

string

да

Источник геолокационных полученных от оператора связи

Регистрационные данные (ServiceRequest::RegInfo)

Поле

Наименование

Тип данных

Обязательно

Примечания

kkm

Информация о ККМ

KkmRegInfo

да

org

Информация об организации

OrgRegInfo

да

Служебный ответ (ServiceResponse)

Поле

Наименование

Тип данных

Обязательно

Примечания

ticket_ads

Рекламные тексты

List<TicketAd>

0…n

Версии и типы рекламных текстов, распечатанных на чеке

n==TicketAdTypeEnum::size

reg_info

Регистрационная информация

ServiceResponse::RegInfo

да

Информация об организации, кассе и торговой точке

binded_taxation

Привязанное налогообложение

ServiceResponse::BindnedTaxation

нет

auxiliary

Дополнительная информация

KeyValuePair

0…n

Дополнительная информация (ServiceResponse::RegInfo)

Поле

Наименование

Тип данных

Обязательно

Примечания

kkm

Информация о ККМ

KkmRegInfo

да

pos

Информация о торговой точке

PosRegInfo

нет

org

Информация об организации

OrgRegInfo

да

Информация о последнем принятом документе (ServiceResponse::LastDocumentInfo)

Поле

Наименование

Тип данных

Обязательно

Примечания

fr_shift_number

Номер смены

uint32

да

printed_document_number

Номер документа

uint64

да

Регистрационные данные ККМ (KkmRegInfo)

Поле

Наименование

Тип данных

Обязательно

Примечания

point_of_payment_number

Регистрационный номер (код) точки приема платежей

string

нет

terminal_number

Номер платежного терминала

string

нет

fns_kkm_id

Регистрационный номер ККМ, выданный КГД

string

Да, начиная с версии протокола 2.0.2 обязательно для команд COMMAND_CLOSE_SHIFT и

COMMAND_REPORT

serial_number

Заводской номер ККМ

string

kkm_id

Идентификационный номер ККМ

string

Регистрационные данные торговой точки (PosRegInfo)

Поле

Наименование

Тип данных

Обязательно

Примечания

title

Название торговой точки

string

да

address

Адрес торговой точки

string

да

address_kz

Адрес торговой точки на гос языке

string

да

latitude

Широта

uint32

Да

в 10000 долях

longitude

Долгота

uint32

Да

в 10000 долях

Регистрационные данные организации (OrgRegInfo)

Поле

Наименование

Тип данных

Обязательно

Примечания

title

Название организации или ФИО индивидуального предпринимателя

string

да

address

Юридический адрес организации

string

да

address_kz

Юридический адрес организации на гос языке

string

да

iin

ИИН/БИН

string

да

oked

Общий классификатор экономической деятельности (далее - ОКЭД)

string

да

BindedTaxation

Поле

Наименование

Тип данных

Обязательно

Примечания

type

Тип налогообложения

TaxationTypeEnum

да

taxes

Ставки для каждого налога

List<BindedTax>

0..n

Не более одной структуры для каждого налога

BindedTaxation::BindedTax

Поле

Наименование

Тип данных

Обязательно

Примечания

type

Тип налога

TaxTypeEnum

да

percent

Значение налога в процентах

uint32

да

В тысячных долях процента, например 1500 == 1,5%

3.10.1 Информация о нахождении автономном режиме

При возврате из автономного режима по процедуре, описанной в0, устройство сообщает об общем времени нахождения в автономном режиме, добавляя ко всем сообщениям эту структуру.

Отправка на сервер

Время нахождения в автономном режиме (ServiceRequest::OfflinePeriod)

Поле

Наименование

Тип данных

Обязательно

Примечания

begin_time

Дата и время начала автономного режима

DateTime

да

end_time

Дата и время окончания автономного режима

DateTime

да

Ответ сервера

Данных не предусмотрено.

3.10.2. Версии номенклатуры

ККМ может присылать версию номенклатуры, которая загружена у него в настоящий момент.

Отправка на сервер

ККМ заполняет поле ServiceRequest::nomenclature_version своим значением версии.

Ответ сервера

Данных не предусмотрено.

3.10.3 Рекламные тексты чека

В чеках могут содержаться текстовые блоки рекламного или информационного характера. Значения этих текстовых блоков синхронизируются в соответствующих полях служебного пакета. ККМ может добавлять в запрос информацию о версиях текстов, которые у него имеются, а сервер, при необходимости, возвращает новые версии.

Отправка на сервер

ККМ заполняет поле ServiceRequest::ticket_ad_infos своими значениями.

Ответ сервера

Рекламный текстовый блок (TicketAd)

Поле

Наименование

Тип данных

Обязательно

Примечания

info

Информация о текстовом блоке

TicketAdInfo

да

text

Текст

string

да

3.11. Авторизация

Система позволяет авторизовать кассира путем проверки его имени и пароля. В случае успешной авторизации кассе возвращаются код и имя оператора. В случае неудачи кассе вернется код ответа RESULT_TYPE_INVALID_LOGIN_PASSWORD.

Необходимо заметить, что этот вызов не создает никаких сессий и является опциональным, то есть устройства, которые заинтересованы в парольной аутентикации оператора и в получении информации об его или её ролях и профиле могут им воспользоваться. Другие устройства или системы, которые могут сами однозначно ассоциировать текущего оператора с его operator_id могут не делать этот вызов. Сервер будет доверять клиенту в вопросе аутентикации, то есть будет верить в правильность присылаемых во всех других вызовах operator_id. Однако сервер будет всегда проверять клиента в вопросах авторизации, то есть определять валидность выполнения конкретной операции именно этим оператором на данной кассе.

Устройство может игнорировать ответ от сервера, так как сервер гарантированно не меняет текущий токен обмена в ответ на эту команду.

Отправка на сервер

Код команды

COMMAND_AUTH

AuthRequest

Поле

Наименование

Тип данных

Обязательно

Примечания

login

Имя пользователя

string

да

password

Пароль

string

да

Ответ сервера

AuthResponse

Поле

Наименование

Тип данных

Обязательно

Примечания

result

Результат авторизации

AuthResponse::ResultTypeEnum

да

operator_code

Код оператора-кассира

uint32

нет*

(*)Обязательно при result == RESULT_TYPE_OK

operator_name

Наименование оператора-кассира

string

нет*

(*)Обязательно при result == RESULT_TYPE_OK

roles

Роли пользователя

List<UserRoleEnum>

0…n

Список ролей, назначенных пользователю

n==UserRoleEnum::size

Код результата авторизации (AuthResponse::ResultTypeEnum)

Код

Значение

Описание

0

RESULT_TYPE_OK

Успешно

1

RESULT_TYPE_INVALID_LOGIN_PASSWORD

Не успешно

4. Типы данных

4.1. Дата

Date

Поле

Наименование

Тип данных

Обязательно

Примечания

year

Год

uint32

да

Четыре цифры, например: 2013

month

Месяц

uint32

да

Диапазон 1-12

day

День

uint32

да

Диапазон 1-31

Сервер сохраняет значения дат в том виде, в котором он их принимает с устройства без учета часового пояса.

4.2. Время

Time

Поле

Наименование

Тип данных

Обязательно

Примечания

hour

Час

uint32

да

Диапазон 0-23

minute

Минута

uint32

да

Диапазон 0-59

second

Секунда

uint32

нет

Диапазон 0-59

4.3. Дата и время

DateTime

Поле

Наименование

Тип данных

Обязательно

Примечания

date

Дата

Date

да

time

Время

Time

да

4.4. Деньги

Money

Поле

Наименование

Тип данных

Обязательно

Примечания

bills

Основных единиц

uint64

да

Количество основных денежных единиц

coins

Разменных единиц

uint32

да

Количество разменных денежных единиц

4.5. Вид отрасли

DomainTypeEnum

Код

Значение

Описание

0

DOMAIN_TRADING

Торговая сфера

1

DOMAIN_SERVICES

Сфера услуг

2

DOMAIN_GASOIL

Сфера обеспечения нефтепродуктами

3

DOMAIN_HOTELS

Отели и рестораны

4

DOMAIN_TAXI

Такси

5

DOMAIN_PARKING

Стоянки

4.6. Операции с чеком

OperationTypeEnum

Код

Значение

Описание

0

OPERATION_BUY

Покупка

1

OPERATION_BUY_RETURN

Возврат покупки

2

OPERATION_SELL

Продажа

3

OPERATION_SELL_RETURN

Возврат продажи

4.7. Типы оплат

PaymentTypeEnum

Код

Значение

Описание

0

PAYMENT_CASH

Наличные

1

PAYMENT_CARD

Банковская карта

4

PAYMENT_MOBILE

Мобильные

4.8. Виды налогообложений

TaxationTypeEnum

Код

Значение

Описание

100

STS

СНР на основе упрощенной декларации

101

RTS

Общеустановленный режим налогообложения

102

TRFF

СНР для крестьянских или фермерских хозяйств

103

TRBP

СНР на основе патента

4.9. Типы налогов

TaxTypeEnum

Код

Значение

Описание

100

VAT

НДС

4.10. Роли пользователей

UserRoleEnum

Код

Значение

Описание

1

USER_ROLE_PAYMASTER

Кассир

2

USER_ROLE_CHIEF_PAYMASTER

Старший кассир

3

USER_ROLE_ADMINISTRATOR

Администратор

4.11. Типы рекламных текстов для чека

TicketAdTypeEnum

Код

Значение

Описание

0

TICKET_AD_OFD

Текст оператора фискальных данных

1

TICKET_AD_ORG

Текст организации

2

TICKET_AD_POS

Текст точки продажи

3

TICKET_AD_KKM

Текст ККМ

4

TICKET_AD_INFO

Информационное сообщение

4.12. Информация о рекламных текстах для чека

TicketAdInfo

Поле

Наименование

Тип данных

Обязательно

Примечания

type

Тип текста

TicketAdTypeEnum

да

version

Версия текста

uint64

да

4.13. Дополнительная информация в формате key, value

KeyValuePair

Поле

Наименование

Тип данных

Обязательно

Примечания

key

Ключ

string

да

value

Значение

string

нет

4.14. Сведения об операторе-кассире

Оператор-кассир (Operator)

Поле

Наименование

Тип данных

Обязательно

Примечания

code

Код оператора-кассира

uint32

да

Сюда также входят:

- номер оператора для бензоколонок;

- шифр официанта или портье для отелей и ресторанов

- идентификатор водителя для такси.

name

ФИО оператора-кассира

string

нет

5. Процедуры установления

связи

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

5.1. Работа в нормальном режиме

  1. Устройство отправляет запрос на сервер и получает от него ответ. Это штатный режим работы.
  2. Если устройство, находясь в режиме ONLINE, отправляет запрос, но не получает ответа от сервера в течение общего времени на обработку транзакции, оно должно разорвать соединение и перейти в режим OFFLINE. Если во время отправки данных из режима ONLINE произошел обрыв соединения, повлекший за собой закрытие сокета, устройство должно попытаться соединиться снова и повторно отправить пакет с данными. При этом должны быть использованы те же TOKEN и REQNUM для того, чтобы дать информацию серверу, что данные на ККМ не были получены и идет повторное обращение. Указанное действие должно повторяться в течение общего времени на обработку транзакции, по истечении которого устройство должно разорвать соединение и перейти в режим OFFLINE.
  3. Если устройство, находясь в режиме ONLINE, получает код RESULT_TYPE_SERVICE_TEMPORARILY_UNAVAILABLE или RESULT_TYPE_UNKNOWN_ERROR в ответ на любое сообщение оно должно разорвать соединение, и далее пытаться соединяться и отправлять данные, как описано в предыдущем пункте.

Следует иметь в виду, что общее время на обработку транзакции учитывает все вышеперечисленные случаи. Например, при обрыве интернет-канала сначала может произойти разрыв соединения с сервером (b.), а затем серия безуспешных попыток соединений (c.). Все эти действия происходят в пределах общего времени на обработку транзакции.

5.2. Работа в автономном режиме

При отсутствии связи, неполучении ответа от сервера или получении от сервера некоторых кодов ошибок (см 0) устройство должно перейти в автономный режим. При этом:

При восстановлении связи ККМ устройство должно выполнить следующие действия:

Время автономной работы рассчитывается с момента первой неудавшейся попытки отправить чек до момента успешного соединения.

5.3. Работа в режиме блокировки

В этот режим устройство должно переходить, если какое либо из OFFLINE сообщений при успешной передаче на сервер вызывает устойчивую ошибку. Такая ситуация не может быть разрешена автоматически и требует вмешательства человека.

В этом режиме никакая работа не разрешена, до тех пор, пока сообщение, вызывающее проблемы не будет удалено из очереди после соответствующего анализа.

5.4. Работа в режиме серверной блокировки

В этот режим устройство должно переходить, если от сервера приходит ответ с RESULT_CODE_BLOCKED. Устройство должно напечатать и/или вывести на экран ранее полученное от сервера информационное сообщение — ServiceResponse.ticket_ads (тип TICKET_AD_INFO).

В этом режиме никакая работа не разрешена. Устройство должно периодически отправлять на сервер запрос COMMAND_SYSTEM с заполненным данными service.reg_info.

Устройство выходит из режима блокировки когда получит от сервера ответ с RESULT_CODE_OK.

5.4.1. Работа после выхода из блокировки

Устройство после выхода из блокировки должно проверить все записи, не переданные на сервер ОФД, после успешной проверки отправить на сервер ОФД сообщение с количеством о непереданных записях

Отправить записи в последовательности, накопленные во время работы в автономном режиме, получая на каждый из них ответ от сервера с кодом RESULT_TYPE_OK

Сервер ОФД, после приема всех записей, отправляет ответ устройству сообщение об успешном приеме сообщений.

Приложение

Версия

Дата

Описание изменений

2.0.3

29.08.2025

1) Повышение разрядности поля quantity в типе TicketRequest::Item::Commodity и TicketRequest::Item::StornoCommodity с uint32 до uint64.

2) Повышение разрядности поля pos_rrn в типе TicketRequest::Item::Payment::CardPaymentFields с uint32 до uint64

3) В NomenclatureRequest добавлено поле barcode для получения данных из НКТ по GTIN или NTIN.

18.06.2025

1) В подпункте 3.3.3. «Дополнительные сервисные поля» добавлены поля, которые необходимы при возврате товаров, работ и услуг:

- Фискальный признак чека основания для возврата

- Дата и время чека основания для возврата

- Общая сумма покупки или продажи чека основания для возврата

- Флаг того, что чека основания для возврата был автономным.

2) Исключена команды и операция аннулированию чека подпункты 2.3, 2.4,

3) В пункте (TicketRequest::Item::Commodity) изменено описание «list_excise_stamp»

4) Добавлена новая структура:

Безопасность и статистика (ServiceRequest::SecurityStats)

Геоданные (ServiceRequest::SecurityStats::GeoPosition)

5) В структуре (TicketRequest::Item::Commodity) (Nomenclature

Response::Item) добавлено поле NTIN.

2.0.2

18.05.2021

Исключена команда OpenShift и все связанные с ней поля;

Добавлена ошибка с с кодом 17 ошибка RESULT_TYPE_SAME_TAXPAYER_AND_CUSTOMER

Добвлен подраздел 4.13 «Дополнительная информация в формате key, value»;

Сведения по оператору-кассиру перенесены из раздела TicketRequest в в раздел 4 «Типы данных»;

Из служебного запросы исключено поле security_stats;

В MoneyPlacementRequest добавлено поле содержащие информацию об операторе-кассире.

2.0.1

01.03.2021

12.02.2021

В пункте 3.3.3. «Дополнительные сервисные поля» дополнено поле ИИН/БИН покупателя, с обозначением «не обязательно»;

Добавлено в пункте в пункте 4.7 «Типы оплаты», оплата «мобильные»;

Исключено в пункте в пункте 4.7 «Типы оплаты», оплата тарой и оплата в кредит;

2.0.0

25.12.2020

29.09.2020

1. Изменено описание обязательности полей в части содержания чека в соответствии с пунктом 6 статьи 166 Налогового кодекса, передачи данных сведений от устройства на сервер ОФД и передачи сервера ОФД в ИС КГД.

2. Приведен в соответствие п. 3.7 Итоги по виду операции в рамках налога (продажа, покупка, возвраты)/ ZXReport::Tax::TaxOperation, с учетом дополнения поля «turnover_without_tax».

3.

3. В Служебный ответ (ServiceResponse) добавлено необязательное поле last_document_info и соответствующий тип данных LastDocumentInfo.

4. Тип поля printed_document_number изменен на uint64.

5. В структуру запроса к серверу добавлено поле open_shift для передачи данных по команде OpenShift.

6. В команду MoneyPlacement добавлено поле printed_document_number.

7. В команду OpenShift добавлено поле printed_document_number.

8. В команду CloseShift добавлено поле printed_document_number.

9. При использовании команды OpenShift поле printed_document_number становится обязательным для команд: Ticket, MoneyPlacement, CloseShift, OpenShift.

10. При использовании команды OpenShift поле fr_shift_number становится обязательным для команд: Ticket, MoneyPlacement, CloseShift. Сервер не вычисляет номер смены.

11. Описание использования параметров printed_document_number (номер документа) и fr_shift_number (номер смены) в Системе.

12. Устройство ответственно за ведение этих номеров. Сервер ОФД номера не вычисляет, ведет следующий контроль:

1) номер открываемой смены должен быть всегда на 1 больше предыдущей, в противном случае - ошибка.

2) номер документа должен быть всегда больше номера предыдущего документа. Если меньше или равен - ошибка.

3) сообщение с номером смены не равному номеру текущей смены не обрабатывается - ошибка.

Номер документа, таким образом, отменяет использование в качестве идентификатора сообщения номер запроса(reqnum) и соответственно решается проблема дублей.

Все эти механизмы будут работать, только для моделей, поддерживающих команду OpenShift. В ИС ОФД будет вестись учет моделей касс, которые используют эти расширения Протокола.

1.2.5.

23.08.2016

п. 3.7. В структуру ZXReport::TicketOperation::Payment добавлено поля count

п. 3.7. В структуру ZXReport::MoneyPlacement добавлены поля offline_count

п. 3.7. В структуру ZXReport::TicketOperation добавлены поля offline_count, discount_sum, withdraw_sum, change_sum

п. 3.7. В структуру ZXRepоrt добавлены поля opens_shift_time, close_shift_time, checksum

п. 3.9:

- В структуру KkmRegInfo добавлено поле kkm_id

- Изменено описание обязательности полей fns_kkm_id, serial_number для структуры KkmRegInfo

- Изменено описание обязательности поля inn для структуры OrgRegInfo

п. 2.5.: Изменено описание обязательности поля ServiceRequest

п. 3.7.: В структуре ReportRequest добавлено поле zx_report для передачи Z отчета от устройства к серверу. Для версии протокола 1.2.5 и выше это поле обязательно.

п. 3.5.: В структуре CloseShiftRequestдобавлено поле z_report для передачи Z отчета от устройства к серверу. Для версии протокола 1.2.5 и выше это поле обязательно.

п. 3.5.: В структуре CloseShiftRequestдобавлено поле operator. Для версии протокола 1.2.5 и выше это поле обязательно.

п. 3.3.: В структуре TicketRequest::Item::Commodity, TicketRequest::Item::StornoCommodity, TicketRequest::Item::StornoCommodity, TicketRequest::Modifier и TicketRequest::ExtensionOptions добавлены поля auxiliary для передачи дополнительной информации

п. 3.3, 3.5, 3.6.: В структуре TicketRequest, CloseShiftRequest и MoneyPlaementRequest добавлено поле shift_document_number

1.2.4

02.12.2015

п. 3.3: в структуры TicketRequest::Item::Commodity и TicketRequest::Item::StornoCommodity

добавлены поля для передачи номера акцизной марки

1.2.3

10.06.2015

п. 2.4: добавлен код ответа RESULT_CODE_BLOCKED
п. 3.9:

  • добавлено поле reg_info в структуру ServiceRequest .
    добавлена структура ServiceRequest::RegInfo
  • добавлено поле serial_number в структуру KkmRegInfo
  • добавлено поле okved в структуру OrgRegInfo

п. 4.11: добавлено новое значение TICKET_AD_INFO для перечисляемого типа TicketAdTypeEnum

п. 5.4: добавлен режим серверной блокировки

1.2.2

10.03.2015

п. 3.9: добавлены поля ServiceRequest::auxiliary, ServiceResponse::auxiliary

03.03.2015

п. 3.9: ServiceRequest::SoftwareInfo -> ServiceRequest::SoftwareInformation, переделана информация о ПО, добавлены ServiceRequest::CommQuality, ServiceRequest::CommQuality::loss_ratio, ServiceRequest::SoftwareInformation::ModuleInformation, ServiceRequest::SoftwareInformation::ModuleInformation::DeviceInformation

п. 4.13: добавлено поле KeyValuePair

04.02.2015

  • п. 3.3, 3.6: добавлено поле fr_shift_number в структуры TicketRequest, MoneyPLacementRequest

27.01.2015

  • п. 3.5: добавлены новые поля fr_shift_number, withdraw_money в структуру CloseShiftRequest
  • п. 3.3: отсутствие payments в чеке теперь допустимо

1.2.1

30.10.2014

  • п. 3.3: удалено устаревшее и неиспользуемое поле ad_infos

1.2.0

12.08.2014

  • п. 3.2: дополнено описание полей в ответе на запрос COMMAND_INFO
  • п 3.4: дополнено уточнение: отменять чек можно, если между пробитием и отменой была команда инициализации (COMMAND_INFO)

26.06.2014

  • п. 3.3: Поправил примечания к налогам в чеке (List<TicketRequest::Tax>::size -> уникальность по percent)

25.06.2014

  • п. 2.4. дополнено более подробное описание клиентских действий, в случае получения кодов ошибок

16.06.2014

  • редакционные правки
  • добавлено описание приложенных тестов и proto файлов

10.06.2014

  • п. 3.30. дополнено более детальное разъяснение использования поля TicketRequest::Item::Commodity::code
  • названия полей приведены в соответствие с полями protobuf структур
  • п.3.30. добавлено упущенное описание поля TicketRequest::printed_ticket
  • п.3.80. добавлено упущенное описание поля NomenclatureResponse::Item::measure_fractional
  • п.3.50. добавлено поле CloseShiftRequest::is_offline
  • п.3.60. добавлено поле MoneyPlacementRequest::is_offline
  • п. 3.7. добавлено поле ReportRequest::is_offline
  • п.3.5.00 добавлено разъяснение способа работы в автономном режиме
  • п.5.20. исправлено описание алгоритма работы в автономном режиме (закрытие смены можно проводить в автономном режиме).

02.06.2014

  • Начальная инициализация

1.1.0.

29.05.2014

  • Посылка Z отчета в ответ на закрытие смены,
  • Более подробное разъяснение логики получения отчетов с сервера.

19.05.2014

  • Редакторские правки

07.04.2014

  • Описаны изменения в логике генерации токена

01.04.2014

  • описание аварийного режима перенесено в п.20;
  • удалены разделы, функциональность которых не реализована в настоящее время;
  • изменения в структуре документа, исправления ошибок

07.03.2014

  • п.п. 3.7, 3.8, 3.9, 3.10Ошибка! Источник ссылки не найден.: добавлено описание обязательности данных в списках.
  • п.3.7.: исправлены ошибки в описании полей discount и markup структуры TicketRequest::Amounts.

14.02.2014

  • добавлены п.0 4.11 и п. 4.120;
  • п. 3.9.0: изменена структура служебного запроса, добавлена структура служебного ответа;
  • добавлен пропущенный п.3.9.2;Ошибка! Источник ссылки не найден.
  • добавлен п.3.9.3Ошибка! Источник ссылки не найден., описывающий рекламные тексты чека;
  • п. 3.9.3.: в структуру чека добавлена информация о рекламных текстах;
  • п.Ошибка! Источник ссылки не найден.2.6.: в структуру ответа добавлен служебный пакет;
  • п.2.2.Ошибка! Источник ссылки не найден.: добавлено описание текстового представления числовой версии протокола;
  • п. приведен в соответствие с действующим протоколом.

1.0.1

23.01.2014

  • п.2.2.Ошибка! Источник ссылки не найден.: в заголовке сообщения изменен порядок следования полей, обновлено значение APPCODE , изменена размерность поля SIZE
  • изменен формат описания версии на X.Y.Z

100

15.01.2014

  • Первая опубликованная версия