New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and
privacy statement. We’ll occasionally send you account related emails.
Already on GitHub?
Sign in
to your account
Closed
ConsperSerj opened this issue
May 19, 2020
· 136 comments
Comments
Доброе утро, дорогие разработчики.
У меня возникли некоторые проблемы в регистрации чека.
Опишу мои действия и код
Зада следующая. На вход приходят данные о покупке и товарах. Мне нужно провести оплату и распечатать соответствующий чек.
Первое что я делаю я вызываю команду закрытия последнего незакрытого чека и проверяю открыта ли у меня смена, не превысила ли она 24 часа и т.д. Тут все хорошо ибо другие метода все адыкватно работают и не вызывают проблем.
После этого после этого указываю тип чека и печатать ли его и после этого открываю чек
Set_CheckType(OperationTypeEntity.getCode(parameters.operationType)) //указываем тип чека
Set_SkipPrint(print) // признак печати чека
codeResult = executeCommand(Callable { OpenCheck() }) //открываем чек
if (codeResult != 0)
throw CommonFiscalRegistrarException(
requestGuid = "",
code = codeResult.toString(),
message = "Code: $codeResult, Message: Ошибка при открытии чека"
)
После того как открылся чек я выполняю регистрацию оплат
for (position in parameters.positions) {
Set_CheckType(parameters.operationType.code)
Set_Quantity(position.quantity)
Set_Price(position.pricePerUnit)
Set_Summ1(position.totalPrice ?: -1)
Set_Summ1Enabled(position.totalPrice != -1L) //рассчитывает касса
Set_TaxValueEnabled(true) // TODO должно высчитывать налоги
Set_Tax1(getNDSType(position.vatRate))
Set_Department(1) // номер отдела
Set_PaymentTypeSign(position.method?.code ?: 4) //способ расчета
Set_PaymentItemSign(
getFESettlementSubjects(
position.subject ?: FESettlementSubjects.PRODUCT
)
) // предмет расчета
Set_StringForPrinting(position.name)
codeResult = executeCommand(Callable { FNOperation() })
if (codeResult != 0)
throw CommonFiscalRegistrarException(
requestGuid = "",
code = codeResult.toString(),
message = "Code: $codeResult, Message: Ошибка при выполнении операции"
)
waitForPrinting(this)
}
После этого готовлю чек на закрытие
Set_Summ1(0) // сдача //TODO как нужно расчитывать
Set_Summ2(parameters.sumByCash) // Наличные
Set_Summ3(parameters.sumByCard) //Электронными
Set_Summ14(parameters.sumByPrepayment) // аванс
Set_Summ15(parameters.sumByPostpayment) // кредит
Set_Summ16(parameters.sumByConsiderations) // встречным предоставлением
Set_TaxType(TaxSystemEntity.getTaxType(parameters.taxSystem)) // Основная система налогообложения
codeResult = executeCommand(Callable {
FNCloseCheckEx()
})
if (codeResult != 0)
throw CommonFiscalRegistrarException(
requestGuid = "",
code = codeResult.toString(),
message = "Code: $codeResult, Message: Ошибка при закрытии чека"
)
waitForPrinting(this)
И вот тут у меня пачка больших проблем. Все отрабатывает, все печатает. НООО:
-
При регистрации товаров я указываю налогооблажение и НДС.
Set_TaxValueEnabled(true) // TODO должно высчитывать налоги
Set_Tax1(getNDSType(position.vatRate))
Например у меня один из товаров НДС 10%
После этого я ожидаю что полученный результат от этого будет лежать в одном из TaxValue или вообще хоть где-то. Но почему то я не могу найти этого и ни где этих вычислений нет -
Так же возможно ли чтобы ядро само высчитывало сдачу?
-
Возможно ли чтобы ядро автоматически сумировало и выполняло вычисления по налогам и суммам оплаты за все товары после того как прошла регистрация товаров? Или все это я должен сам руками высчитывать и перед закрытием чека передавать ядру?
-
Когда устанавливаете Set_TaxValueEnabled(true), это значит, что суммы налогов вы будете считать сами и посчитанную сумму передадите в TaxValue.
Если считать сами не хотите, то задаете Set_TaxValueEnabled(false), указываете в Set_Tax1 номер налога, и ККТ сама расчитает суммы налогов. -
Значение свойств Summ1-Summ3 при закрытии чека немного другое:
- Summ1 — наличные
- Summ2 — Электронные
- Summ3..Summ13 — тоже электронные.
ККТ Summ2..Summ13 различает и ведет по ним отдельные счетчики, в ФН отправляется их сумма.
После выполнения FNCloseCheckEx сумму сдачи можно получить Get_Change()
Только на чеке почему то у меня пишется сдата и значение которое после закрытие ложится в Summ1
И какое бы я значение не указывал в Summ1 — например 3000, то и на чеке напишет сдача — 3000
Подскажите пожалуйста как получить дату и время открытия последней смены. Потому что если я пытаюсь дернуть Get_LastSessionDate() — то на выход я получаю 1970 год
И какое бы я значение не указывал в Summ1 — например 3000, то и на чеке напишет сдача — 3000
Наверное все оплачиваете безналом, поэтому все наличные возвращаются в виде сдачи.
тогда я еще пачку вопросов подготовлю:
- После того как чек закрылся и реаспечатался, мне для наших нужд нужно узнать сколько общая стоимость по чеку была. Методов типа totalSumm я так и не нашел. Не подскажете через что можно получить это?
- Я выставил Set_TaxValueEnabled(false) — Следовательно все должно расчитываться автоматом. Но почему такие параметры как Get_TaxValue1() — Get_TaxValue6() — Не заполняются в Соответствии с расчетами по налогам? Или чтобы они там рассчитывались нужно сперва прописывать для них Enable=true?
- Для заказчика в приложение мое должно от ядра приходить вот такой параметр
- @param[machineNumber] Заводской номер автоматического устройства для расчетов. Должен входить в состав кассового чека
- (БСО) при применении ККТ в автоматическом устройстве для расчетов. Должен быть включен в состав кассового
- чека (БСО) при его передаче ОФД в электронной форме в случае, если указанный реквизит ранее не был передан
- ОФД в составе отчета о регистрации или отчета об изменении параметров регистрации.
- Тэг ФФД: 1036.
- Номер автомата.
- Форма: печатная, электронная.
- Заголовок в печатной форме: «АВТОМАТ».
Но вот что-то я не могу его ни где достать. Не подскажете через что можно дернуть данное значение?
4) Как получить время и дату текущей смена? Я так понял этого нельзя ни как сделать?
Возможно будет проще после закрытия чека получить из ФН документ методом FNGetDocumentAsString(выдаст документ в текстовом виде) или FNRequestFiscalDocumentTLV(в двоичном виде).
И из тегов получать все нужные данные.
1020 — итог чека
1102..1107 — суммы налогов
1036 опять же
- Как получить время и дату текущей смена? Я так понял этого нельзя ни как сделать?
Можно, но не просто. Проще вам запомнить где-то у себя, когда подали команду «Открыть смену».
Хорошо буду сейчас пробовать. Спасибо
А получить данный документ в формате Json не возможно у вас? Парсить строку разделенную через n очень больно)
И в данном документе нету 1036 кода.
Может быть все эти данные можно как то достать с таблиц в вашей БД?
А получить данный документ в формате Json не возможно у вас?
Пока только в таком виде.
И в данном документе нету 1036 кода.
А тег 1001(признак автоматического режима) есть? Может ККТ не зарегистрирован для работы в автоматическом режиме?
Может быть все эти данные можно как то достать с таблиц в вашей БД?
Что имеется в виду под «нашей БД»?
Когда за данными можно слазить вот так
Set_TableNumber(13)
Set_FieldNumber(4)
Set_RowNumber(1)
ReadTable().toLong()
В таблицах как правило настройки ККТ. Чек так точно не достанешь.
-
Общую стоимость по чеку можно получить, сложив Summ1..Summ16, переданные в команду закрытия чека и вычтя сдачу, полученную после закрытия чека.
-
Суммы налогов можно получить из денежных регистров командой GetCashRegEx, прочитав их перед закрытием чека. Список регистров можно найти в документации.
Ориентировочно это регистры 104..119,4200..4207. -
Номер автомата можно получить из таблицы 24 поле 1. Но если тега 1036 нет в документе из ФН, не знаю насколько корректно его возвращать. Я бы проверил для каких режимов работы фискализировали ККТ.
Подскажите пожалуйста
Для того чтобы сделать чек коррекции, нужно ли отходить от логики обычного чека?
То есть:
Сперва открывать чек кореекции через FNOpenCheckCorrection()
После в цикле заполнять позиции и выполнять FNOperation():
for (position in parameters.positions) { //регистрируем операции
Set_CheckType(parameters.operationType.code)
Set_StringForPrinting(position.name) // название товара
Set_Quantity(position.quantity)
Set_Price(position.pricePerUnit)
Set_Summ1(position.totalPrice ?: -1)
Set_Summ1Enabled(position.totalPrice != -1L) //рассчитывает касса
Set_TaxValueEnabled(false) // налоги высчитываться буду на стороне ККТ
Set_Tax1(getNDSType(position.vatRate))
Set_Department(1) // номер отдела
Set_PaymentTypeSign(position.method?.code ?: 4) //способ расчета
Set_PaymentItemSign( // предмет расчета
getFESettlementSubjects(
position.subject ?: FESettlementSubjects.PRODUCT
)
)
codeResult = executeCommand(Callable { FNOperation() })
А после этого выполнять
FNBuildCorrectionReceipt2()
Или тут логика совсем будет другая?
Так же еще вопрос. Как можно получить агента? И в каком виде он отдается?
Так же еще один вопрос всплыл:
- @param[asAgentTypeOf] Признак проведения расчетов (возможности проведения расчетов) пользователем, являющимся агентом.
- См. примечание к [FTReceiptPosition].
- Тэг ФФД: 1222.
- Данные агента.
- Форма: печатная, электронная.
- @param[agentData] Дополнительные сведения о пользователе, являющемся агентом, и о его контрагентах. См. примечание
- к [FTAgentData].
- Тэг ФФД: 1223.
- Данные агента.
- Форма: печатная, электронная.
Есть вот такие вот поля.
Мне их нужно передавать при выполнении FNOperation. чтобы для каждой позиции можно было указать своего агента. Только в докуентации я про агентов вообще ничего не нашел
Для того чтобы сделать чек коррекции, нужно ли отходить от логики обычного чека?
Да, сейчас нужно. Пример чека коррекции.
Агента передаете сами. Через соответсвующие теги, методами FNSendTag
и FNSendTagOperation
.
Добрый день. Я столкнулся еще с одной проблемой
Мне нужно передавать в позицию 1223 тэг — Дополнительные сведения о пользователе, являющемся агентом, и о его контрагентах.
Они у меня представлюсь из себя вот такое
-
@param[transferOperatorName] Наименование оператора по переводу денежных средств.
-
Тэг ФФД: 1026.
-
Наименование оператора перевода.
-
Форма: печатная, электронная.
-
Заголовок в печатной форме: «ОПЕРАТОР ПЕРЕВОДА».
-
@param[transferOperatorPhones] Номера телефонов оператора по переводу денежных средств.
-
Тэг ФФД: 1075.
-
Телефон оператора перевода.
-
Форма: печатная, электронная.
-
Заголовок в печатной форме: «ТЛФ. ОП. ПЕРЕВОДА».
-
Макс. длина: 19.
-
@param[transferOperatorAddress] Место нахождения оператора по переводу денежных средств.
-
Тэг ФФД: 1005.
-
Адрес оператора перевода.
-
Форма: печатная, электронная.
-
Заголовок в печатной форме: «АДР. ОП. ПЕРЕВОДА».
-
@param[transferOperatorInn] Идентификационный номер налогоплательщика оператора по переводу денежных средств..
-
Если ИНН имеет длину меньше 12 цифр, то он дополняется справа пробелами.
-
Тэг ФФД: 1016.
-
ИНН оператора перевода.
-
Форма: печатная, электронная.
-
Заголовок в печатной форме: «ИНН ОП. ПЕРЕВОДА».
-
@param[payingAgentOperation] наименование операции банковского платежного агента, банковского платежного субагента,.
-
платежного агента или платежного субагента
-
Тэг ФФД: 1044.
-
Операция платежного агента.
-
Необязательный, кроме случаев, когда пользователь является банковским платежным агентом или банковским
-
платежным субагентом.
-
Форма: печатная, электронная.
-
Заголовок в печатной форме: «ОП. АГЕНТА».
-
@param[payingAgentPhones] Номера телефонов платежного агента, платежного субагента, банковского платежного агента,.
-
банковского платежного субагента
-
Тэг ФФД: 1073.
-
Телефон платежного агента.
-
Форма: печатная, электронная.
-
Заголовок в печатной форме: «ТЛФ. ПЛ. АГЕНТА».
-
Макс. длина: 19.
-
@param[paymentOperatorPhones] Номера контактных телефонов оператора по приему платежей.
-
Тэг ФФД: 1074.
-
Телефон оператора по приему платежей.
-
Форма: печатная, электронная.
-
Заголовок в печатной форме: «ТЛФ. ОП. ПР. ПЛАТЕЖА».
-
Макс. длина: 19.
*/
class FTAgentData @jvmoverloads constructor(@SerializedName(«transfer_operator_name»)
var transferOperatorName: String? = null,@SerializedName(«transfer_operator_phones»)
var transferOperatorPhones: HashSet,@SerializedName(«transfer_operator_address»)
var transferOperatorAddress: String? = null,@SerializedName(«transfer_operator_inn»)
var transferOperatorInn: String? = null,@SerializedName(«paying_agent_operation»)
var payingAgentOperation: String? = null,@SerializedName(«paying_agent_phones»)
var payingAgentPhones: HashSet,@SerializedName(«payment_operator_phones»)
var paymentOperatorPhones: HashSet
)
Если я пытаюсь добавить тег 1223 без значение — то ругается что команда не выполнена из-за отсутствия значения.
Если я как значение передаю строку в виде всех этих параметров через n тоже ошибка. Если я пытаюсь передать как значение json в виде строки тоже самое.
Я пытался передавать значения просто указывая тэги, но тогда они не приходят у меня в ответе
Подскажите пожалуйста как передаются у вас данные по агену?
Еще один важный момент
Если при выполнении опирации FNBuildCorrectionReceipt2 падает ошибка -9
То после чтобы опять взаимодействовать с ядром мне приходится перезагружать кассу
А можно как то кодом опять получить доступ к ядру и чтобы все команды выполнялись
ибо если я просто пробую по получаю всегда код ошибка 97
тег данные агента(1223) передается как STLV тег. Смотрите справку на метод FNBeginSTLVTag
Если при выполнении опирации FNBuildCorrectionReceipt2 падает ошибка -9
Это странно, нужен лог.
Лог предоставлю в понедельник. А подскажите пожалуйста дока которая на гите она актуальная? Или у вас есть какая то более расширеная документация и более подробная?
Самая актуальная дока это дока в формате doxygen внутри файла classic_interface.h внутри сборок.
Добрый день. Подскажите пожалуйста
есть вот такой тег
- @param[payingAgentPhones] Номера телефонов платежного агента, платежного субагента, банковского платежного агента,.
- банковского платежного субагента
- Тэг ФФД: 1073.
Это у меня HashSet
Данный тег лежит внутри 1223
Я выполняю следующий код
Set_TagNumber(1223)
var parentId = FNBeginSTLVTag()
Set_TagID(parentId)
Set_TagNumber(1073)
Set_TagType(7)
Set_TagValueBin(«8304057n»)
Set_TagValueLength(«8304057n».length)
FNAddTag()
FNSendSTLVTagOperation()
Но в ответ я получаю
Incorrect command parameters
D/fr_drv_ng: [2020-05-25 10:53:09.790] [8222] [ProtocolV2_0x969f2140 ] [D] commands total: 20, succeed: 19, failed: 1, avg. exec time: 31ms
D/fr_drv_ng: [2020-05-25 10:53:09.791] [8222] [TcpSocketIO_0x96a681b0 ] [D] -> 8F 04 00 15 00 6B 33 B3 7E
D/fr_drv_ng: [2020-05-25 10:53:09.792] [8222] [TcpSocketIO_0x96a681b0 ] [D] <- 8F
[2020-05-25 10:53:09.792] [8222] [TcpSocketIO_0x96a681b0 ] [D] <- 29 00 15 00 6B 00 CA CA D2 3A 20 CD E5 EA EE F0 F0 E5 EA F2 ED FB E5 20 EF E0 F0 E0 EC E5 F2 F0 FB 20 E2 20 EA EE EC E0 ED E4 E5 F4 C4
[2020-05-25 10:53:09.792] [8222] [ProtocolV2_0x969f2140 ] [D] command 6B return code: 0 execution took 0ms
[2020-05-25 10:53:09.792] [8222] [ProtocolV2_0x969f2140 ] [D] commands total: 21, succeed: 20, failed: 1, avg. exec time: 30ms
[2020-05-25 10:53:09.792] [8222] [classic_interface_0x976047c0 ] [D] FNSendSTLVTagOperation() fail
E/fr_drv_ng: [2020-05-25 10:53:09.792] [8222] [classic_interface_0x976047c0 ] [E] ККТ: Некорректные параметры в команде
Каким образом передавать список номеров?
FNBeginSTLVTag возвращает код ошибки, как и все остальные методы. ID родительского тега возвращается в свойстве TagID.
Код должен выглядеть так:
Set_TagNumber(1223)
FNBeginSTLVTag()
var parentId = Get_TagID()
Set_TagID(parentId)
Set_TagNumber(1073)
...
А массив номер передавать через Set_TagValueStr?
Да, должно быть через Set_TagValueStr
По формату фискальных данных тип тега 1073 — строка(таблица 5) и может повторяться(таблица 19,22).
То есть массив надо передавать через несколько тегов 1073, а в тег 1073 передавать по одному телефону. Формат строки должен быть +{Ц}(таблица 5).
поле режим работы вообще передается в теле команды пере/регистрации поэтому в таблице поле и не редактируется.
А вот эти тэги 1207,1193,1126,1221 тоже через метод передавать?
общая последовательность такая:
запись таблиц,
FNBeginRegistrationReport
FNSendTLV
FNBuildRegistrationReport
И эти теги передаются только через FNSendTLV?
есть реализации где их можно передать и через таблицы, но передача через теги работает на всех устройствах.
Спасибо. Буду смотреть тогда парсеры которые перегоняют в TVL формат. У вас из под капота такого нет?
Перегоняют что?
См методы
FNSendTLV
FNSendTag
FNSendTagOperation
сделать STLV тег тоже можно.
см методы:
FNSendSTLVTag
FNSendSTLVTagOperation
FNBeginSTLVTag
Смотрите. Через метод FNSendTLV я пытался передать тэги 1207,1193,1126,1221 — но ядро сказало что неверное значение. Я передавал как int
Как их тогда нужно передавать правильно чтобы ядро не ругалось?
Ладно буду пробовать. Спасибо
Тогда такой вопрос. Если это тип Byte — то использовать метод Set_TagValueBin() для того чтобы положить значение?
Подскажите тогда пожалуйста еще вот этот момент
ККТ: Ошибка в TLV (теге, длине или данных) <0x00B9002C: длина меньше допустимой для переданного тега>
Как мне понять какой это параметр?
Еще пожалуйста поясните один момент:
Тег 1056 пытался передать через FNSend получил ошибку
ККТ: Некорректные параметры в команде <0x00330033: тег не может быть отправлен в текущий документ ФН или используйте табл. 13>
Значит я что-то делал не так и нужно юзять FNSendTVL — как вы сказали
Для этого метода нужно сгенерить TLVData в виде — F0h 03h 08h 00h 31h 32h 33h 34h 35h 36h 37h 38h ,где F0h 03h – код тэга, 08h 00h – длина сообщения.
А у вас не предусмотрено, чтобы я просто в TVLData передал значение 1 например и номер тега а он уже сам сгенерит эту последовательность байт?
Или все же нужно писать какой то конвертер?
Или я вообще все не верно делаю?
тег 1056 передается через саму команду регистрации(это битик в битовом поле режим работы), его не нужно передавать через передачу тегов.
PS: F0h 03h — это не 1056, а 1008.
1008 — это тег типа строка, его можно передать через FNSendTag, как и любой другой тег
Я это скинул как пример формата просто, чтобы выяснить как в него мне конвертнутся из простого значения
Я наверное непонятно задаю вопросы.
1056,1002,1001,1109,1110,1108, 1207,1193,1126,1221 — это список тегов которые я не смогу пока что передать в перерегистрацию
- Я их пытался передать через таблицу в бд — получил ошибку что поле не может быть релактировано, вы мне объяснили почему так произошло.
- я пытался передать данные поля через мелом FNSendTag — но я получал по каждому тегу ответ от ядра что неверный параметр передается (хотя я пробовал передавать и как int, как string, byte. Все перепробовал но ошибка одна и та же.)
Вот к сути почему я пишу вам вопросы.
Суть проста. Через какой методы мне нужно передать перечисленные теги что ядро их приняло и не отругало меня??
Может быть все эти теги нужно дожить сперва в какой то родительский тег и все отдавать? Я уже все варианты перебираю, но пока что не проходит. Вот по этой причине и обратился к вам за помощью
Я понял о чем вы говорили. теги 1056, 1002, 1001, 1109, 1110, 1108 — передаются в методе WorkMode — с этим стало все понятно
А как передать теги 1057, 1207, 1193, 1126, 1221? Через WorkModeEx?
Ребят спасибо за помощь и терпение. Все завелось и я сам разобрался в остальных проблемах
закрываем, для последующих вопросов создавайте отдельные темы.
4 — 23.10.20 — 05:31
(1)
Перем ОписаниеРезультата;
//******************************************************************************
Функция ПолучитьОписаниеРезультата(Объект)
Возврат Объект.ResultCodeDescription;
КонецФункции // ПолучитьОписаниеРезультата()
//********************************************************************************
Функция ПодключитьсяКФР(Объект, Пароль)
Рез = 0;
Объект.Password=Пароль;
Объект.Connect();
Ответ = Объект.ResultCode;
Если Ответ=0 Тогда
Рез=1;
Иначе
ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
КонецЕсли;
Возврат Рез;
КонецФункции
//********************************************************************************
Функция ОтключитьсяОтФР(Объект, Пароль, ЗапоминатьОшибку = 1)
Рез = 0;
// пеключим ФР в нерабочий режим
Объект.Password=Пароль;
Объект.Disconnect();
Ответ = Объект.ResultCode;
Если Ответ=0 Тогда
Рез=1;
ИначеЕсли ЗапоминатьОшибку = 1 Тогда
ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
КонецЕсли;
Возврат Рез;
КонецФункции
//********************************************************************************
Функция Подключить(Компонента, ПрогИд, Объект, Пароль)
Рез = 0;
Если ЗагрузитьВнешнююКомпоненту(Компонента) = 0 Тогда
ОписаниеРезультата = «не удалось загрузить внешнюю компоненту «»» + Компонента + «»»»;
Иначе
Попытка
Объект = СоздатьОбъект(«AddIn.» + ПрогИд); // Создание объекта внешней компоненты
Исключение
КонецПопытки;
Если ПустоеЗначение(Объект) = 1 Тогда
ОписаниеРезультата = «не удалось создать объект внешней компоненты с программым идентификатром AddIn.» + ПрогИд;
Иначе
Рез = 1;
КонецЕсли;
КонецЕсли;
Возврат Рез;
КонецФункции
//********************************************************************************
Функция Отключить(Объект, Пароль)
Рез = 0;
Если ПустоеЗначение(Объект) = 1 Тогда
Рез = 1; // нет объекта, ничего не нужно отключать
Иначе
Рез = ОтключитьсяОтФР(Объект, Пароль);
КонецЕсли;
Возврат Рез;
КонецФункции
//********************************************************************************
Процедура ОтрезатьЧек(Объект, Пароль)
Ошибка=80; //Идет печать предыдущей команды
Пока Ошибка=80 Цикл
Попытка
Объект.Password = Пароль;
Объект.CutType = 1;
Объект.CutCheck();
Ошибка=Объект.ResultCode;
Исключение
Ошибка=-1;
КонецПопытки;
КонецЦикла;
КонецПроцедуры
//********************************************************************************
Процедура АннулированиеЧека(Объект, Пароль)
Попытка
Объект.Password=Пароль;
Объект.CancelCheck();
Исключение
КонецПопытки;
КонецПроцедуры
//********************************************************************************
Функция ПечататьТекст(Объект, Пароль, Текст)
Если ПустоеЗначение(Объект) = 1 Тогда
ОписаниеРезультата = «устройство не подключено»;
Возврат 0;
ИначеЕсли ПодключитьсяКФР(Объект, Пароль) = 0 Тогда
Возврат 0;
КонецЕсли;
КолСтр=СтрКоличествоСтрок(Текст);
Для ц = 1 По КолСтр Цикл
Стр=СтрПолучитьСтроку(Текст,ц);
Объект.StringForPrinting=Стр ;
Объект.PrintString();
КонецЦикла;
ОтрезатьЧек(Объект, Пароль);
Возврат ОтключитьсяОтФР(Объект, Пароль);
КонецФункции
//********************************************************************************
Функция ПечататьТекстСпасибо(Объект, Пароль, Текст)
Если ПустоеЗначение(Объект) = 1 Тогда
ОписаниеРезультата = «устройство не подключено»;
Возврат 0;
ИначеЕсли ПодключитьсяКФР(Объект, Пароль) = 0 Тогда
Возврат 0;
КонецЕсли;
КолСтр=СтрКоличествоСтрок(Текст);
Для ц = 1 По КолСтр*1.5 Цикл
Стр=СтрПолучитьСтроку(Текст,ц);
Объект.StringForPrinting=Стр;
Объект.PrintString();
Объект.StringForPrinting=» «;
Объект.PrintString();
КонецЦикла;
ОтрезатьЧек(Объект, Пароль);
Возврат ОтключитьсяОтФР(Объект, Пароль);
КонецФункции
//********************************************************************************
Функция ПечататьЧек(Объект, Пароль, СписокТоваров, Получено, ПолучСерт, ПолучКарт, Скидка, ПризнВозврата, НомерСекции, НомерЧека,СкидкаСуммой,НомерДок)
Если ПустоеЗначение(Объект) = 1 Тогда
ОписаниеРезультата = «устройство не подключено»;
Возврат 0;
ИначеЕсли ПодключитьсяКФР(Объект, Пароль) = 0 Тогда
Возврат 0;
КонецЕсли;
// регистрация товаров
РезРегистрация = 1;
СписокТоваров.ВыбратьСтроки();
Объект.StringForPrinting = » Товарный чек»;
Объект.PrintString();
Объект.StringForPrinting = » «+ НомерДок+» от «+ТекущаяДата();
Объект.PrintString();
Если (Нрег(глПользователь.Наименование))=»кассир1″ Тогда
пробел =» » ;
Объект.StringForPrinting = Лев(«Продавец:»+прав(пробел,32-(9+СтрДлина(Константа.Кассир1)))+(Константа.Кассир1),32);
Объект.PrintString();
КонецЕсли;
Если (Нрег(глПользователь.Наименование))=»кассир2″ Тогда
пробел =» » ;
Объект.StringForPrinting = Лев(«Продавец:»+прав(пробел,32-(9+СтрДлина(Константа.Кассир2)))+(Константа.Кассир2),32);
Объект.PrintString();
КонецЕсли;
Если (Нрег(глПользователь.Наименование))=»кассир3″ Тогда
пробел =» » ;
Объект.StringForPrinting = Лев(«Продавец:»+прав(пробел,32-(9+СтрДлина(Константа.Кассир3)))+(Константа.Кассир3),32);
Объект.PrintString();
КонецЕсли;
Если (Нрег(глПользователь.Наименование))=»кассир4″ Тогда
пробел =» » ;
Объект.StringForPrinting = Лев(«Продавец:»+прав(пробел,32-(9+СтрДлина(Константа.Кассир4)))+(Константа.Кассир4),32);
Объект.PrintString();
КонецЕсли;
Если (Нрег(глПользователь.Наименование))=»кассир5″ Тогда
пробел =» » ;
Объект.StringForPrinting = Лев(«Продавец:»+прав(пробел,32-(9+СтрДлина(Константа.Кассир5)))+(Константа.Кассир5),32);
Объект.PrintString();
КонецЕсли;
Если (Нрег(глПользователь.Наименование))=»кассир6″ Тогда
пробел =» » ;
Объект.StringForPrinting = Лев(«Продавец:»+прав(пробел,32-(9+СтрДлина(Константа.Кассир6)))+(Константа.Кассир6),32);
Объект.PrintString();
КонецЕсли;
Если (Нрег(глПользователь.Наименование))=»кассир7″ Тогда
пробел =» » ;
Объект.StringForPrinting = Лев(«Продавец:»+прав(пробел,32-(9+СтрДлина(Константа.Кассир7)))+(Константа.Кассир7),32);
Объект.PrintString();
КонецЕсли;
Пока СписокТоваров.ПолучитьСтроку() = 1 Цикл
СтрокаДляПечати = СокрЛП(СписокТоваров.ТовНаим);
ДлинаСтроки = 32;
//Пока СтрДлина(СтрокаДляПечати)>0 Цикл
//Объект.StringForPrinting = Лев(СтрокаДляПечати,ДлинаСтроки);
//Объект.PrintString();
//СтрокаДляПечати = СокрЛП(Сред(СтрокаДляПечати,ДлинаСтроки+1));
//КонецЦикла;
Объект.Password = Пароль;
Объект.StringForPrinting = Лев(СтрокаДляПечати,ДлинаСтроки);
// Объект.Price = СписокТоваров.Цена;
Если СписокТоваров.Количество=0 тогда
Объект.Price = СписокТоваров.Цена;
иначе
Объект.Price = СписокТоваров.Сумма/СписокТоваров.Количество;
КонецЕсли;
Объект.Quantity = СписокТоваров.Количество;
Объект.Department = НомерСекции;
//Проверка наличия колонки «НДС» в таблице значений.
НДСЕсть = «»;
Попытка
НДС = СписокТоваров.НДС;
НДСЕсть = 1;
Исключение
НДСЕсть = 0;
КонецПопытки;
Если НДСЕсть = 1 Тогда//Печатаем НДС
// В настройках ФР надо настроить ставки:
// Налог 1 = 18% — НДС 18%
// Налог 2 = 10% — НДС 10%
// Налог 3 = 20% — НДС 20%
Если СписокТоваров.НДС = 18 Тогда
Объект.Tax1 = 1;
ИначеЕсли СписокТоваров.НДС = 10 Тогда
Объект.Tax1 = 2;
ИначеЕсли СписокТоваров.НДС = 20 Тогда
Объект.Tax1 = 3;
Иначе
Объект.Tax1 = 0;
КонецЕсли;
Объект.Tax2 = 0;
Объект.Tax3 = 0;
Объект.Tax4 = 0;
КонецЕсли;
Если ПризнВозврата = 0 Тогда
Объект.Sale();
Иначе
Объект.ReturnSale();
КонецЕсли;
Если Объект.ResultCode <> 0 Тогда
ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
АннулированиеЧека(Объект, Пароль);
ОтключитьсяОтФР(Объект, Пароль, 0);
Возврат 0;
КонецЕсли;
Если ПустоеЗначение(СписокТОваров.СкидкаПоСтроке) = 0 Тогда
пробел =»…………………………..» ;
Объект.StringForPrinting = Лев(«Стоимость»+прав(пробел,32-(9+СтрДлина(Формат(СписокТоваров.Цена*СписокТоваров.Количество,»Ч.2″))))+Формат(СписокТоваров.Цена*СписокТоваров.Количество,»Ч.2»),32);
Объект.PrintString();// СписокТоваров.СкидкаПоСтроке
Объект.StringForPrinting = «Скидка «+СписокТоваров.СкидкаПоСтроке+»%»+прав(пробел,32-(5+СтрДлина(СписокТоваров.СкидкаПоСтроке-СписокТоваров.СкидкаСпасибо)+СтрДлина(Формат((СписокТоваров.Цена*СписокТоваров.Количество-СписокТоваров.Сумма-СписокТоваров.СкидкаСпасибо),»Ч.2″))))+Формат(((СписокТоваров.Цена*СписокТоваров.Количество)-СписокТоваров.Сумма-СписокТоваров.СкидкаСпасибо),»Ч.2»);
Объект.PrintString();
//доб.скидка СПАСИБО
Если пустоезначение(СписокТоваров.СкидкаСпасибо)=0 тогда
Объект.StringForPrinting = «Скидка СПАСИБО»+прав(пробел,32-(10+СтрДлина(СписокТоваров.СкидкаСпасибо)+СтрДлина(Формат((СписокТоваров.СкидкаСпасибо),»Ч.2″))))+Формат(((СписокТоваров.СкидкаСпасибо)),»Ч.2»);
Объект.PrintString();
Объект.StringForPrinting = «Общая скидка «+прав(пробел,32-(11+СтрДлина(СписокТоваров.СкидкаПоСтроке)+СтрДлина(Формат((СписокТоваров.Цена*СписокТоваров.Количество-СписокТоваров.Сумма),»Ч.2″))))+Формат(((СписокТоваров.Цена*СписокТоваров.Количество)-СписокТоваров.Сумма),»Ч.2»);
Объект.PrintString();
КонецЕсли;
Объект.StringForPrinting = Лев(«Всего»+прав(пробел,32-(5+СтрДлина(Формат(СписокТоваров.Сумма,»Ч.2″))))+Формат(СписокТоваров.Сумма,»Ч.2»),32);
Объект.PrintString();
ИначеЕсли ПустоеЗначение(СписокТОваров.СкидкаСпасибо) = 0 тогда
пробел =»…………………………..» ;
Объект.StringForPrinting = Лев(«Стоимость»+прав(пробел,32-(9+СтрДлина(Формат(СписокТоваров.Цена*СписокТоваров.Количество,»Ч.2″))))+Формат(СписокТоваров.Цена*СписокТоваров.Количество,»Ч.2»),32);
Объект.PrintString();//
Объект.StringForPrinting = «Скидка СПАСИБО»+прав(пробел,32-(10+СтрДлина(СписокТоваров.СкидкаСпасибо)+СтрДлина(Формат((СписокТоваров.СкидкаСпасибо),»Ч.2″))))+Формат(((СписокТоваров.СкидкаСпасибо)),»Ч.2»);
Объект.PrintString();
Объект.StringForPrinting = Лев(«Всего»+прав(пробел,32-(5+СтрДлина(Формат(СписокТоваров.Сумма,»Ч.2″))))+Формат(СписокТоваров.Сумма,»Ч.2»),32);
Объект.PrintString();
//конец скидка СПАСИБО
КонецЕсли;
//
// Если ПустоеЗначение(СписокТОваров.СкидкаПоСтроке) = 0 Тогда
//
// Объект.Password = Пароль;
// Объект.StringForPrinting = Лев(СтрокаДляПечати,ДлинаСтроки);
// // Объект.Price = СписокТоваров.Цена;
// Объект.Price = СписокТоваров.Сумма/СписокТоваров.Количество;
// Объект.Quantity = СписокТоваров.Количество;
// Объект.Department = НомерСекции;
//
// //Проверка наличия колонки «НДС» в таблице значений.
// НДСЕсть = «»;
// Попытка
// НДС = СписокТоваров.НДС;
// НДСЕсть = 1;
// Исключение
// НДСЕсть = 0;
// КонецПопытки;
//
// Если НДСЕсть = 1 Тогда//Печатаем НДС
//
// // В настройках ФР надо настроить ставки:
// // Налог 1 = 18% — НДС 18%
// // Налог 2 = 10% — НДС 10%
// // Налог 3 = 20% — НДС 20%
//
// Если СписокТоваров.НДС = 18 Тогда
// Объект.Tax1 = 1;
// ИначеЕсли СписокТоваров.НДС = 10 Тогда
// Объект.Tax1 = 2;
// ИначеЕсли СписокТоваров.НДС = 20 Тогда
// Объект.Tax1 = 3;
// Иначе
// Объект.Tax1 = 0;
// КонецЕсли;
// Объект.Tax2 = 0;
// Объект.Tax3 = 0;
// Объект.Tax4 = 0;
// КонецЕсли;
//
// Если ПризнВозврата = 0 Тогда
// Объект.Sale();
// Иначе
// Объект.ReturnSale();
// КонецЕсли;
//
// Если Объект.ResultCode <> 0 Тогда
// ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
// АннулированиеЧека(Объект, Пароль);
// ОтключитьсяОтФР(Объект, Пароль, 0);
// Возврат 0;
// КонецЕсли;
//
//
//
//
//
// КонецЕсли;
//
КонецЦикла;
//Если СкидкаСуммой <> 0 тогда
// Объект.StringForPrinting=» Спасибо за покупку»;
// Объект.Summ1 = СкидкаСуммой;
// Объект.Discount();
//КонецЕсли;
//
Объект.Password = Пароль;
Объект.Summ1 = Получено;
Объект.Summ2 = ПолучСерт;
Объект.Summ3 = 0;
Объект.Summ4 = ПолучКарт;
Объект.StringForPrinting=» «;
Объект.StringForPrinting=» Спасибо за покупку»;
// Объект.StringForPrinting=» «;
// Сообщить(«ывпаыв»);
Объект.DiscountOnCheck=Скидка;
Объект.DiscountOnCheck=0;
Объект.CloseCheck();
Если Объект.ResultCode <> 0 Тогда
ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
АннулированиеЧека(Объект, Пароль);
ОтрезатьЧек(Объект, Пароль);
ОтключитьсяОтФР(Объект, Пароль, 0);
Возврат 0;
КонецЕсли;
Объект.Password = Пароль;
Объект.GetECRStatus();
Если Объект.ResultCode <> 0 Тогда
ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
ОтключитьсяОтФР(Объект, Пароль, 0);
Возврат 0;
КонецЕсли;
НомерЧека = Объект.OpenDocumentNumber+?(Объект.ECRAdvancedMode=5,1,0);
// ОтрезатьЧек(Объект, Пароль);
Возврат ОтключитьсяОтФР(Объект, Пароль);
КонецФункции
//********************************************************************************
Функция ЗакрытьСмену(Объект, Пароль, НомерЛенты)
Рез = 0;
Если ПустоеЗначение(Объект) = 1 Тогда
ОписаниеРезультата = «устройство не подключено»;
ИначеЕсли ПодключитьсяКФР(Объект, Пароль) = 1 Тогда
// переключение в режим снятия отчета (нужен пароль администратора)
Объект.Password = Пароль;
Объект.PrintReportWithCleaning();
Если Объект.ResultCode <> 0 Тогда
ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
ОтключитьсяОтФР(Объект, Пароль, 0);
Возврат 0;
КонецЕсли;
Объект.Password = Пароль;
Объект.GetECRStatus();
Если Объект.ResultCode <> 0 Тогда
ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
ОтключитьсяОтФР(Объект, Пароль, 0);
Возврат 0;
КонецЕсли;
НомерЛенты = Объект.SessionNumber+?(Объект.ECRAdvancedMode=5,1,0);
ОтрезатьЧек(Объект, Пароль);
Рез = ОтключитьсяОтФР(Объект, Пароль);
КонецЕсли;
Возврат Рез;
КонецФункции
///////////////////////////////////////////////
Функция ОткрытьСмену(Объект, Пароль, НомерЛенты)
Рез = 0;
Если ПустоеЗначение(Объект) = 1 Тогда
ОписаниеРезультата = «устройство не подключено»;
ИначеЕсли ПодключитьсяКФР(Объект, Пароль) = 1 Тогда
// переключение в режим снятия отчета (нужен пароль администратора)
Объект.Password = Пароль;
Объект.OpenSession();
КонецЕсли;
Возврат Рез;
КонецФункции
Функция СнятьХотчет(Объект, Пароль, НомерЛенты)
Рез = 0;
Если ПустоеЗначение(Объект) = 1 Тогда
ОписаниеРезультата = «устройство не подключено»;
ИначеЕсли ПодключитьсяКФР(Объект, Пароль) = 1 Тогда
// переключение в режим снятия отчета (нужен пароль администратора)
Объект.Password = Пароль;
// Объект.PrintReportWithCleaning();
Объект.PrintReportWithoutCleaning();
КонецЕсли;
Возврат Рез;
КонецФункции
//********************************************************************************
Функция ПроверкаПароля (Пароль)
Если ПустаяСтрока(Пароль) = 1 Тогда
Ответ = «неправильно указан пароль пользователя»;
Возврат Ответ;
Иначе
Попытка
ПарольЧислом = Число(Пароль);
Исключение
Ответ = «неправильно указан пароль пользователя»;
Возврат Ответ;
КонецПопытки;
КонецЕсли;
Возврат «»;
КонецФункции
//********************************************************************************
Процедура ПриОткрытии()
Перем Объект, НомерЧека, НомерЛенты, Парам;
СтатусВозврата(0);
Форма.Параметр.Выгрузить(Парам);
Форма.Параметр.УдалитьВсе();
Если Парам.РазмерСписка() = 0 Тогда
Рез = 0;
ОписаниеРезультата = «в обработку не переданы параметры»;
Иначе
Процесс = НРег(Парам.Получить(«Процесс»));
Если Процесс = «подключить» Тогда
Компонента = Парам.Получить(«Компонента»);
ПрогИд = Парам.Получить(«ПрогИд»);
Пароль = Парам.Получить(«ПарольПользователя»);
ОписаниеРезультата = ПроверкаПароля (Пароль);
Если ОписаниеРезультата <> «» Тогда
Рез = 0;
Иначе
Рез = Подключить(Компонента, ПрогИд, Объект, Пароль);
Форма.Параметр.Установить(«Объект», Объект);
КонецЕсли;
ИначеЕсли Процесс = «отключить» Тогда
Рез = Отключить(Объект, Пароль);
ИначеЕсли Процесс = «печатать_текст» Тогда
Объект = Парам.Получить(«Объект»);
Пароль = Парам.Получить(«ПарольПользователя»);
Текст = Парам.Получить(«Текст»);
ОписаниеРезультата = ПроверкаПароля (Пароль);
Если ОписаниеРезультата <> «» Тогда
Рез = 0;
Иначе
Рез = ПечататьТекст(Объект, Пароль, Текст);
КонецЕсли;
ИначеЕсли Процесс = «печатать_текст_спасибо» Тогда
Объект = Парам.Получить(«Объект»);
Пароль = Парам.Получить(«ПарольПользователя»);
Текст = Парам.Получить(«Текст»);
ОписаниеРезультата = ПроверкаПароля (Пароль);
Если ОписаниеРезультата <> «» Тогда
Рез = 0;
Иначе
Рез = ПечататьТекстСпасибо(Объект, Пароль, Текст);
КонецЕсли;
ИначеЕсли Процесс = «печатать_чек» Тогда
Объект = Парам.Получить(«Объект»);
Пароль = Парам.Получить(«ПарольПользователя»);
СписокТоваров = Парам.Получить(«СписокТоваров»);
Получено = Парам.Получить(«Получено»);
ПолучСерт = Парам.Получить(«ПолучСерт»);
ПолучКарт = Парам.Получить(«ПолучКарт»);
ЧекНаВозврат = Парам.Получить(«Возврат»);
НомерСекции = Парам.Получить(«НомерСекции»);
Скидка = Парам.Получить(«Скидка»);
СкидкаСуммой = Парам.Получить(«СкидкаСуммой»);
НомерДок1 = Парам.Получить(«НомерДок1»);
ОписаниеРезультата = ПроверкаПароля (Пароль);
Если ОписаниеРезультата <> «» Тогда
Рез = 0;
Иначе;
Рез = ПечататьЧек(Объект, Пароль, СписокТоваров, Получено, ПолучСерт, ПолучКарт, Скидка, ЧекНаВозврат, НомерСекции, НомерЧека,СкидкаСуммой,НомерДок1);
Форма.Параметр.Установить(«НомерЧека», НомерЧека);
Объект.MarkingType = 17485;
Объект.GTIN = GTIN;
Объект.SerialNumber = SerialNumber;
Объект.FNSendItemCodeData();
КонецЕсли;
ИначеЕсли Процесс = «закрыть_смену» Тогда
Объект = Парам.Получить(«Объект»);
Пароль = Парам.Получить(«ПарольАдминистратора»);
Если Число(Пароль)=0 Тогда
Рез = 0;
ОписаниеРезультата = «неправильно указан пароль администратора»;
Иначе
Рез = ЗакрытьСмену(Объект, Пароль, НомерЛенты);
Форма.Параметр.Установить(«НомерЛенты», НомерЛенты);
КонецЕсли;
ИначеЕсли Процесс = «открыть_смену» Тогда
/// Сообщить(«Мытут»);
Объект = Парам.Получить(«Объект»);
Пароль = Парам.Получить(«ПарольАдминистратора»);
Рез = ОткрытьСмену(Объект, Пароль, НомерЛенты);
ИначеЕсли Процесс = «снятьхотчет» Тогда
/// Сообщить(«Мытут»);
Объект = Парам.Получить(«Объект»);
Пароль = Парам.Получить(«ПарольАдминистратора»);
Рез = СнятьХотчет(Объект, Пароль, НомерЛенты);
//Если Число(Пароль)=0 Тогда
// Рез = 0;
// ОписаниеРезультата = «неправильно указан пароль администратора»;
//Иначе
// Рез = ОткрытьСмену(Объект, Пароль, НомерЛенты);
// Форма.Параметр.Установить(«НомерЛенты», НомерЛенты);
//КонецЕсли;
//
Иначе
ОписаниеРезультата = «неизвестная команда»;
Рез = 0;
КонецЕсли;
КонецЕсли;
Форма.Параметр.Установить(«Результат» , Рез);
Форма.Параметр.Установить(«ОписаниеРезультата», ОписаниеРезультата);
КонецПроцедуры
//********************************************************************************
ОписаниеРезультата = «»;
37 — 23.10.20 — 11:34
Вот полный код, что я делаю не так?
Функция ПечататьЧек(Объект, Пароль, СписокТоваров, Получено1, Скидка, ПризнВозврата, НомерСекции, НомерЧека,ТипНалогов)
Если ПризнВозврата = 0 Тогда
Объект.CheckType= 0// «0» — продажа, «1» — покупка, «2» — возврат продажи, «3» — возврат покупки.
Иначе
Объект.CheckType= 2;
КонецЕсли;
рез=Объект.OpenCheck();
Если рез<>0 Тогда
Сообщить(«НапечататьЧек, ошибка открытия нового чека: «+Объект.ResultCodeDescription);
рКодОшибки=Объект.ResultCode;
КонецЕсли;
// регистрация товаров
Объект.TaxType = ТипНалогов;
РезРегистрация = 1;
Получено1 = 0;
КорректноКудаОтправитьЧек = -1;//-1 не ввден, 1- корректно,0 не корректно
Если ПустоеЗначение(КудаОтправитьЧек) = 0 Тогда
Если Найти(СокрЛП(КудаОтправитьЧек),»@») <> 0 Тогда
КорректноКудаОтправитьЧек = 1;
ИначеЕсли Лев(СокрЛП(КудаОтправитьЧек),2) = «+7» Тогда
КорректноКудаОтправитьЧек = 1;
Иначе
КорректноКудаОтправитьЧек = 0;
Если Вопрос(«Не корректно введен email или номер телефона клиента, пробить обычный чек?»,4) = 6 Тогда
КорректноКудаОтправитьЧек = -1;
Иначе
Предупреждение(«Проверте email или номер телефона клиента, номер телефона должен начинаться на +7»);
Возврат 0;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Объект.Password = Пароль;
Если СокрЛП(Продавец.ИНН) <> «» Тогда
Объект.TagNumber = 1203;
Объект.TagType = 7;
Объект.TagValueStr = СокрЛП(Продавец.ИНН);
Объект.FNSendTag();
КонецЕсли;
СуммаСкидкиНаЧек = 0;
СписокТоваров.ВыбратьСтроки();
Пока СписокТоваров.ПолучитьСтроку() = 1 Цикл
СтрокаДляПечати = СписокТоваров.ТовНаим;
Объект.Password = Пароль;
Объект.StringForPrinting = Лев(СтрокаДляПечати,48);
Если СуммаСкидки = 0 Тогда
Объект.Price = СписокТоваров.Цена;
Получено1 = Получено1+ СписокТоваров.Цена * СписокТоваров.Количество;
Иначе
СуммаСкидкиНаЧек =СуммаСкидкиНаЧек +(СписокТоваров.Цена * СписокТоваров.Количество — СписокТоваров.Сумма);
ЦенаЦены =Окр(СписокТоваров.Сумма/СписокТоваров.Количество,2);
Объект.Price = ЦенаЦены;
Получено1 = Получено1+ ЦенаЦены * СписокТоваров.Количество;
КонецЕсли;
Объект.Quantity = СписокТоваров.Количество;
Объект.Department = НомерСекции;
НДСЕсть = «»;
Попытка
НДС = СписокТоваров.НДС;
НДСЕсть = 1;
Исключение
НДСЕсть = 0;
КонецПопытки;
Если НДСЕсть = 1 Тогда//Печатаем НДС
// В настройках ФР надо настроить ставки:
// Налог 1 = 18% — НДС 18%
// Налог 2 = 10% — НДС 10%
// Налог 3 = 20% — НДС 20%
Если СписокТоваров.НДС = 18 Тогда
Объект.Tax1 = 1;
ИначеЕсли СписокТоваров.НДС = 10 Тогда
Объект.Tax1 = 2;
ИначеЕсли СписокТоваров.НДС = 20 Тогда
Объект.Tax1 = 3;
Иначе
Объект.Tax1 = 0;
КонецЕсли;
Объект.Tax2 = 0;
Объект.Tax3 = 0;
Объект.Tax4 = 0;
ДлинаСтроки = 36;
Иначе
ДлинаСтроки = 0;
КонецЕсли;
Если ПустоеЗначение(СокрЛП(СписокТоваров.Маркировка)) = 0 Тогда
КМ = СокрЛП(СписокТоваров.Маркировка);
GTIN = Сред(КМ, 3, 14);
SerialNumber = Сред(КМ, 19, 13);
Объект.Пароль = Пароль;
Объект.MarkingType = 17485;// Это «444D»
Объект.GTIN = GTIN;
Объект.SerialNumber = SerialNumber;
Объект.FNSendItemCodeData(); // отправка тега маркировки
КонецЕсли;
Объект.FNOperation();
Если Объект.ResultCode <> 0 Тогда
ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
АннулированиеЧека(Объект, Пароль);
Сообщить(ОписаниеРезультата);
Возврат 0;
КонецЕсли;
КонецЦикла;
Если константа.ПисатьСуммуСкидкиВЧеке = 1 тогда
СтрокаДляПечати = «Сумма скидки на чек:» + Строка(глФРМ(СуммаСкидкиНаЧек,Валюта,1));
Объект.Password = Пароль;
Объект.StringForPrinting = Лев(СтрокаДляПечати,48);
Иначе
СтрокаДляПечати = «__________________________»; //+ Строка(глФРМ(СуммаСкидки,Валюта,1));
Объект.Password = Пароль;
Объект.StringForPrinting = Лев(СтрокаДляПечати,48);
КонецЕсли;
Объект.Password = Пароль;
Если ВидПлатежа = перечисление.ВидыПлатежа.Нал тогда
Объект.Summ1 = Получено1;
Объект.Summ2 = 0;
Иначе
Объект.Summ1 = 0;
Объект.Summ2 = Получено1;
КонецЕсли;
Объект.Summ3 = 0;
Объект.Summ4 = 0;
Объект.FNCloseCheckEx();
Объект.CloseCheck();
Если Объект.ResultCode <> 0 Тогда
ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
АннулированиеЧека(Объект, Пароль);
ОтрезатьЧек(Объект, Пароль);
Сообщить(ОписаниеРезультата);
Возврат 0;
КонецЕсли;
Объект.Password = Пароль;
Объект.GetECRStatus();
Если Объект.ResultCode <> 0 Тогда
ОписаниеРезультата = ПолучитьОписаниеРезультата(Объект);
Сообщить(ОписаниеРезультата);
Возврат 0;
КонецЕсли;
НомерЧека = Объект.OpenDocumentNumber+?(Объект.ECRAdvancedMode=5,1,0);
КонецФункции
Ошибка при выводе чека ККМ в 1С 8: 36h, Ошибка FNOperation: Некорректные параметры в команде для данной реализации
Описание ошибки:
Ошибка возникла внезапно. Т.е. до ее возникновения чеки ККМ печатались. При попытке печати чека ККМ в частности из документа «Оплата от покупателя платежной картой» конфигурации 1С: Управление торговлей 10.3 возникала эта ошибка для отдельно взятого документа, на основании которого документ оплаты был создан.
Найденные решения:
Судя по ошибке — она носит «универсальный» характер, т.е. может возникнуть в любой другой конфигурации 1С, в которой поддерживается работа с торговым оборудованием и ККМ в частности. Поэтому не обращайте внимание на то, что пример приводится в редакции 10.3 управления торговлей. Многие из перечисленных настроек есть и в новой редакции 11.4, и других типовых конфигурациях, поэтому останется только их найти.
Перейдем к сути. Печать чеков работала до определенного момента, когда стала не возможным по причине возникновения ошибки «36h, Ошибка FNOperation: Некорректные параметры в команде для данной реализации». По предварительным предположениям, учитывая, что в документе из ссылок на документы — только заказ покупателя, то при чем тут реализация? Можно подумать, что реализацией при описании ошибки назван любой документ-основание, содержащий данные для печати чека. Тогда, возможно, надо искать причину в самом документе заказ покупателя. Но визуально содержимое выглядело «как всегда», как и в ранее созданных документах, для которых печать чека был выполнен успешно.
Рис. 1. Возникновение ошибки после нажатия на кнопку «Пробить чек» в форме документа «Оплата от покупателя платежной картой».
Ошибка не часто, но встречаемая. Чтобы попытаться понять суть ошибки в соответствии с первыми комментариями обсуждения ошибки на форуме infostart.ru о том, что нужно проанализировать лог кассы, было включено ведение файла .log.
Нажатие на изображении увеличит его
Рис.2. Включение ведения лога в параметрах кассы ККМ в диалоге подключения и настройки торгового оборудования.
После включения настройки «вести лог» на вкладка «Настройка лога» в параметрах ККТ с передачей данных необходимо настроить путь к логу в настройках драйвера.
Нажатие на изображении увеличит его
Рис. 3. Настройка пути размещения файла лога .log в драйвере ККМ.
Анализ полученного лога после его формирования оказался достаточно проблематичным, т.к. содержал просто огромное количество строк, проанализировать которые без постоянного опыта обслуживания торгового оборудования, не представлялось возможным. Только было отмечено благодаря логу, что после возникшей ошибки, т.е. неудачной попытки печати чека, касса в среде 1С становилась недоступной. Тест подключения возвращал ошибку FFFFFFF8h, connect timed out.
Рис. 4. Ошибка «Тест не пройден. FFFFFFF8h, Connect timed out.» после возникновения ошибки «36h, Ошибка FNOperation: Некорректные параметры в команде» в сеансе работы 1С 8.
Но вернуть подключение 1С 8 к кассе ккм позволяло завершение сеанса работы и запуск 1С снова.
Рис. 5. Пример успешного выполнения теста подключения торгового оборудования в форме оборудования.
Но от этого проблема не решалась. Лишь возобновилась возможность снова и снова получать ошибку «36h, Ошибка FNOperation: Некорректные параметры в команде…» при попытке вывести чек для операции безналичной оплаты.
На форуме mista.ru в обсуждении под темой При пробитии чека в 1с УТ ред.11 выдает ошибку 36h предлагалось проверить наличие скидок в документе — они отсутствовали. Так же предлагалось в сумбурной формулировке настроить разбиение строк на 2.
Этого оказалось недостаточно. Окончательную ясность для формулировки «настроить разбиение строк» внесли статьи Ошибка на кассе 36h Штрих и Сумма налога больше суммы регистраций по чеку и/или итога (Атол). УТ 10.3 о том, чтобы изменить «способ форматно-логического» контроля в настройках элемента справочника «Торговое оборудование». Для этого нужно перейти в форму списка справочника «Торговое оборудование» через кнопку «…» ячейки строки колонки «Модель» формы обработки «Подключение и настройка торгового оборудования».
Нажатие на изображении увеличит его
Рис. 6. Порядок перехода к настройке «способ форматно-логического контроля» справочника «Торговое оборудование» в конфигурации 1С: Управление торговлей 8, ред. 10.3, Комплексная автоматизация 1.1
Установка значения «Разделять строки» для настройки «способ форматно-логического контроля» в форме элемента справочника «Торговое оборудование» позволило восстановить дальнейшую работу механизма печати чеков ккм для безналичных оплат.
Рис. 7. Рабочая настройка способа форматно-логического контроля в значении «Разделять строки» для обхода ошибки «36h, Ошибка FNOperation: Некорректные параметры»
К слову, в других конфигурациях, работающих в режиме управляемого приложения, порядок действий примерно такой же. Переходим в раздел «Администрирование» (или «НСИ и Администрирование» в зависимости от типового решения 1С — «Подключаемое оборудование» — откроется вкладка «Подключение и настройка оборудования». Устанавливаем тип оборудования в значение «ККТ с передачей данных». В списке правой кнопкой мыши для строки нужной модели вызываем контекстное меню и в нем выбираем пункт «Изменить» или, выделив строку, нажимаем клавишу «F2» клавиатуры. В открывшемся окне разворачиваем группу формы «Параметры ККТ» и изменяем значение настройки «способ форматно-логического контроля».
Нажатие на изображении увеличит его
Рис. 8. На примере конфигурации базы 1С: Бухгалтерия 3.0 показан доступ к настройке способ форматно-логического контроля в списке «Подключение и настройка оборудования» для баз, работающих в режиме управляемого интерфейса.
Таким образом, получается, что драйвер торгового оборудования при такой настройке, если не возможно рассчитать точную сумму по допустимому расхождению, то будет выполнено округление цен по строкам. Одна строка будет округляться «вверх», а другая – «вниз». И при таком подходе будет выполнено требование, чтобы итоговая сумма была одинаковой, даже при некоторых небольших изменениях стоимости отдельных товаров, например, за счет скидок или дробных значений количества товаров.
Оцените, помогло ли Вам предоставленное описание решения ошибки?
© www.azhur-c.ru 2014-2020. Все права защищены. Использование текстов и изображений с данной страницы без письменного разрешения владельца запрещено. При использовании материалов с данной страницы обязательно указание ссылки на данную страницу.
21-10-2021
Журавлев А.С.
(Сайт azhur-c.ru)
█ 29.08.2021 11:16
Добрый день, столкнулся с такой вещью: при продае товара все норм, если кол-во целое число, но если передаю не целое число : Float то касса не печатает чек и уходит в ошибку, если печатать в «тест драйвер» — то там дробное кол-во проходит, например 1.3 или 66.6
Код:
Form2.ADOQuery2.SQL.Clear; Form2.ADOQuery2.SQL.Text:='SELECT nomen, kol, suma FROM kassa '; Form2.ADOQuery2.Open; Form2.Memo1.Lines.Add('Печать чека '); //Открываем чек и указываем, что это чек ПРИХОДА Driver.CheckType := 0; Driver.OpenCheck; Driver.RegisterNumber :=148; Driver.GetOperationReg; cheq_kkm:= Driver.OpenDocumentNumber; //Передаем тег ИНН Кассира Driver.TagNumber := 1203; Driver.TagType := 7; Driver.TagValueStr := Form2.Label11.Caption; Driver.FNSendTag; Driver.TagNumber := 1084; Driver.FNBeginSTLVTag; my_TagID := Driver.TagID; Driver.TagID := my_TagID; Driver.TagNumber := 1085; Driver.TagType := 7; Driver.TagValueStr := ''; Driver.FNAddTag; Driver.TagID := my_TagID; Driver.TagNumber := 1086; Driver.TagType := 7; Driver.TagValueStr := ''; Driver.FNAddTag; Driver.FNSendSTLVTag; while not Form2.ADOQuery2.Eof do begin Driver.QuantityFormat:=1; q1 := Form2.ADOQuery2.FieldByName('kol').AsFloat; q1 := RoundTO(q1, -1); //Стоимость товара с учетом скидок и наценок pq1:= Form2.ADOQuery2.FieldByName('suma').AsFloat; Form2.Memo1.Lines.Add(FLoatToStr(q1)+' '+FLoatToStr(pq1)+' '+nal ); Driver.Quantity := q1; Driver.Price:=pq1; Driver.Summ1Enabled := false; Driver.Tax1 := 1; Driver.Department := 1; Driver.PaymentTypeSign := 1; //Признак способа расчета для ФФД 1.05 Driver.PaymentItemSign := 2; //Признак предмета расчета Driver.StringForPrinting := Form2.ADOQuery2.FieldByName('nomen').Asstring; Driver.FNOperation; Form2.ADOQuery2.Next; end; //Передаем данные поставщика Driver.TagNumber := 1224; Driver.FNBeginSTLVTag; my_TagID := Driver.TagID; Driver.TagID := my_TagID; Driver.TagNumber := 1225; Driver.TagType := 7; Driver.TagValueStr := ''; Driver.FNAddTag; Driver.TagID := my_TagID; Driver.TagNumber := 1171; Driver.TagType := 7; Driver.TagValueStr := ''; Driver.FNAddTag; Driver.FNSendSTLVTagOperation; Driver.CheckSubtotal; if (ibeznal=1) AND (inal=0) then begin Driver.Summ1 := 0; Driver.Summ2 := StrToFloat(beznal); end; if (ibeznal=0) AND (inal=1)then begin Driver.Summ1 :=StrToFloat(nal); Driver.Summ2 := 0 ; end; if (ibeznal=1) AND (inal=1) then begin Driver.Summ1 :=StrToFloat(nal); Driver.Summ2 :=StrToFloat(beznal) ; end; if kc=1 then Driver.Summ3 := bonuscard; Driver.Summ3 := 0; Driver.Summ4 := 0; Driver.Summ5 := 0; Driver.Summ6 := 0; Driver.Summ7 := 0; Driver.Summ8 := 0; Driver.Summ9 := 0; Driver.Summ10 := 0; Driver.Summ11 := 0; Driver.Summ12 := 0; Driver.Summ13 := 0; Driver.Summ14 := 0; Driver.Summ15 := 0; Driver.Summ16 := 0; Driver.RoundingSumm := 0; Driver.TaxType := 1; //Driver.StringForPrinting := 'ИД ЧЕКА : '+IntToStr(chek); //if car_number<>0 then Driver.StringForPrinting := 'ГОС НОМЕР АВТОМОБИЛЯ : '+IntToStr(car_number); if kc=1 then begin if nach_bal<=0 then begin Driver.StringForPrinting := '========Бонусная программа========'; Driver.StringForPrinting := 'Списано баллов : '+IntToStr(spis_bal); end else begin if spis_bal<=0 then Driver.StringForPrinting := 'Начислено баллов : '+IntToStr(nach_bal); end; end; Driver.FNCloseCheckEx;
Подскажите пожалуста, что яделаю не так?
█ 29.08.2021 11:30
Не это?
Код:
REG QUERY "HKEY_CURRENT_USERControl PanelInternational" /v "sDecimal"
█ 29.08.2021 15:37
Цитата:
OlegON ➤ Не это?
Код:
REG QUERY "HKEY_CURRENT_USERControl PanelInternational" /v "sDecimal"
Тогда проблемы с записью в БД, но число, судя по полю Memo , возвращается с точкой, как если написать и в «Тест драйвер»
█ 29.08.2021 17:12
так попробуй отдельно, без записи в БД, поставь разделитель точкой?
█ 29.08.2021 18:53
Цитата:
OlegON ➤ так попробуй отдельно, без записи в БД, поставь разделитель точкой?
Вобщем столкнулся с каой странностью -вот так работает:
Код:
Driver.Quantity := StrToFloat(Edit13.Text); Driver.Price:=StrToFloat(Edit12.Text);
А так — не работает :
Код:
Form2.Edit13.text:= Form2.ADOQuery2.FieldByName('kol').AsString; Form2.Edit12.text:= Form2.ADOQuery2.FieldByName('suma').AsString; Driver.Quantity := StrToFloat(Form2.Edit13.text); Driver.Price:=StrToFloat(Form2.Edit12.text);
Числа одинаковые и там и там
█ 29.08.2021 19:39
«Не верю» Странно, что у тебя один код с указанием Form2, другой — нет. Сделай еще один Edit с длиной того, что находится в Edit12 и Edit13, сравни, что там, когда работает и когда — нет. Если длина различается, сравнивай коды символов.
█ 29.08.2021 21:12
А не проще ли в логе драйвера посмотреть что в фр реально падает?
█ 29.08.2021 21:24
Цитата:
OlegON ➤ «Не верю» Странно, что у тебя один код с указанием Form2, другой — нет. Сделай еще один Edit с длиной того, что находится в Edit12 и Edit13, сравни, что там, когда работает и когда — нет. Если длина различается, сравнивай коды символов.
Можете подсказать как примерно сделать?
█ 29.08.2021 21:27
Что именно? Form2.Memo1.Lines.Add(Length(Form2.Edit12.text)) не работает?
Но ты лучше посмотри, что тебе student советует, отлови в том и другом случае, что идет…
Часовой пояс GMT +3, время: 19:24.
Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and
privacy statement. We’ll occasionally send you account related emails.
Already on GitHub?
Sign in
to your account
Comments
при вызове метода печати чека в конечном итоге вылетает 94 ошибка Закрытие чека без позиций
ЛОГИ:
D [INPAS_PAX]: InpasPax::printPurchase start
D [INPAS_PAX]: InpasPax::readIsDocOpened start
D [INPAS_PAX]: InpasPax::readIsDocOpened ECR STATUS 8
D [INPAS_PAX]: InpasPax::cancelDoc start
D [INPAS_PAX]: InpasPax::checkResult checkResult error code: 0
D [INPAS_PAX]: InpasPax::cancelDoc success
D [INPAS_PAX]: InpasPax::printPurchase PURCHASE_TYPE_INPAS_SELL
D [INPAS_PAX]: InpasPax::checkResult checkResult error code: 0
D [INPAS_PAX]: InpasPax::printPurchase OpenCheck() CHECK OPENED
D [INPAS_PAX]: InpasPax::printPurchase Set_TaxType(): 1
D [INPAS_PAX]: InpasPax::printPurchase Is countable: yes ///штучный товар
D [INPAS_PAX]: InpasPax::printPurchase Set_Quantity : 1
D [INPAS_PAX]: InpasPax::printPurchase Set_CheckType : 0
D [INPAS_PAX]: InpasPax::printPurchase Set_Price : 10000
D [INPAS_PAX]: InpasPax::printPurchase Set_Tax1 0
D [INPAS_PAX]: InpasPax::printPurchase Set_MeasureUnit : 0
D [INPAS_PAX]: InpasPax::printPurchase Set_Department : 1
D [INPAS_PAX]: InpasPax::printPurchase Set_Summ1Enabled(false)
D [INPAS_PAX]: InpasPax::printPurchase Set_PaymentTypeSign(4)
D [INPAS_PAX]: InpasPax::printPurchase Set_PaymentItemSign(1)
D [INPAS_PAX]: InpasPax::printPurchase Set_StringForPrinting: Test
D [INPAS_PAX]: InpasPax::printPurchase Set_DivisionalQuantity(false)
D [INPAS_PAX]: InpasPax::checkResult checkResult error code: -9 ///тут вызов FNOperation()
D [INPAS_PAX]: InpasPax::printPurchase PAYMENT_CASH: 100
E [INPAS_PAX]: InpasPax::printPurchase TOTALE PRICE = 100 TOTALE CASH = 100 TOTALE CHANGE = 0
D [INPAS_PAX]: InpasPax::checkResult checkResult error code: 94
D [INPAS_PAX]: InpasPax::setLastErrMsg start
D [INPAS_PAX]: InpasPax::setLastErrMsg lastErrMsg: «Код ошибки 5Eh (94) от ККТ: Неверная операция <0x005E0033: закрытие чека без позиций>»
Можете подсказать что делаю не так?
@Commander4ek «Код ошибки 5Eh (94) от ККТ: Неверная операция <0x005E0033: закрытие чека без позиций>»
Вроде все в описании ошибки написано.
По ошибке -9 не корректные параметры в команде. Проверьте какие параметры указываете для позиции.
я возможно не до конца понимаю как эту позицию добавить, я так понял, что это делает FNOperation(), предварительно заполнив все свойства, который использует данный метод или я ошибаюсь?
да, всё так. покажите полный лог от открытия чека до закрытия, можно лог драйвера или лог КЯ.
@Commander4ek все верно, проверьте что именно передаете в параметрах,
разобрался, спасибо, проблема была в том что передаются разные значения в Set_CheckType в OpenCheck и ФН методы