Протокол управления драйвером ККМ
Структура команды
<ControlProtocol messageType="request">
КОМАНДА[+параметры]
</ControlProtocol>
В ранних версиях QKkmServer использовался атрибут password элемента ControlProtocol. начиная с версии 4.10.29 пароль не используется.
Рекомендуется использовать VPN или SSL-авторизацию.
Структура ответа
<ControlProtocol messageType="answer">
<error id="КОД_СТАТУСА" text="ОПИСАНИЕ_СТАТУСА"/>
<НАЗВАНИЕ_КОМАНДЫ [ПАРАМЕТРЫ] />
</ControlProtocol>
КОД_СТАТУСА - код ответа сервера. В случае успешного исполнения команды КОД_СТАТУСА=0
ОПИСАНИЕ_СТАТУСА - текстовое описание поля КОД_СТАТУСА. В случае успешного исполнения команды ОПИСАНИЕ_СТАТУСА=Ошибок нет.
НАЗВАНИЕ_КОМАНДЫ - название команды которая исполнялась сервером. За один сеанс работы сервер обрабатывает только одну команду.
ПАРАМЕТРЫ - ответы кассы, если данное предусмотрено.
Команды
В случае, если команда не возвращает каких-либо особенных параметров, то возвращается стандартная квитанция ответа в следующем формате:
<ControlProtocol messageType="answer">
<error id="0" text="Ошибок нет"/>
<КОМАНДА/>
</ControlProtocol>
Для облегчения описания такие ответы при описании протокола будут опускаться. Расшифровываться будут только ответы с параметрами.
Гудок
<Beep />
Продажа
<Sale
Text="НазваниеТовара"
Amount="1000"
Price="12345"
Group="2"
Tax1="0"
Tax2="0"
Tax3="0"
Tax4="0"
/>
Все величины указываются в МДЕ: граммах и копейках. В примере будет сформирована строка продажи 1000 единиц товара (к примеру, 1 КГ) товара НазваниеТовара по цене 123 рубля 45 коп во второй секции (группе) товаров без налогов.
Возврат продажи
Полностью аналогично формированию продажи товара.
<ReturnSale
Text="НазваниеТовара"
Amount="1000"
Price="12345"
Group="2"
Tax1="0"
Tax2="0"
Tax3="0"
Tax4="0"
/>
Промежуточный отчет без гашения
<XReport />
Закрытие смены (Z-отчет)
<ZReport />
Отчет по секциям ФР
<SectionsReport />
Аннулирование чека
<ChancelCheck />
Закрытие чека
<CloseCheck
SummaCash="СУММА"
Text="бла-бла-бла"
Discount="0"
Summa2="0"
Summa3="0"
Summa4="0"
Tax1="0"
Tax2="0"
Tax3="0"
Tax4="0"
/>
или можно использовать краткую форму
<CloseCheck
SummaCash="СУММА"
Text="бла-бла-бла"
Discount="2.3"
/>
Скидка
Введена в версии 3.6.4
<DiscountCheck
Summa="СУММА"
Text="бла-бла-бла"
Tax1="0"
Tax2="0"
Tax3="0"
Tax4="0"
/>
или можно использовать краткую форму
<DiscountCheck
Summa="СУММА"
Text="бла-бла-бла"
/>
Подытог чека
<SubTotal />
Продолжение печати после обрыва ленты или иной ошибки
<ContinuePrint />
Изъятие денег из кассы (инкассация)
<CashOut
Summa="СУММА"
/>
Запрос данных денежного регистра
<getMoneyReg
idReg="НОМЕР_РЕГИСТРА"
/>
Запрос данных из оперативного регистра
<getOperReg
idReg="НОМЕР_РЕГИСТРА"
/>
Обрезка чека
<CutCheck
isFullCut="0 или 1"
/>
Параметр isFullCut говорит о том, нужна ли полная отрезка чека или частичная
Печать произвольного текста
<PrintTextLine
DocumentType="docCheck"
Text="СТРОКА ТЕКСТА"
/>
DocumentType | на какой ленте (документе) вывести стоку текста | |
docCheck docControl docList |
на чековую ленту на контрольную ленту на подкладной документ |
Строка текста обрезается до 38 символов. Если в вашей программе необходимо выводить длинную строку, то разбейте эту строку на подстроки длиной по 38 символов в печатайте каждую подстроку.
Печать произвольного количества строк текста
Введена в версии 4.4.4
<PrintTextLineLong
DocumentType="docCheck"
Text="СТРОКИ ТЕКСТА"
/>
DocumentType | на какой ленте (документе) вывести стоку текста | |
docCheck docControl docList |
на чековую ленту на контрольную ленту на подкладной документ |
В параметре Text передаются все строки слитые через разделитель строк последовательность #kkm_br#. Text="Строка1#kkm_br#Строка2#kkm_br#Строка3" выведет на ККМ
Строка1
Строка2
Строка3
Обращаем внимание, что драйвер не анализирует успешность печати строки и в случае возникновения промежуточной ошибки оперативно узнать о ней в системе управления не удастся.
Каждая строка/подстрока текста обрезается до 40 символов. Обратите на это внимание.
Повтор документа
Введена в версии программы 3.3 от 02 мая 2013
<RepeatDocument />
Продвинуть документ
<FeedDocument
Positions="10"
DocumentType="docCheck"
/>
Positions | на сколько линий (строк) продвинуть документ | |
DocumentType | какой документ необходимо продвинуть | |
docCheck docControl docList |
чековую ленту контрольную ленту подкладной документ |
Полный статус ККМ
<getDeviceStatus />
Ответ:
<getDeviceStatus
isOnline="1"
deviceErrorCode="0"
dateFR="2012.12.11"
timeFR="20:03:20"
inn="88888888"
serialNumber="123456"
versionSoftFR="A.1"
dateSoftFR="Пт мар 22 2002"
buildSoftFR="4563"
versionSoftFiscalMemory="1.1"
dateSoftFiscalMemory="Пн сен 17 2001"
numberFR="1"
modeFR="8"
subModeFR="0"
flagsFiscalMemory="5"
operatorNumber="30"
portFR="0"
countLeftRefiscalizations="14"
currentDocNumber="284"
numberLastClousedSession="631"
countRefiscalizations="2"
flagsFR="979"
buildSoftFiscalMemory="31"
countFreeRecordsInFiscalMemory="1469"
isBufferNotEmpty="0"
isCapOpen="0"
isRollOperationJournalPresent="1"
isOpticalSensorCheckTape="1"
isDecimalPointPosition="1"
isUpperSensorPresent="0"
isLeverThermalHeadCheckTape="1"
isLeverThermalHeadControlTape="1"
isEklzFull="0"
isErrorRightSensor="0"
isErrorLeftSensor="0"
isRollCheckTapePresent="1"
isMoneyBoxOpen="0"
isEklzPresent="0"
isOpticalSensorOperationJournal="1"
isLowerSensorPresent="0"
statusMessageHTML="HTML-описание статуса"
/>
Описание параметров ответа
isOnline | ККМ на связи или нет |
deviceErrorCode | код ошибки по протоколу 1.7 Штрих-М |
dateFR | текущая дата в часах ККМ |
timeFR | текущее время в часах ККМ |
inn | ИНН |
serialNumber | заводской номер |
versionSoftFR | версия программного обеспечения |
dateSoftFR | дата сборки прошивки |
buildSoftFR | номер сборки прошивки |
versionSoftFiscalMemory | версия прошивки фискальной памяти |
dateSoftFiscalMemory | дата изготовления прошивки фискальной памяти |
numberFR | логический номер ККМ в зале |
modeFR | режим работы ККМ |
subModeFR | номер подрежима работы ККМ |
flagsFiscalMemory | флаги фискальной памяти |
operatorNumber | номер оператора |
portFR | использование внешнего порта ККМ |
countLeftRefiscalizations | количество оставшихся операций рефискализации |
currentDocNumber | номер открытого документа продажи |
numberLastClousedSession | номер последней закрытой сессии |
countRefiscalizations | количество фискализаций которые уже были |
flagsFR | флаги ККМ |
buildSoftFiscalMemory | номер сборки прошивки фискальной памяти |
countFreeRecordsInFiscalMemory | количество свободных записей в фискальной памяти |
Логические параметры (0 - ложь, 1- истина) | |
isBufferNotEmpty | буфер документа не пуст |
isCapOpen | состояние крышки ККМ |
isMoneyBoxOpen | состояние денежного ящика |
isRollOperationJournalPresent | наличие ленты операционного журнала (контрольной ленты) |
isLeverThermalHeadControlTape | положение заслонки (рычага) контрольной ленты |
isOpticalSensorOperationJournal | контрольная лента вставлена |
isRollCheckTapePresent | наличие чековой ленты |
isOpticalSensorCheckTape | чековая лента заправлена (оптический датчик) |
isLeverThermalHeadCheckTape | состояние заслонка термопринтера чековой ленты |
isUpperSensorPresent | состояние верхнего датчика |
isErrorRightSensor | ошибка правого датчика |
isErrorLeftSensor | ошибка левого датчика |
isDecimalPointPosition | положение десятичного разделителя |
isEklzFull | состояние ЭКЛЗ (закончилась?) |
isEklzPresent | ЭКЛЗ присутствует в ККМ? |
isLowerSensorPresent | нижний датчик присутствует (подкладного документа) |
statusMessageHTML | подготовленный в формате HTML описатель состояния кассы (для встраивания в виджет) |
Поддержка 54-ФЗ - Онлайн-кассы Штрих-М
Для осуществления поддержки онлайн-касс добавлены следующие команды протокола (обязательные)
Открыть смену
<OpenSession />
Открыть смену в фискальном накопителе
<OpenSessionFN />
Возвращаемые значения:
newSessionFNId -- номер новой открытой смены
numberFD -- номер фискального документа
fiskalMark -- фискальный признак
Передать TLV-структуру
TLV -- type-lenght-value структура предназначена для предачи различных параметров на сервера ОФД. Как пример - тег 1008 -- передача телефонного номера или электронной почты на сервер ОФД.
<SetTLV type="целое_число" len="длина" data="данные" />