Часто задаваемые вопросы про classic_fr_drv_ng - shtrih-m/fr_drv_ng GitHub Wiki

Как установить связь с ФР

Связь с ФР устанавливается методом Connect
Предварительно нужно заполнить свойства, отвечающие за параметры связи по TCP или COM-порту.
Пример

Как разорвать связь с ФР

Связь с ФР разрывается методом Disconnect.

classic_interface ci;
int ret = ci.Disconnect();
if (ci.Get_Connected() == false)
    cout << "Связь с ФР разорвана";

Как получить описание ошибки, которую вернул ФР

Код ошибки возвращается вызванным методом, а также его содержит свойство ResultCode.
Описании ошибки, произошедшей в последнем вызванном методе, содержит свойство ResultCodeDescription.

classic_interface ci;
int ret = ci.Beep();
if (ret != 0){
    std::string errDesc = ci.Get_ResultCodeDescription();
    cout << "Ошибка:" << ret << ":" << errDesc;
}

Как узнать состояние ФР

Короткий и полный запросы состояния можно узнать с помощью методов GetShortECRStatus и GetECRStatus соответственно, предварительно заполнив свойство Password (пароль оператора).

classic_interface ci;
ci.Set_Password(1);
int ret = ci.GetECRStatus();
if (ret == 0){
    int mode = ci.Get_ECRMode();
    cout << "Режим:" << mode;
}

Как напечатать чек продажи

Если этот чек продажи - первый в смене, то нужно предварительно открыть смену методом OpenSession.

classic_interface ci;
ci.Set_Password(1);
int ret = ci.GetECRStatus();
if (ret != 0){
    cout << "Ошибка " << ret;
    return;
}
int mode = ci.Get_ECRMode();
if (mode == 4)
    ret = ci.OpenSession();

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

classic_interface ci;
ci.Set_Password(1);
ci.Set_Quantity(1); //задаем количество товара в единицах или кг
ci.Set_Price(3000); //задаем цену в копейках
ci.Set_Tax1(0); //задаем номера налогов
ci.Set_Tax2(0);
ci.Set_Tax3(0);
ci.Set_Tax4(0);
ci.Set_StringForPrinting("Булка"); //задаем название товара
int ret = ci.Sale();
if (ret != 0){
    cout << "Ошибка продажи" << ret;
    return;
}
ci.Set_Summ1(20000); //задаем сумму наличных
ci.Set_StringForPrinting("строка закрытия"); //задаем необязательную строку
ret = ci.CloseCheck();
if (ret != 0){
    cout << "Ошибка закрытия чека" << ret;
    return;
}
ci.WaitForPrinting(); //дожидаемся окончания печати чека

Вместо методов Sale / ReturnSale можно использовать более современный метод FnOperation, а для закрытия чека - методы CloseCheckEx, FnCloseCheckEx. Пример.

Как напечатать отчет с гашением

Метод PrintReportWithCleaning снимает Z-отчет. Для успешного выполнения метода необходимо в свойстве Password указать пароль системного администратора. По умолчанию он - 30. На всякий случай, можно предварительно заполнить пароль системного администратора в свойстве SysAdminPassword.

classic_interface ci;
ci.Set_SysAdminPassword(30);
ci.Set_Password(30);
int ret = ci.PrintReportWithCleaning();
if (ret != 0){
    cout << "Ошибка снятия отчета с гашением" << ret;
    return;
}
ci.WaitForPrinting(); //дожидаемся окончания печати отчета

Аналогично метод PrintReportWithoutCleaning снимает X-отчет.

Как сделать внесение/выплату на ФР

Внесение и выплата денежных сумм в ФР делаются методами CashIncome и CashOutcome соответственно.
Предварительно нужно заполнить сумму внесения/выплаты (свойство Summ1) и пароль оператора (свойство Password).
Внесение:

classic_interface ci;
ci.Set_Password(1);
ci.Set_Summ1(10000);
int ret = ci.CashIncome();
if (ret != 0){
    cout << "Ошибка внесения" << ret;
    return;
}
ret = ci.WaitForPrinting();

Выплата:

classic_interface ci;
ci.Set_Password(1);
ci.Set_Summ1(9999);
int ret = ci.CashOutcome();
if (ret != 0){
    cout << "Ошибка выплаты" << ret;
    return;
}
ret = ci.WaitForPrinting();

В каком случае необходимо дожидаться окончания печати

При выполнении ряда команд, ФР на некоторое время занят печатью.
И если в этот момент ФР дать новую команду, то он вернет ошибку 80 "Идет печать результатов выполнения предыдущей команды".
Для того, чтобы этого не произошло, необходимо дождаться окончания печати документа с помощью метода WaitForPrinting.
Это необходимо делать после команд закрытия чека CloseCheck, CloseCheckEx, FnCloseCheckEx, после печати отчетов PrintReportWithCleaning, PrintReportWithoutCleaning, операций внесения/выплаты CashIncome, CashOutcome.

Для команд открытия смены OpenSession, открытия чека OpenCheck, продажи Sale или FnOperation, печати строки PrintString/PrintWideString/PrintStringWithFont и др., подавать команду WaitForPrinting не нужно. После вызова OpenCheck касса все печатающие команды складывает в буфер, и печать начинается только после вызова CloseCheck.

Печать текстовых строк до, после и внутри чека

По умолчанию перед чеком печатается так называемое "клише", внутри чека печатается по строке перед каждой операцией и перед закрытием чека, а после чека печатается т.н. рекламный текст.
Текст клише и рекламного текста задается в Таблице4 (первые три поля для рекламного текста, 4-14 - для клише). Настройки их печати задаются в Таблице1 (см. Как поменять значение в таблицах ФР).

Текст строки перед операцией и перед закрытием чека задается с помощью свойства StringForPrinting. Если это значение пустое, то строка в чеке отсутствует.

Если возникает необходимость напечатать дополнительные строки внутри чека или после него, то нужно применять методы печати строки PrintString/PrintWideString/PrintStringWithFont.

Как поменять значение в таблицах ФР

Для того, чтобы изменить значение в таблице ФР, нужно воспользоваться методом WriteTable, предварительно заполнив свойства:

  • номер таблицы TableNumber,
  • номер ряда таблицы RowNumber,
  • номер поля таблицы FieldNumber,
  • новое значение поля.

Значения у полей бывают строкового и целого типа, типы полей таблиц указаны в документации на ФР. Для строкового типа заполняется свойство ValueOfFieldString, а для целого - ValueOfFieldInteger соответственно.

Пример. Установить значение "3" в 7-ое поле 1-го ряда Таблицы17

classic_interface ci;
ci.Set_TableNumber(17);
ci.Set_RowNumber(1);
ci.Set_FieldNumber(7);
ci.Set_ValueOfFieldInteger(3);
ci.WriteTable();