Часто задаваемые вопросы про 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();