АТОЛ. OPOS-драйвер v.1.14.1 АТОЛ. OPOS-драйвер v.1.14.1

АТОЛ. OPOS-драйвер v.1.14.1

Начало работы с OPOS-драйвером

В результате установки OPOS через инсталлятор в операционной системе Windows произойдут следующие изменения:

  • Зарегистрирован COM-объект для OPOS Common Control Object.
  • Зарегистрирован COM-объект для OPOS Service Object.
  • В реестре создается ветка HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\OLEforRetail\ServiceOPOS\FiscalPrinter\DeviceName, где {DeviceName} - произвольное имя ККТ, указываемое пользователем на этапе инсталляции. Данное имя ветки для x64 версии Windows, для x86 - такое же, но без раздела WOW6432Node.
  • Указанная ветка содержит один параметр по-умолчанию со значением AddIn.AtolOposFptr10 - это имя COM-объекта для OPOS Service Object. Также ветка содержит набор параметров для OPOS со значениями по-умолчанию.

Кассовое ПО создает экземпляр Common Control Object, затем обращается к его методам и свойствам. При вызове метода Open({DeviceName}) в качестве {DeviceName} должно передаваться то же имя фискального устройства. Когда Open() вызывается первый раз, в указанной ветке реестра автоматически создается набор параметров со значениями по-умолчанию. В дальнейшем значения параметров можно менять, таким образом настраивая OPOS-драйвер. При последующих вызовах Open измененные значения параметров читаются из реестра и используются при работе OPOS-драйвера.

Примечание: Далее в документации приведены различные примеры использования OPOS-драйвера - в них используется синтаксис Windows PowerShell

Настройка OPOS-драйвера

Настройка драйвера осуществляется через задание предопределенных параметров реестра, описывающих устройство по стандарту OPOS. Расположение параметров в реестре описано в предыдущем пункте. Доступные следующие настройки:

  • настройки связи с ККТ:
    • channel - канал обмена с ККТ. Может принимать значения COM, USB, BLUETOOTH, TCP.
    • com - название порта RS232 (для channel = COM). Принимает значения COMN, где N - номер порта.
    • baudrate - скорость порта RS232, бод (для channel = COM). Может принимать значения 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 912600.
    • ip - IP-адрес и порт ККТ (для channel = TCP). Формат - host:port.
    • mac - MAC-адрес ККТ (для channel = BLUETOOTH). Формат - XX:XX:XX:XX:XX:XX.
  • настройки идентификаторов типов оплат. Значениями являются строки произвольной длины, которые будет использоваться в параметре Description метода PrintRecTotal():
    • paymentCash - идентификатор оплаты наличными.
    • paymentElectronically - идентификатор оплаты безналичными.
    • paymentPrepaid - идентификатор оплаты предварительной оплатой (авансом).
    • paymentCredit - идентификатор оплаты последующей оплатой (кредитом).
    • paymentOther - идентификатор оплаты иной формой оплаты (встречным предоставлением).
    • payment6 - идентификатор оплаты, соответствующий расширенному типу оплаты №6 в ККТ.
    • payment7 - идентификатор оплаты, соответствующий расширенному типу оплаты №7 в ККТ.
    • payment8 - идентификатор оплаты, соответствующий расширенному типу оплаты №8 в ККТ.
    • payment9 - идентификатор оплаты, соответствующий расширенному типу оплаты №9 в ККТ.
    • payment10 - идентификатор оплаты, соответствующий расширенному типу оплаты №10 в ККТ.
  • настройки типов оплат в ККТ:
    • payment6Name - наименовение типа оплаты №6.
    • payment7Name - наименовение типа оплаты №7.
    • payment8Name - наименовение типа оплаты №8.
    • payment9Name - наименовение типа оплаты №9.
    • payment10Name - наименовение типа оплаты №10.
    • payment6FiscalType - привязка типа оплаты №6 к способу расчета (2 - безналичными, 3 - аванс, 4 - кредит, 5 - встречное предоставление).
    • payment7FiscalType - привязка типа оплаты №7 к способу расчета (2 - безналичными, 3 - аванс, 4 - кредит, 5 - встречное предоставление).
    • payment8FiscalType - привязка типа оплаты №8 к способу расчета (2 - безналичными, 3 - аванс, 4 - кредит, 5 - встречное предоставление).
    • payment9FiscalType - привязка типа оплаты №9 к способу расчета (2 - безналичными, 3 - аванс, 4 - кредит, 5 - встречное предоставление).
    • payment10FiscalType - привязка типа оплаты №10 к способу расчета (2 - безналичными, 3 - аванс, 4 - кредит, 5 - встречное предоставление).
  • настройки налоговых ставок. Значениями являются числа, которые будут использоваться в параметре VatInfo методов PrintRecItem() и PrintRecItemRefund(), а также в DirectIO #1026 (регистрация налога на чек):
    • vat0 - идентификатор налоговой ставки “НСД 0%”.
    • vatNo - идентификатор налоговой ставки “НСД не облагается”.
    • vat10 - идентификатор налоговой ставки “НСД 10%”.
    • vat18 - идентификатор налоговой ставки “НСД 20%” и “НСД 18%”.
    • vat110 - идентификатор налоговой ставки “НДС расчитанный 10/110”.
    • vat118 - идентификатор налоговой ставки “НДС расчитанный 20/120” и “НДС расчитанный 18/118”.
  • настройки клише:
    • numHeaderLines - количество строк заголовка чека (клише).
    • numTrailerLines - количество строк подвала чека (реклама).
    • picturesFileName - путь к файлу с описанием картинок для загрузки в ККТ. Если количество картинок в файле расходится с текущим количеством в ККТ, то картинки в ККТ удаляются и загружаются новые.
    • clichePicturePrefix - подстрока, по которой драйвер будет определять строку клише с картинкой. Формат строки клише для печати картинки: {PREFIX}N,M{PREFIX}, где
      • {PREFIX} - значение настройки clichePicturePrefix,
      • N - номер картинки (картинки грузятся из файла picturesFileName по-порядку, нумеруются с 1)
      • M - смещение при печати картинки, в пикселях
      Например, #$1,15#$ соответствует печати в строке клише картинки №1 со смещением 15 пикселей.
  • настройки печати:
    • printNonFiscalFooter - если значение равно 1, то при вызове EndNonFiscalReceipt() печатается и подвал чека, и клише. Если 0 - только клише.
    • defaultFont - шрифт нефискальных строк по умолчанию. Влияет на печать строк методами PrintRecMessage() и PrintNormal(), а также на любые строки, которые драйвер будет печатать самостоятельно. Не влияет на печать строк через DirectIO #1001 (печать строки с форматированием).
  • различные кастомизации:
    • grandTotalsWithShiftTotals - если 1, то необнуляемый итог, получаемый с помощью запроса GetData(FPTR_GD_GRAND_TOTAL), возвращается с учетом сменного.
    • grandTotalsInCents - если 1, то необнулямый итог, получаемый с помощью запроса GetData(FPTR_GD_GRAND_TOTAL), возвращается в копейках.
    • checkSubtotal - если 1, то сумма итога, переданная в методе PrintRecSubtotal(), проверяется на соответствие той, которая была подсчитана драйвером. Если будет расхождение - драйвер вернет ошибку.
    • unitNameAsAttribute - если 1, то интерпретировать параметр unitName метода PrintRecItem() как значение реквизита 1197 (единицы измерения предмета расчета).
    • receiptNumberType - если 1, то на запрос GetData(FPTR_GD_RECEIPT_NUMBER) будет возвращаться номер последнего документа ФН. Если 0 - номер чека в смене из ФН.
    • cacheRecMessages - если 1, то все данные, поданные на печать методом PrintRecMessage() или DirectIO #1001 или #1002 в состоянии FPTR_PS_FISCAL_RECEIPT_ENDING, будут напечатаны после закрытия чека.
    • openShiftBeforeClose - если 1, то драйвер будет открывать смену перед её закрытием при вызове PrintZReport().
    • invertCashDrawerStatus - если 1, то драйвер будет инвертировать возвращаемое состояние денежного ящика.

Передача сумм и количеств

Во всех методах, где передаются суммы и количества, действуют такие особенности передачи параметров:

  • Все суммы передаются типом CY. Значение суммы передается как есть. Максимальное количество знаков после запятой равно 4. Если передается больше 2-х знаков после запятой, происходит округление до 2-х знаков.
  • Все количества (например, количество товара в позиции) передается типом LONG. Далее переданное целое значение делится на 1000 (например, если в позиции 2 шт. - нужно передать значение 2000).

Свойства в OPOS

В стандарте OPOS предусмотрен набор свойств. Некоторые свойства доступны только для чтения (например, состояние ККТ) - их значение может меняться только внутренней логикой драйвера. Другие свойства доступны для записи - их значение можно менять извне. Свойства делятся на строковые (хранят строковое значение) и числовые (хранят целое число):

  • строковые - чтение и запись значения производится методами GetPropertyString({PropIndex}) и SetPropertyString({PropIndex}, {PropVal}).
  • числовые - чтение и запись значения производится методами GetPropertyNumber({PropIndex}) и SetPropertyNumber({PropIndex}, {PropVal}).

Где {PropIndex} - идентификатор свойства, {PropVal} - устанавливаемое значение свойства (строковое или числовое). Пример - получить состояние ККТ. Возвращаемое число соответствует одной из OPOS-констант, описывающих состояния ККТ:

[int] $statePrinter = $fptr.GetPropertyNumber(PIDXFptr_PrinterState) 

Пример - получить состояние крышки ККТ (возвращаемое значение 0 - закрыта, 1 - открыта):

[int] $stateCoverOpen = $fptr.GetPropertyNumber(PIDXFptr_CoverOpen) 

Пример - установить значение строки PreLine (она выводится при печати позиции чека перед данными позиции):

$fptr.SetPropertyString(PIDXFptr_PreLine, "Значение PreLine") 

Поддержка стандартных операций

Регистрация кассира

С помощью метода SetPOSID() и DirectIO #1038 можно задать имя кассира. С помощью DirectIO #1027 - ИНН кассира. Заданные таким образом параметры будут актуальны на время всей жизни экземпляра драйвера.

Печать чека

Открытие чека

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

  • FPTR_RT_SALES - чек прихода
  • FPTR_RT_REFUND - чек возврата прихода
  • 100 - чек коррекции прихода (не входит в стандарт UPOS)
  • 101 - чек коррекции возврата прихода (не входит в стандарт UPOS)
  • 102 - чек расхода (не входит в стандарт UPOS)
  • 103 - чек возврата расхода (не входит в стандарт UPOS)
  • 104 - чек коррекции расхода (не входит в стандарт UPOS)
  • 105 - чек коррекции возврата расхода (не входит в стандарт UPOS)

Далее вызвать метод открытия чека BeginFiscalReceipt(), параметры метода игнорируются. Метод можно вызвать только из состояния FPTR_PS_MONITOR. Он переводит драйвер в состояние FPTR_PS_FISCAL_RECEIPT.

$fptr.SetPropertyNumber(PIDXFptr_FiscalReceiptType, FPTR_RT_SALES)
$fptr.BeginFiscalReceipt(true);

Драйвер предоставляет возможность не печатать чек на чековой ленте. Для этого служит DirectIO #1009.

Регистрация реквизита чека

В стандарте UPOS нет способа зарегистрировать реквизит чека. Потому драйвер предоставляет данный функционал через метод DirectIO(). Для этого используется DirectIO #1010.

Регистрация позиции чека продажи / покупки

Для регистрации позиции чека продажи / покупки используется следующий код:

$fptr.PrintRecItem("*1860 Напиток COCA-COLA газ.ПЭТ  2.0л", 40.00, 2000, 1, 20.00, "кг")

При этом будет зарегистрирована простейшая позиция с наименованием “*1860 Напиток COCA-COLA газ.ПЭТ 2.0л”, общей суммой 40.00, количеством 2.000, ценой за единицу 20.00, ставкой налога #1 и единицей измерения кг. Способ обработки единицы измерения подчиняется настройке unitNameAsAttribute. Налоговые ставки регулируются настройками vat0, vatNo, vat10, vat110, vat18, vat118. Вызов данного метода не требуется для регистрации чеков коррекции по ФФД 1.0 и 1.05.

Регистрация позиции чека возврата продажи / покупки

Для регистрации позиции чека возврата продажи / покупки используется следующий код:

$fptr.PrintRecItemRefund("*1860 Напиток COCA-COLA газ.ПЭТ  2.0л", 40.00, 2000, 1, 20.00, "кг");

При этом будет зарегистрирована простейшая позиция с наименованием “*1860 Напиток COCA-COLA газ.ПЭТ 2.0л”, общей суммой 40.00, количеством 2.000, ценой за единицу 20.00, ставкой налога #1 и единицей измерения кг. Способ обработки единицы измерения подчиняется настройке unitNameAsAttribute. Налоговая ставка регулируется настройками vat0, vatNo, vat10, vat110, vat18, vat118. Вызов данного метода не требуется для регистрации чеков коррекции по ФФД 1.0 и 1.05.

Скидка на позицию

Для регистрации скидки на позицию используется метод PrintRecItemAdjustment(). Сам метод на итоговую сумму чека не влияет, т.е. реальной скидки не делает, а только передает ее значение в ККТ для печати на чековой ленте. Драйвер обрабатывает только сумму скидки и её тип, остальные параметры игнорируются. Поддерживаются только суммовые скидки (тип FPTR_AT_AMOUNT_DISCOUNT).

$fptr.PrintRecItemAdjustment(FPTR_AT_AMOUNT_DISCOUNT, "", 0.90, 1);

Вызов данного метода не требуется для регистрации чеков коррекции по ФФД 1.0 и 1.05.

Сумма налога на позицию

Для регистрации суммы налога на позицию используется метод DirectIO #1033.

[string] $vatValue = "10000"
$fptr.DirectIO(1033, null, [ref]$vatValue)

Вызов данного метода не требуется для регистрации чеков коррекции по ФФД 1.0 и 1.05. Сумму налога нужно передавать после регистрации позиции (передается в копейках в виде строки).

Регистрация реквизита позиции

В стандарте UPOS нет способа зарегистрировать реквизит позиции. Потому драйвер предоставляет данный функционал через метод DirectIO(). Для этого используется DirectIO #1011. Его нужно вызвать до регистрации самой позиции. Допускается регистрация нескольких реквизитов. Вызов данного метода не требуется для регистрации чеков коррекции по ФФД 1.0 и 1.05.

Печать строки

Для печати строки на чековой ленте внутри чека используется метод PrintRecMessage(). Поведение метода подчиняется настройкам cacheRecMessages и defaultFont.

$fptr.PrintRecMessage("Строка");

Также внутри чека будет работать метод PrintNormal(). Поддерживается только печать на чековой ленте (FPTR_S_RECEIPT). Поведение метода НЕ подчиняется настройке cacheRecMessages, но подчиняется defaultFont.

$fptr.PrintNormal(FPTR_S_RECEIPT, "Строка");

Т.к. UPOS не позволяет менять форматирование текста, для этого можно использовать DirectIO #1001.

Печать штрихкода

В стандарте UPOS нет способа напечатать штрихкод. Потому драйвер предоставляет данный функционал через метод DirectIO(). Для этого используется DirectIO #1002.

Регистрация скидки на чек

Драйвер позволяет зарегистрировать скидку-округления на чек. Для этого служит метод PrintRecSubtotalAdjustment(). Поддреживается только один тип скидки - FPTR_AT_AMOUNT_DISCOUNT.

$fptr.PrintRecSubtotalAdjustment(FPTR_AT_AMOUNT_DISCOUNT, "", 0.90);

Вызов данного метода не требуется для регистрации чеков коррекции по ФФД 1.0 и 1.05.

Регистрация налога на чек

В стандарте UPOS нет способа зарегистрировать налог на чек. Потому драйвер предоставляет данный функционал через метод DirectIO(). Для этого используется DirectIO #1026. Метод доступен из состояний FPTR_PS_FISCAL_RECEIPT и FPTR_PS_FISCAL_RECEIPT_TOTAL.

Регистрация оплаты

Для регистрации оплаты используется метод PrintRecTotal(). Драйвер обрабатывает только сумму и тип оплаты, сумма итога не обрабатывается. Типы оплат регулируются настройками paymentCash, paymentElectronically, paymentPrepaid, paymentCredit, paymentOther, payment6, payment7, payment8, payment9, payment10.

$fptr.PrintRecTotal(79.00, 79.00, "00");

Метод доступен из состояний FPTR_PS_FISCAL_RECEIPT и FPTR_PS_FISCAL_RECEIPT_TOTAL. Первая оплата переводит драйвер в состояние FPTR_PS_FISCAL_RECEIPT_TOTAL. Как только чек полностью оплачивается, драйвер переводится в состояние FPTR_PS_FISCAL_RECEIPT_ENDING.

Отмена чека

Для отмены чека необходимо вызвать метод PrintRecVoid(), а после него закрыть чек. Параметры метода игнорируются.

$fptr.PrintRecVoid("");

Метод переводит драйвер в состояние FPTR_PS_FISCAL_RECEIPT_ENDING.

Закрытие чека

Для закрытия чека необходимо вызвать метод EndFiscalReceipt(). Параметры метода игнорируются.

$fptr.EndFiscalReceipt(false);

Метод доступен из состояний FPTR_PS_FISCAL_RECEIPT и FPTR_PS_FISCAL_RECEIPT_ENDING. Метод переводит драйвер в состояние FPTR_PS_MONITOR.

Пример формирования чека продажи

// Открытие чека
$fptr.SetPropertyNumber(PIDXFptr_FiscalReceiptType, FPTR_RT_SALES)
$fptr.BeginFiscalReceipt(true);

// Дополнительные реквизиты чека - СНО, телефон получателя электронного чека
[int] $d = 5 /*номер реквизита*/
[string] $s = "0;1" /*0 - тип реквизита (целое); 1 - значение (ОСН)*/
$fptr.DirectIO(1010, [ref]$d, [ref]$s)
$d = 1
$s = "1;client@mail.ru"
$fptr.DirectIO(1010, [ref]$d, [ref]$s)

// Регистрация позиции с дополнительными реквизитами и скидкой
$d = 3
$s = "0;2"
$fptr.DirectIO(1010, [ref]$d, [ref]$s) // Признак предмета расчета
$fptr.PrintRecItem("Товар 1", 40.00, 2000, 1, 20.00, "шт");
$fptr.PrintRecItemAdjustment(FPTR_AT_AMOUNT_DISCOUNT, "", 0.90, 1);

// Нефискальный текст - разделитель позиций
$fptr.PrintRecMessage("----------------------------------------------------------------");

// Регистрация простейшей позиции
$fptr.PrintRecItem("Товар 2", 39.90, 1000, 1, 39.90, "");

// Скидка-округление на чек
$fptr.printRecSubtotalAdjustment(FPTR_AT_AMOUNT_DISCOUNT, "", 0.90);

// Оплата
$fptr.PrintRecTotal(79.00, 79.00, "00");

// Закрытие чека
$fptr.EndFiscalReceipt(false);

Пример формирования чека продажи без печати на чековой ленте

// Открытие чека
$fptr.SetPropertyNumber(PIDXFptr_FiscalReceiptType, FPTR_RT_SALES)
$fptr.BeginFiscalReceipt(true);
$fptr.DirectIO(1009, null, null);

// Дополнительные реквизиты чека - СНО, телефон получателя электронного чека
[int] $d = 5 /*номер реквизита*/
[string] $s = "0;1" /*0 - тип реквизита (целое); 1 - значение (ОСН)*/
$fptr.DirectIO(1010, [ref]$d, [ref]$s)
$d = 1
$s = "1;client@mail.ru"
$fptr.DirectIO(1010, [ref]$d, [ref]$s)

// Регистрация позиции с дополнительными реквизитами и скидкой
$d = 3
$s = "0;2"
$fptr.DirectIO(1010, [ref]$d, [ref]$s) // Признак предмета расчета
$fptr.PrintRecItem("Товар 1", 40.00, 2000, 1, 20.00, "шт");
$fptr.PrintRecItemAdjustment(FPTR_AT_AMOUNT_DISCOUNT, "", 0.90, 1);

// Нефискальный текст - разделитель позиций
$fptr.PrintRecMessage("----------------------------------------------------------------");

// Регистрация простейшей позиции
$fptr.PrintRecItem("Товар 2", 39.90, 1000, 1, 39.90, "");

// Скидка-округление на чек
$fptr.printRecSubtotalAdjustment(FPTR_AT_AMOUNT_DISCOUNT, "", 0.90);

// Оплата
$fptr.PrintRecTotal(79.00, 79.00, "00");

// Закрытие чека
$fptr.EndFiscalReceipt(false);

Пример формирования чека продажи с табачным товаром

// Открытие чека
$fptr.SetPropertyNumber(PIDXFptr_FiscalReceiptType, FPTR_RT_SALES)
$fptr.BeginFiscalReceipt(true);

// Регистрация табачной позиции
[string] $s = "98765432101234;ABC1234"
$fptr.DirectIO(1029, null, [ref]$s)
$fptr.PrintRecItem("Табак", 40.00, 2000, 1, 20.00, "шт")

// Оплата
$fptr.PrintRecTotal(40.00, 40.00, "00")

// Закрытие чека
$fptr.EndFiscalReceipt(false);

Пример формирования чека возврата

// Открытие чека
$fptr.SetPropertyNumber(PIDXFptr_FiscalReceiptType, FPTR_RT_REFUND)
$fptr.BeginFiscalReceipt(true);

// Регистрация позиции
$fptr.PrintRecItemRefund("Табак", 40.00, 2000, 1, 20.00, "шт");

// Оплата
$fptr.PrintRecTotal(40.00, 40.00, "00");

// Закрытие чека
$fptr.EndFiscalReceipt(false);

Пример формирования чека коррекции (ФФД 1.0 и 1.05)

// Открытие чека
$fptr.SetPropertyNumber(PIDXFptr_FiscalReceiptType, 100);
$fptr.BeginFiscalReceipt(true);

// Основание для коррекции
[int] $d = 20
[string] $s = "0;0"
$fptr.DirectIO(1010, [ref]$d, [ref]$s)
$d = 21
$s = "1;№ 1234"
$fptr.DirectIO(1010, [ref]$d, [ref]$s)
$d = 22
$s = "4;01012018000000"
$fptr.DirectIO(1010, [ref]$d, [ref]$s)
$d = 23
$s = "1;Документ коррекции"
$fptr.DirectIO(1010, [ref]$d, [ref]$s)

// Налоги
$d = 1
$s = "1000"
$fptr.DirectIO(1026, [ref]$d, [ref]$s)
$d = 2
$s = "1300"
$fptr.DirectIO(1026, [ref]$d, [ref]$s)

// Оплаты
$fptr.PrintRecTotal(1000.00, 200.00, "00")
$fptr.PrintRecTotal(1000.00, 800.00, "10")

// Закрытие чека
$fptr.EndFiscalReceipt(false)

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

Для закрытия смены используется метод PrintZReport(). Автоматическое открытие смены регулируется настройкой openShiftBeforeClose.

Печать X-отчета

Для печати X-отчета используется метод PrintXReport().

Печать отчета о состоянии расчетов

Для печати отчета о состоянии расчетов вызовите PrintReport(), указав тип отчета равный 100. Остальные параметры метода игнорируются.

$fptr.PrintReport(100, "", "");

Внесения / выплаты

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

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

  • FPTR_RT_CASH_IN - внесение
  • FPTR_RT_CASH_OUT - выплата

Далее вызвать метод BeginFiscalReceipt(), параметры метода игнорируются.

$fptr.SetPropertyNumber(PIDXFptr_FiscalReceiptType, FPTR_RT_CASH_IN);
$fptr.BeginFiscalReceipt(true);

Метод можно вызвать только из состояния FPTR_PS_MONITOR. Метод переводит драйвер в состояние FPTR_PS_FISCAL_RECEIPT.

Регистрация внесения / выплаты

Для регистрации внесения / выплаты используется метод PrintRecCash(). Все суммы складываются и передаются в ККТ.

$fptr.PrintRecCash(100.00);

Отмена документа внесения / выплаты

Для отмены документа внесения / выплаты необходимо вызвать метод PrintRecVoid(), а после него закрыть документ. Параметры метода игнорируются.

$fptr.PrintRecVoid("");

Метод переводит драйвер в состояние FPTR_PS_FISCAL_RECEIPT_ENDING.

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

Для закрытия документа внесения / выплаты необходимо вызвать метод EndFiscalReceipt(). Параметры метода игнорируются.

$fptr.EndFiscalReceipt(false);

Метод доступен из состояний FPTR_PS_FISCAL_RECEIPT и FPTR_PS_FISCAL_RECEIPT_ENDING. Метод переводит драйвер в состояние FPTR_PS_MONITOR.

Пример формирования внесения

// Открытие внесения
$fptr.SetPropertyNumber(PIDXFptr_FiscalReceiptType, FPTR_RT_CASH_IN);
$fptr.BeginFiscalReceipt(true);

// Внесение сумм
$fptr.PrintRecCash(100.00);
$fptr.PrintRecCash(200.00);

// Закрытие внесения
$fptr.EndFiscalReceipt(false);

Нефискальные документы

Открытие нефискального документа

Для открытия нефискального документа используется метод BeginNonFiscal().

$fptr.BeginNonFiscal();

Метод можно вызвать только из состояния FPTR_PS_MONITOR. Метод переводит драйвер в состояние FPTR_PS_FISCAL_RECEIPT.

Закрытие нефискального документа

Для закрытия нефискального документа используется метод EndNonFiscal().

$fptr.EndNonFiscal();

Метод переводит драйвер в состояние FPTR_PS_MONITOR.

Печать строки

Для печати строки на чековой ленте внутри нефискального документа используется метод PrintNormal(). Поведение метода подчиняется настройке defaultFont.

$fptr.PrintNormal(FPTR_S_RECEIPT, "Строка");

Т.к. UPOS не позволяет менять форматирование текста, для этого можно использовать DirectIO #1001.

Печать штрихкода

В стандарте UPOS нет способа напечатать штрихкод. Потому драйвер предоставляет данный функционал через метод DirectIO(). Для этого используется DirectIO #1002.

Пример печати нефискального документа (на примере слипа ЕГАИС)

// Открытие нефискального документа
$fptr.BeginNonFiscal();

// Печать строк и штрихкодов
$fptr.PrintNormal(FPTR_S_RECEIPT, "ИНН: 111111111111 КПП: 222222222");
$fptr.PrintNormal(FPTR_S_RECEIPT, "КАССА: 1               СМЕНА: 11");
$fptr.PrintNormal(FPTR_S_RECEIPT, "ЧЕК: 314  ДАТА: 20.11.2017 15:39");

[int] $d = 11;
[string] $s = "7;0;0;https://check.egais.ru?id=cf1b1096-3cbc-11e7-b3c1-9b018b2ba3f7";
$fptr.DirectIO(1002, [ref]$d, [ref]$s);
$fptr.PrintNormal(FPTR_S_RECEIPT, "");
$fptr.PrintNormal(FPTR_S_RECEIPT, "https://check.egais.ru?id=cf1b1096-3cbc-11e7-b3c1-9b018b2ba3f7");
$fptr.PrintNormal(FPTR_S_RECEIPT, "");
$fptr.printNormal(FPTR_S_RECEIPT, "10 58 1c 85 bb 80 99 84 40 b1 4f 35 8a 35 3f 7c " +
        "78 b0 0a ff cd 37 c1 8e ca 04 1c 7e e7 5d b4 85 " +
        "ff d2 d6 b2 8d 7f df 48 d2 5d 81 10 de 6a 05 c9 " +
        "81 74");

// Закрытие нефискального документа
$fptr.EndNonFiscal();

Запросы информации о ККТ и драйвере

Описание драйвера

Для запроса описания драйвера читаем стороковое свойство PIDX_ServiceObjectDescription. Работа со свойствами описана выше в отдельном разделе.

Версия драйвера

Для запроса версии драйвера читаем стороковое свойство PIDX_ServiceObjectVersion.

Описание устройства

Для запроса описания устройства читаем стороковое свойство PIDX_DeviceDescription.

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

Для запроса наименования устройства читаем стороковое свойство PIDX_DeviceName.

Ширина ленты в символах

Для запроса ширины ленты читаем числовое свойство PIDXFptr_MessageLength.

Количество строк заголовка клише

Для запроса количества строк читаем числовое свойство PIDXFptr_NumHeaderLines, возвращает значение настройки numHeaderLines.

Количество строк подвала клише

Для запроса количества строк читаем числовое свойство PIDXFptr_NumTrailerLines, возвращает значение настройки numTrailerLines.

Запросы состояния

Состояние крышки

Для запроса состояния крышки читаем числовое свойство PIDXFptr_CoverOpen.

Состояние бумаги

Для запроса состояния бумаги читаем числовое свойство PIDXFptr_RecEmpty.

Состояние смены

Для запроса состояния смены читаем числовое свойство PIDXFptr_DayOpened.

Дата и время

Для запроса текущих даты и времени нужно установить числовому свойству PIDXFptr_DateType значение FPTR_DT_RTC, затем вызвать метод GetDate().

$fptr.SetPropertyNumber(PIDXFptr_DateType, FPTR_DT_RTC);
[string] $date;
$fptr.getDate([ref]$date);

Т.к. по стандарту UPOS нельзя получить время с точностью до секунды, драйвер предоставляет DirectIO #1015 для этого.

Дата и время начала смены

Для запроса даты и времени начала смены нужно установить числовому свойству PIDXFptr_DateType значение FPTR_DT_START, затем вызвать метод GetDate().

$fptr.SetPropertyNumber(PIDXFptr_DateType, FPTR_DT_START);
[string] $date;
$fptr.getDate([ref]$date);

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

Для запроса даты и времени истечения смены нужно установить числовому свойству PIDXFptr_DateType значение FPTR_DT_EOD, затем вызвать метод GetDate().

$fptr.SetPropertyNumber(PIDXFptr_DateType, FPTR_DT_EOD);
[string] $date;
$fptr.getDate([ref]$date);

Запросы счетчиков

Текущая сумма чека

Для запроса текущей суммы чека нужно вызвать метод GetData() с типом запроса FPTR_GD_CURRENT_TOTAL.

[string] $result;
$fptr.GetData(FPTR_GD_CURRENT_TOTAL, null, [ref]$result);

Номер чека

Для запроса номера чека нужно вызвать метод GetData() с типом запроса FPTR_GD_RECEIPT_NUMBER.

[string] $result;
$fptr.GetData(FPTR_GD_RECEIPT_NUMBER, null, [ref]$result);

Если настройка receiptNumberType имеет значение 0, то возвращается номер чека в смене. Если она равна 1, то возвращается номер документа из ФН.

Номер смены

Для запроса номера смены нужно вызвать метод GetData() с типом запроса FPTR_GD_Z_REPORT.

[string] $result;
$fptr.GetData(FPTR_GD_Z_REPORT, null, [ref]$result);

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

Для запроса заводского номера ККТ нужно вызвать метод GetData() с типом запроса FPTR_GD_PRINTER_ID.

[string] $result;
$fptr.GetData(FPTR_GD_PRINTER_ID, null, [ref]$result);

Версия ПО ККТ

Для запроса версии ПО ККТ нужно вызвать метод GetData() с типом запроса FPTR_GD_FIRMWARE.

[string] $result;
$fptr.GetData(FPTR_GD_FIRMWARE, null, [ref]$result);

Обработка ошибок и логирование

Вызов любого метода драйвера никогда не выбрасывает исключений “наружу” - с точки зрения COM-технологии вызов функций всегда успешный. Чтобы определить, успешно ли вызван метод, а также расшифровать ошибку в случае неуспешного вызова, предусмотрены следующие возможности:

  • У каждого метода есть возвращаемый результат - это целое число. Его значение соответствует одной из констант, предусмотренных в OPOS для результата вызова метода. Успешный вызов возвращает OPOS_SUCCESS, в остальных случаях - константы для разных ошибок.

  • После вызова метода драйвер заполняет определенные свойства значениями, по которым отслеживается результат вызова. Используются такие свойства:

    • PIDX_ResultCode - числовое свойство. Заполняется тем же значением, которое возвращается при вызове метода. Успешный вызов возвращает OPOS_SUCCESS, в остальных случаях - константы для разных ошибок.
    • PIDX_ResultCodeExtended - числовое свойство. Если результат вызова метода равен OPOS_E_EXTENDED - свойство заполняется одной из констант OPOS для расширенного кода ошибки, иначе заполняется 0.
    • PIDXFptr_ErrorString - строковое свойство. Если результат вызова метода не равен OPOS_SUCCESS - свойство может быть заполнено текстовым описанием ошибки, иначе заполняется пустой строкой.
  • Если ошибку вызвал обмен с ККТ, тогда свойство PIDXFptr_ErrorString будет содержать строку вида {Текст ошибки драйвера ККТ} ({Код ошибки драйвера ККТ}). В остальных случаях будет строка с “оригинальным” текстом исключения.

Работа драйвера логируется в файл, расположенный в папке C:\Users\{Имя пользователя Windows}\AppData\Roaming\ATOL\opos_drivers10\log. На каталог выше находится файл opos_log.properties для настройки лога. В лог записывается имя вызываемого метода со значениями входных параметров. Если метод имеет выходные параметры, их значение также выводятся. Последним шагом выводится результат вызова, а также текст ошибки при неуспешном вызове.

Расширенный функционал (DirectIO)

В методе DirectIO() первым параметром всегда передается номер команды. Далее в документе идут разделы с описанием использования метода для определенной команды. Заголовок раздела содержит номер команды и ее описание. Второй и третий параметры метода - это соответственно указатель на целое и указатель на строку (условно параметры будут с именами data и str). Каждый их них может служить как входным, так и выходным параметром (в зависимости от номера команды). В строковом параметре может передаваться несколько значений, тогда они разделяются символом ";". Среди этих значений может быть строка, которая сама содержит символ разделителя. Такая строка всегда передается последней в наборе, а символ разделителя в данном случае интерпретируется как часть строки.

1001 - печать текста с форматированием

Входные параметры:

  • data - шрифт
  • str - “<выравнивание>;<двойная ширина>;<двойная высота>;<яркость>;<текст>”

Значения для <выравнивание>:

  • 0 - слева
  • 1 - по центру
  • 2 - справа

Выходные параметры: Нет

Пример:

[int] $data = 2;
[string] $str = "1;1;0;7;Строка";
$fptr.DirectIO(1001, [ref]$data, [ref]$str);

1002 - печать штрихкода

Входные параметры:

  • data - тип ШК:
    • 0 - EAN8
    • 1 - EAN13
    • 2 - UPCA
    • 3 - UPCE
    • 4 - CODE39
    • 5 - CODE93
    • 6 - CODE128
    • 7 - CODABAR
    • 8 - ITF
    • 9 - ITF14
    • 11 - QR
    • 12 - PDF417
  • string - “<коэфициент увеличения>;<высота (для одномерных ШК)>;<печатать текст ШК>;<данные ШК>”

Выходные параметры: Нет

Пример:

[int] $data = 11;
[string] $str = "2;0;1;qrdata";
$fptr.DirectIO(1002, [ref]$data, [ref]$str);

1003 - открытие смены

Входные параметры: Нет

Выходные параметры: Нет

Пример:

$fptr.DirectIO(1003, null, null);

1004 - чтение настройки ККТ

Входные параметры:

data - номер настройки (см. документацию на драйвер ККТ, раздел Настройки ККТ).

Выходные параметры:

str - значение настройки

Пример:

[int] $data = 273;
[string] $str;
$fptr.DirectIO(1004, [ref]$data, [ref]$str);

1005 - запись настройки ККТ

Входные параметры:

  • data - номер настройки (см. документацию на драйвер ККТ, раздел Настройки ККТ)
  • str - значение настройки

Выходные параметры: Нет

Пример:

[int] $data = 273;
[string] $str = "ofdp.platformaofd.ru";
$fptr.DirectIO(1005, [ref]$data, [ref]$str);

1006 - применить настройки ККТ

Применяет настройки, записанные с помощью DirectIO #1005

Входные параметры: Нет

Выходные параметры: Нет

Пример:

$fptr.DirectIO(1006, null, null);

1007 - запрос информации о последнем документе

Входные параметры: Нет

Выходные параметры:

`str’ - “<номер ФД>;<ФПД>;<дата и время (формат - ddMMyyyyHHmm)>”

Пример:

[string] $str;
$fptr.DirectIO(1007, null, [ref]$str);

1008 - запрос квитанции ОФД

Входные параметры:

data - номер ФД

Выходные параметры:

str - “<ФПД ОФД>;<дата и время (формат - ddMMyyyyHHmm)>”

Пример:

[int] $data = 12;
[string] $str;
$fptr.DirectIO(1008, [ref]$data, [ref]$str);

1009 - отключение печати чека

Вызов DirectIO отключает печать следующего или текущего чека.

Входные параметры: Нет

Выходные параметры: Нет

Пример:

$fptr.DirectIO(1009, null, null);

1010 - добавление реквизита чека

Выполняется только при открытом чеке.

Входные параметры:

  • data - номер реквизита. Возможные значения:
    • 1 - телефон или email получателя (тег ФН 1008). Тип - строка;
    • 2 - наименование получателя (тег ФН 1227). Тип - строка;
    • 3 - ИНН получателя (тег ФН 1228). Тип - строка;
    • 4 - email отправителя чека (тег ФН 1117). Тип - строка;
    • 5 - система налогообложения (тег ФН 1055). Тип - число. Может принимать значения:
      • 1 - ОСН;
      • 2 - упрощенная Доход;
      • 4 - упрощенная Доход минус Расход;
      • 8 - ЕНВД;
      • 16 - ЕСН;
      • 32 - патент.
    • 6 - место расчетов (тег ФН 1187). Тип - строка;
    • 7 - признак агента (тег ФН 1057). Тип - число. Может принимать комбинацию следующих значений:
      • 0 - не агент;
      • 1 - банковский платежный агент;
      • 2 - банковский платежный субагент;
      • 4 - платежный агент;
      • 8 - платежный субагент;
      • 16 - поверенный;
      • 32 - комиссионер;
      • 64 - агент.
    • 8 - телефон поставщика (тег ФН 1171) (может повторяться). Тип - строка;
    • 9 - операция платежного агента (тег ФН 1044). Тип - строка;
    • 10 - телефон платежного агента (тег ФН 1073) (может повторяться). Тип - строка;
    • 11 - адрес оператора перевода (тег ФН 1005). Тип - строка;
    • 12 - ИНН оператора перевода (тег ФН 1016). Тип - строка;
    • 13 - наименование оператора перевода (тег ФН 1026). Тип - строка;
    • 14 - телефон оператора перевода (тег ФН 1075) (может повторяться). Тип - строка;
    • 15 - телефон оператора по приему платежей (тег ФН 1074) (может повторяться). Тип - строка;
    • 18 - наименование дополнительного реквизита пользователя (тег ФН 1085). Тип - строка;
    • 19 - значение дополнительного реквизита пользователя (тег ФН 1086). Тип - строка;
    • 20 - тип коррекции (тег ФН 1173). Тип - число. Возможные значения:
      • 0 - самостоятельно;
      • 1 - по предписанию.
    • 21 - наименование документа основания для коррекции (тег ФН 1177). Тип - строка;
    • 22 - дата документа основания для коррекции (тег ФН 1178). Тип - дата / время;
    • 23 - номер документа основания для коррекции (тег ФН 1179). Тип - строка;
    • 24 - дополнительный реквизит чека (БСО) (тег ФН 1192). Тип - строка.
  • str - “<тип реквизита>;<значение реквизита>”

Значения для <тип реквизита>:

  • 0 - целое число. Тогда <значение реквизита> должно быть строкой с числом - “123”;
  • 1 - строка. Тогда <значение реквизита> - произвольная строка;
  • 2 - дробное число. Тогда <значение реквизита> должно быть строкой с числом - “1.23”;
  • 4 - дата / время. Тогда <значение реквизита> должно быть строкой с датой, формат - ddMMyyyyHHmmss.

Выходные параметры: Нет

Пример:

[int] $data = 1;
[string] $str = "1;user@mail.ru";
$fptr.DirectIO(1010, [ref]$data, [ref]$str);

1011 - добавление реквизита позиции

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

Входные параметры:

  • data - номер реквизита. Возможные значения:
    • 1 - код товара (тег ФН 1162). Тип - массив байтов;
    • 2 - единицы измерения предмета расчета (тег ФН 1197). Тип - строка;
    • 3 - признак предмета расчета (тег ФН 1212). Тип - число;
    • 4 - признак способа расчета (тег ФН 1214). Тип - число;
    • 5 - сумма акциза (тег ФН 1229). Тип - дробное число;
    • 6 - код страны происхождения (тег ФН 1230). Тип - строка;
    • 7 - признак агента (тег ФН 1057). Тип - число. Может принимать одно из следующих значений:
      • 1 - банковский платежный агент;
      • 2 - банковский платежный субагент;
      • 4 - платежный агент;
      • 8 - платежный субагент;
      • 16 - поверенный;
      • 32 - комиссионер;
      • 64 - агент.
    • 8 - телефон поставщика (тег ФН 1171) (может повторяться). Тип - строка;
    • 9 - операция платежного агента (тег ФН 1044). Тип - строка;
    • 10 - телефон платежного агента (тег ФН 1073) (может повторяться). Тип - строка;
    • 11 - адрес оператора перевода (тег ФН 1005). Тип - строка;
    • 12 - ИНН оператора перевода (тег ФН 1016). Тип - строка;
    • 13 - наименование оператора перевода (тег ФН 1026). Тип - строка;
    • 14 - телефон оператора перевода (тег ФН 1075) (может повторяться). Тип - строка;
    • 15 - телефон оператора по приему платежей (тег ФН 1074) (может повторяться). Тип - строка;
    • 16 - наименование поставщика (тег ФН 1225). Тип - строка;
    • 17 - ИНН поставщика (тег ФН 1226). Тип - строка;
    • 18 - номер таможенной декларации (тег ФН 1231). Тип - строка;
    • 19 - дополнительный реквизит предмета расчета (тег ФН 1191). Тип - строка.
  • str - “<тип реквизита>;<значение реквизита>”

Значения для <тип реквизита>:

  • 0 - целое число. Тогда <значение реквизита> должно быть строкой с числом - “123”;
  • 1 - строка. Тогда <значение реквизита> - произвольная строка;
  • 2 - дробное число. Тогда <значение реквизита> должно быть строкой с числом - “1.23”;
  • 4 - дата / время. Тогда <значение реквизита> должно быть строкой с датой, формат - ddMMyyyyHHmmss.

Выходные параметры: Нет

Пример:

[int] $data = 3;
[string] $str = "0;1";
$fptr.DirectIO(1011, [ref]$data, [ref]$str);

1012 - открыть денежный ящик

Входные параметры: Нет

Выходные параметры: Нет

Пример:

$fptr.DirectIO(1012, null, null);

1013 - статус денежного ящика

Входные параметры: Нет

Выходные параметры:

data - 1, если денежный ящик открыт, 0 - если закрыт. На значение влияет настройка invertCashDrawerStatus.

Пример:

[int] $data;
$fptr.DirectIO(1013, [ref]$data, null);

1014 - печать документа из ФН по номеру

Входные параметры:

data - номер документа.

Выходные параметры: Нет

Пример:

[int] $data = 12;
$fptr.DirectIO(1014, [ref]$data, null);

1015 - чтение даты и времени (с точностью до секунд)

Входные параметры: Нет

Выходные параметры:

str - дата и время (формат - ddMMyyyyHHmmss)

Пример:

[string] $str;
$fptr.DirectIO(1015, null, [ref]$str);
[string] $dateTime = $str;

1016 - запись даты и времени (с точностью до секунд)

Входные параметры:

str - дата и время (формат - ddMMyyyyHHmmss)

Выходные параметры: Нет

Пример:

[string] $str = "01012019010203";
$fptr.DirectIO(1016, null, [ref]$str);

1017 - чтение реквизитов регистрации ККТ

Входные параметры:

  • data - номер реквизита. Может принимать значения:
    • 1001 - признак автоматического режима;
    • 1002 - признак автономного режима;
    • 1009 - адрес расчетов;
    • 1017 - ИНН ОФД;
    • 1018 - ИНН организации;
    • 1036 - номер автомата;
    • 1037 - регистрационный номер устройства;
    • 1046 - название ОФД;
    • 1048 - название организации;
    • 1056 - признак шифрования;
    • 1057 - признак агента;
    • 1060 - адрес сайта ФНС;
    • 1062 - системы налогообложения;
    • 1108 - признак ККТ для расчетов в сети Интернет;
    • 1109 - признак расчетов за услуги;
    • 1110 - признак АС БСО;
    • 1117 - e-mail организации;
    • 1126 - признак проведения лотерей;
    • 1187 - адрес места расчетов;
    • 1193 - признак проведения азартных игр;
    • 1207 - признак подакцизного товара;
    • 1209 - версия ФФД;
    • 1221 - признак установки в автомате.
  • str - тип реквизита. Может принимать значения:
    • “0” - целое число. Тогда возвращаемое значение реквизита должно быть строкой с числом - “123”;
    • “1” - строка. Тогда возвращаемое значение реквизита - произвольная строка.

Выходные параметры:

str - значение реквизита

В данном случае параметр str используется одновременно как входной и выходной. Пример:

[int] $data = 1009;
[string] $str = "1";
$fptr.DirectIO(1011, [ref]$data, [ref]$str);
[string] $attrValue = $str;

1020 - чтение сменных счетчиков

Считывает все сменные счетчики из ККТ. Результатом является строка, в которой представлены значения счетчиков, разделенные символом ";". Если какой-либо из счетчиков считать не удалось, в соответствующей позиции будет пустая подстрока между разделителями. Все суммы, возвращаемые этим DirectIO, представлены в копейках.

Входные параметры: Нет

Выходные параметры:

str - строка результата со значениями счетчиков. Список счетчиков с указанием позиции счетчика в строке (нумерация с 0):

  • 0 - номер смены;
  • 1 - сумма наличных в ДЯ;
  • 2 - сумма внесений;
  • 3 - количество внесений;
  • 4 - сумма выплат;
  • 5 - количество выплат;
  • 6 - количество чеков прихода;
  • 7 - сумма оплат чеков прихода наличными;
  • 8 - сумма оплат чеков прихода безналичными;
  • 9 - сумма оплат чеков прихода авансом;
  • 10 - сумма оплат чеков прихода кредитом;
  • 11 - сумма оплат чеков прихода встречным предоставлением;
  • 12 - сумма оплат чеков прихода пользовательским типом оплаты #1;
  • 13 - сумма оплат чеков прихода пользовательским типом оплаты #2;
  • 14 - сумма оплат чеков прихода пользовательским типом оплаты #3;
  • 15 - сумма оплат чеков прихода пользовательским типом оплаты #4;
  • 16 - сумма оплат чеков прихода пользовательским типом оплаты #5;
  • 17 - количество чеков расхода;
  • 18 - сумма оплат чеков расхода наличными;
  • 19 - сумма оплат чеков расхода безналичными;
  • 20 - сумма оплат чеков расхода авансом;
  • 21 - сумма оплат чеков расхода кредитом;
  • 22 - сумма оплат чеков расхода встречным предоставлением;
  • 23 - сумма оплат чеков расхода пользовательским типом оплаты #1;
  • 24 - сумма оплат чеков расхода пользовательским типом оплаты #2;
  • 25 - сумма оплат чеков расхода пользовательским типом оплаты #3;
  • 26 - сумма оплат чеков расхода пользовательским типом оплаты #4;
  • 27 - сумма оплат чеков расхода пользовательским типом оплаты #5;
  • 28 - количество чеков возврата прихода;
  • 29 - сумма оплат чеков возврата прихода наличными;
  • 30 - сумма оплат чеков возврата прихода безналичными;
  • 31 - сумма оплат чеков возврата прихода авансом;
  • 32 - сумма оплат чеков возврата прихода кредитом;
  • 33 - сумма оплат чеков возврата прихода встречным предоставлением;
  • 34 - сумма оплат чеков возврата прихода пользовательским типом оплаты #1;
  • 35 - сумма оплат чеков возврата прихода пользовательским типом оплаты #2;
  • 36 - сумма оплат чеков возврата прихода пользовательским типом оплаты #3;
  • 37 - сумма оплат чеков возврата прихода пользовательским типом оплаты #4;
  • 38 - сумма оплат чеков возврата прихода пользовательским типом оплаты #5;
  • 39 - количество чеков возврата расхода;
  • 40 - сумма оплат чеков возврата расхода наличными;
  • 41 - сумма оплат чеков возврата расхода безналичными;
  • 42 - сумма оплат чеков возврата расхода авансом;
  • 43 - сумма оплат чеков возврата расхода кредитом;
  • 44 - сумма оплат чеков возврата расхода встречным предоставлением;
  • 45 - сумма оплат чеков возврата расхода пользовательским типом оплаты #1;
  • 46 - сумма оплат чеков возврата расхода пользовательским типом оплаты #2;
  • 47 - сумма оплат чеков возврата расхода пользовательским типом оплаты #3;
  • 48 - сумма оплат чеков возврата расхода пользовательским типом оплаты #4;
  • 49 - сумма оплат чеков возврата расхода пользовательским типом оплаты #5.

Пример:

[string] $str;
$fptr.DirectIO(1020, null, [ref]$str);
[string] $result = $str; //строка с разделителями

1021 - чтение необнуляемых итогов

Считывает необнуляемые итоги из ККТ. Результатом является строка, в которой представлены значения счетчиков, разделенные символом ";". Если какой-либо из счетчиков считать не удалось, в соответствующей позиции будет пустая подстрока между разделителями. Все суммы, возвращаемые этим DirectIO, представлены в копейках.

Входные параметры: Нет

Выходные параметры:

str - строка результата со значениями счетчиков. Список счетчиков с указанием позиции счетчика в строке (нумерация с 0):

  • 0 - сумма оплат чеков прихода наличными;
  • 1 - сумма оплат чеков прихода безналичными;
  • 2 - сумма оплат чеков прихода авансом;
  • 3 - сумма оплат чеков прихода кредитом;
  • 4 - сумма оплат чеков прихода встречным предоставлением;
  • 5 - сумма оплат чеков прихода пользовательским типом оплаты #1;
  • 6 - сумма оплат чеков прихода пользовательским типом оплаты #2;
  • 7 - сумма оплат чеков прихода пользовательским типом оплаты #3;
  • 8 - сумма оплат чеков прихода пользовательским типом оплаты #4;
  • 9 - сумма оплат чеков прихода пользовательским типом оплаты #5;
  • 10 - сумма оплат чеков расхода наличными;
  • 11 - сумма оплат чеков расхода безналичными;
  • 12 - сумма оплат чеков расхода авансом;
  • 13 - сумма оплат чеков расхода кредитом;
  • 14 - сумма оплат чеков расхода встречным предоставлением;
  • 15 - сумма оплат чеков расхода пользовательским типом оплаты #1;
  • 16 - сумма оплат чеков расхода пользовательским типом оплаты #2;
  • 17 - сумма оплат чеков расхода пользовательским типом оплаты #3;
  • 18 - сумма оплат чеков расхода пользовательским типом оплаты #4;
  • 19 - сумма оплат чеков расхода пользовательским типом оплаты #5;
  • 20 - сумма оплат чеков возврата прихода наличными;
  • 21 - сумма оплат чеков возврата прихода безналичными;
  • 22 - сумма оплат чеков возврата прихода авансом;
  • 23 - сумма оплат чеков возврата прихода кредитом;
  • 24 - сумма оплат чеков возврата прихода встречным предоставлением;
  • 25 - сумма оплат чеков возврата прихода пользовательским типом оплаты #1;
  • 26 - сумма оплат чеков возврата прихода пользовательским типом оплаты #2;
  • 27 - сумма оплат чеков возврата прихода пользовательским типом оплаты #3;
  • 28 - сумма оплат чеков возврата прихода пользовательским типом оплаты #4;
  • 29 - сумма оплат чеков возврата прихода пользовательским типом оплаты #5;
  • 30 - сумма оплат чеков возврата расхода наличными;
  • 31 - сумма оплат чеков возврата расхода безналичными;
  • 32 - сумма оплат чеков возврата расхода авансом;
  • 33 - сумма оплат чеков возврата расхода кредитом;
  • 34 - сумма оплат чеков возврата расхода встречным предоставлением;
  • 35 - сумма оплат чеков возврата расхода пользовательским типом оплаты #1;
  • 36 - сумма оплат чеков возврата расхода пользовательским типом оплаты #2;
  • 37 - сумма оплат чеков возврата расхода пользовательским типом оплаты #3;
  • 38 - сумма оплат чеков возврата расхода пользовательским типом оплаты #4;
  • 39 - сумма оплат чеков возврата расхода пользовательским типом оплаты #5.

Пример:

[string] $str;
$fptr.DirectIO(1021, null, [ref]$str);
[string] $result = $str; //строка с разделителями

1022 - запрос информации о ФН

Входные параметры: Нет

Выходные параметры:

str - “<серийный номер ФН>;<версия ФН>;<тип ФН>;<состояние ФН>;<флаги ФН>”

Пример:

[string] $str;
$fptr.DirectIO(1022, null, [ref]$str);

[string] $serial = $str.split(";")[0];
[string] $version = $str.split(";")[1];
[string] $type = $str.split(";")[2];
[string] $state = $str.split(";")[3];
[string] $flags = $str.split(";")[4];

1023 - запрос статуса обмена с ОФД

Входные параметры: Нет

Выходные параметры:

str - “<статус обмена>;<количество неотправленных ФД>;<номер первого неотправленного ФД>;<дата и время первого неотправленного ФД (формат - ddMMyyyyHHmm)>”

Пример:

[string] $str;
$fptr.DirectIO(1023, null, [ref]$str);

[string] $status = $str.split(";")[0];
[string] $documentsCount = $str.split(";")[1];
[string] $documentNumber = $str.split(";")[2];
[string] $documentDateTime = $str.split(";")[3];

1024 - запрос срока действия ФН

Входные параметры: Нет

Выходные параметры:

str - дата и время окончания срока действия (формат - ddMMyyyyHHmm)

Пример:

[string] $str;
$fptr.DirectIO(1024, null, [ref]$str);
[string] $dateTime = $str;

1026 - регистрация налога на чек

Входные параметры:

  • data - номер ставки налога (одно из значений соответствующих настроек драйвера);
  • str - сумма налога (целое в виде строки, задается в копейках).

Выходные параметры: Нет

Пример:

[int] $data = 1;
[string] $str = "100000";
$fptr.DirectIO(1026, [ref]$data, [ref]$str);

1027 - установка ИНН кассира

Входные параметры:

str - ИНН кассира.

Выходные параметры: Нет

Пример:

[string] $str = "123456789047";
$fptr.DirectIO(1027, null, [ref]$str);

1029 - запись кода табачной продукции

Входные параметры:

str - “<идентификтор продукта GTIN>;<код идентификации>”

Выходные параметры: Нет

Пример:

[string] $str = "98765432101234;ABC1234";
$fptr.DirectIO(1029, null, [ref]$str);

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

1030 - запись кода лекарства

Входные параметры:

str - “<идентификтор продукта GTIN>;<контрольный (идентификационный) знак (КиЗ)>”

Выходные параметры: Нет

Пример:

[string] $str = "98765432101234;ABC1234567890";
$fptr.DirectIO(1030, null, [ref]$str);

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

1031 - запись код меховой продукции

Входные параметры:

str - “<идентификтор продукта GTIN;<серийный номер>”

Выходные параметры: Нет

Пример:

[string] $str = "98765432101234;RU-430302-ABC1234567";
$fptr.DirectIO(1031, null, [ref]$str);

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

1032 - запрос суммы налогов за последний чек

Входные параметры: Нет

Выходные параметры:

str - строка со значениями сумм, разделенных символом ";". Все суммы представлены в копейках. Список сумм налогов в строке (нумерация с 0):

  • 0 - сумма по ставке “НДС 18%”
  • 1 - сумма по ставке “НДС 10%”
  • 2 - сумма по ставке “НДС расчитанный 18/118”
  • 3 - сумма по ставке “НДС расчитанный 10/110”
  • 4 - оборот по ставке “НДС 0%”
  • 5 - оборот по ставке “НДС не облагается”

Пример:

[string] $str;
$fptr.DirectIO(1032, null, [ref]$str);
[string] $vatValues = $str;

1033 - регистрация налога на позицию

Входные параметры:

str - сумма налога (целое в виде строки, задается в копейках).

Выходные параметры: Нет

Пример:

[string] $str = "100000";
$fptr.DirectIO(1033, null, [ref]$str);

Выполнять операцию нужно после регистрации позиции, к которой налог относится.

1034 - перевод чека в режим НДС18

Входные параметры:

data - 1, если регистрировать позиции со ставками НДС 18 (18/118), 0, если со ставками НДС 20 (20/120). Флаг имеет смысл после 2019.01.01.

Выходные параметры: Нет

Пример:

[int] $data = 1;
$fptr.DirectIO(1034, [ref]$data, null);

1035 - запрос состояния смены

Входные параметры: Нет

Выходные параметры:

  • data - состояние смены (0 - закрыта, 1 - открыта, 2 - истекла)
  • str - “<номер смены>;<дата и время истечения текущей смены (формат - ddMMyyyyHHmmss)>”

Если смена закрыта - выводится номер последней закрытой смены. Если смена открыта или истекла - номер текущей смены. Пример:

[int] $data;
[string] $str;
$fptr.DirectIO(1035, [ref]$data, [ref]$str);
[int] $shiftState = $data;
[string] $shiftNumber = $str.split(";")[0];
[string] $shiftExpireDateTime = $str.split(";")[1];

1036 - запрос статуса

Входные параметры: Нет

Выходные параметры:

str - набор значений, разделенных символом ";". Список значений с указанием позиции в строке (нумерация с 0):

  • 0 - флаг фискальности ККТ
  • 1 - флаг фискальности ФН
  • 2 - флаг наличия ФН
  • 3 - состояние смены (0 - закрыта, 1 - открыта, 2 - истекла)
  • 4 - денежный ящик открыт/закрыт. На значение влияет настройка invertCashDrawerStatus.
  • 5 - флаг наличия бумаги
  • 6 - крышка открыта/закрыта
  • 7 - флаг блокировки ККТ из-за фатальной ошибки
  • 8 - флаг ошибки отрезчика
  • 9 - флаг перегрева печатной головки
  • 10 - текущие дата и время ККТ (формат - ddMMyyyyHHmmss)

Пример:

[string] $str;
$fptr.DirectIO(1036, null, [ref]$str);

1037 - запись кода обуви

Входные параметры:

str - “<идентификтор продукта GTIN>;<серийный номер>”;

Выходные параметры: Нет

Пример:

[string] $str = "98765432101234;sgEKKPPcS25y5";
$fptr.DirectIO(1037, null, [ref]$str);

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

1038 - установка имени кассира

Входные параметры:

str - имя кассира.

Выходные параметры: Нет

Пример:

[string] $str = "Иванов И.И.";
$fptr.DirectIO(1038, null, [ref]$str);

1039 - запись “сырого” кода маркировки

Позволяет передать в ККТ расчитанное пользователем драйвера значение реквизита 1162.

Входные параметры:

str - “сырой” код маркировки в виде hex-строки.

Выходные параметры: Нет

Пример:

[string] $str = "48656C6C6F20537461636B4F766572666C6F77";
$fptr.DirectIO(1039, null, [ref]$str);

1040 - запись неразобранной марки

Позволяет передать в ККТ значение считанной сканером марки, которое будет средствами ККТ преобразовано в реквизит 1162.

Входные параметры:

str - значение марки в виде hex-строки.

Выходные параметры: Нет

Пример:

[string] $str = "52552d3430313330312d4141413032373730333031";  //Это hex-строка для марки "RU-401301-AAA02770301"
$fptr.DirectIO(1040, null, [ref]$str);

Программирование ККТ

Настройка клише

Драйвер использует следующий механизм по загрузке клише в ККТ:

  1. При подключении к ККТ драйвер синхронизирует загруженные в ККТ картинки с теми, которые указаны в файле из настройки picturesFileName.
  2. В ККТ записываются параметры клише из настроек numHeaderLines и numTrailerLines.
  3. Сами строки клише загружаются через стандартные методы SetHeaderLine() и SetTrailerLine(). Индексы строк не должны превышать значения настроек numHeaderLines и numTrailerLines соответственно.
  4. При загрузке обрабатывается каждая строка на предмет наличия подстроки clichePicturePrefix в ней. Если подстрока найдена, то все остальные данные удаляются, а найденная подстрока преобразуется в формат, пригодный для ККТ.
  5. Строка записывается в настройки ККТ.

Загрузка настроек в ККТ

Для автоматической загрузки настроек в ККТ служит CSV-файл с описанием настроек. Всего 3 поля - номер параметра, название и значение, разделенные запятой. Кодировка - UTF-8.

Например:

273,Адрес ОФД,ofdp.platformaofd.ru
274,Порт ОФД,21101

Сформировать файл с настройками можно как самостоятельно, так и выгрузить с ККТ, используя тест драйвера ККТ v.10. Для этого нужно зайти в Свойства, настроить связь с ККТ и зайти в Параметры ККТ и нажать Экспорт -> Как CVS (для JPOS/OPOS).

Настройки из XML-файла являются приоритетными. Например, значения настроек numHeaderLines и numTrailerLines перезатирают значения параметров №14 и №35.