:: Visual Foxpro, Foxpro for DOS
Re: И снова маркировка Атол
Равиль

Сообщений: 6576
Откуда: Уфа
Дата регистрации: 01.08.2003
Atlant
Ну, методом проб и ошибок выяснено, что пробивать по ФФД 1.2 без указанной выше проверки - низя. То есть, можно пробить при лбом результате проверки, но сделать её - нужно в любом случае...

Ну, тогда просим код в студию


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: И снова маркировка Атол
Atlant

Сообщений: 204
Откуда: Новосибирск
Дата регистрации: 01.09.2005
Там вообще много что поменялось по ФФД1.2 выложу код процедуры валидации у меня. Не обессудьте. из боевого проекта, потому у вас в лоб не взлетит
Кроме того, алкоголь теперь не маркированный товар. И в маркировку его (вроде как) нельзя пихать, а можно (и нужно, вероятно) пихать в тег 1163
Lparameters _checktype
Local _idbascheck, _noerror
Select bascheck
_idbascheck=bascheck.Id
_noerror=.T.
TEXT TO sqltext_m noshow
select m.barcode, k.code, k.name
from
kattov k
join bascheckd b on b.idkattov=k.id
join marked_bascheckd m on m.idbascheckd=b.id
where b.idbascheck=?_idbascheck
ENDTEXT
SQLExec(idconnect,sqltext_m,'marked')
*SQLExec(idconnect,'select barcode from egais_bascheckd where IDBASCHECKD in (select id from bascheckd where idbascheck=?bascheck.id)','egaised')
*Сразу возврат, все хорошо, проверять нечего
If Reccount('marked')=0 &&And Reccount('egaised')=0
This._hasmarked=.F.
Return .T.
Endif
*есть что попроверять
This._hasmarked=.T.
If Used('kmvalresult')
Select kmvalresult
Use
Endif
*очистим на всякий буфер ФН-а
This.fr.clearMarkingCodeValidationResult()
Create Cursor kmvalresult (Code c(50), Name c(254), mark_code c(254),vresult i, errorcode i, errormsg c(254))
Select marked
Scan
_barcode=Alltrim(marked.barcode)
If _checktype=This.fr.LIBFPTR_RT_SELL
_status=This.fr.LIBFPTR_MES_PIECE_SOLD &&Продажа
Else
_status=This.fr.LIBFPTR_MES_PIECE_RETURN &&Возврат
Endif
This.fr.SetParam(This.fr.LIBFPTR_PARAM_MARKING_CODE_TYPE, This.fr.LIBFPTR_MCT12_AUTO)
This.fr.SetParam(This.fr.LIBFPTR_PARAM_MARKING_CODE, _barcode)
This.fr.SetParam(This.fr.LIBFPTR_PARAM_MARKING_CODE_STATUS, _status)
*This.fr.SetParam(This.fr.LIBFPTR_PARAM_QUANTITY, 1.000)
*This.fr.SetParam(This.fr.LIBFPTR_PARAM_MEASUREMENT_UNIT, 0)
This.fr.SetParam(This.fr.LIBFPTR_PARAM_MARKING_WAIT_FOR_VALIDATION_RESULT, .T.)
This.fr.SetParam(This.fr.LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0)
*This.fr.SetParam(This.fr.LIBFPTR_PARAM_MARKING_FRACTIONAL_QUANTITY, "1/2")
This.fr.BeginMarkingCodeValidation()
_date_start_check=Datetime()
_max_time_to_check=5
Do While .T.
Wait Window Nowait 'Ожидание проверки марки товара...'
This.fr.GetMarkingCodeValidationStatus()
If This.fr.GetParamBool(This.fr.LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY)
Exit
Endif
Inkey(0.1, 'H')
If Datetime()-_date_start_check>_max_time_to_check && Если проверка дольше 5 сек, надо что-то делать
Exit
Endif
Enddo
If Datetime()-_date_start_check>_max_time_to_check
validationResult = 0
validationError = 404
validationErrorDescr = 'Превышено время на проверку марки, статус марки неизвестен'
Else
validationResult = This.fr.GetParamInt(This.fr.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT)
validationError = This.fr.GetParamInt(This.fr.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_ERROR)
validationErrorDescr = This.fr.GetParamString(This.fr.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_ERROR_DESCRIPTION)
Endif
*нужно подтвердить либо отказаться от марки. Есть смысл всегда подтверждать, т.к. отказаться мы можем при отказе от всего чека...
*If validationError>0
* This.fr.declineMarkingCode()
*Else
This.fr.AcceptMarkingCode()
*Endif
Insert Into kmvalresult (mark_code, vresult, errorcode, errormsg, Code, Name ) Values (_barcode, validationResult, validationError, validationErrorDescr, marked.Code, marked.Name )
*If validationError#0
* _noerror=.F.
*Endif
Endscan
**запишем в текст
Select kmvalresult
Scan For errorcode#0 Or Inlist (vresult,1,17,5,7)
txtlog('validationErrors.txt',Alltrim(Ttoc(Date()))+':code= '+Alltrim(Code)+';name= '+Alltrim(Name)+';km= '+;
ALLTRIM(mark_code)+';vresult= '+_str(vresult)+';errorcode= '+_str(errorcode)+';errormsg= '+Alltrim(errormsg))
_noerror=.F.
Endscan
If !_noerror
Select kmvalresult
Set Filter To errorcode#0 Or Inlist (vresult,1,17,5,7)
*показываем форму с ошибками
gobeep()
Do Form km_val_result To _noerror
Endif
Select kmvalresult
Set Filter To
If !_noerror
This.fr.clearMarkingCodeValidationResult()
Endif
Return _noerror



Исправлено 1 раз(а). Последнее : Atlant, 29.09.21 08:11
Ratings: 0 negative/0 positive
Re: И снова маркировка Атол
Atlant

Сообщений: 204
Откуда: Новосибирск
Дата регистрации: 01.09.2005
Ну и кусок кода с регистрацией позиции чека с моими проверками. Пока, вроде, все работает и в теории все верно...
Валидация чека у меня вызывается выше этого кода, вообще до открытия чека на ККТ.
Оговорюсь, все это работает, если касса реально под ФФД1.2 фискализована и версия прошивки выше 5.8.3 (она глючная)
Select bascheckd
Scan
SQLExec(idconnect,'select barcode from marked_bascheckd where IDBASCHECKD=?bascheckd.id','marked')
SQLExec(idconnect,'select barcode from egais_bascheckd where IDBASCHECKD=?bascheckd.id','egaised')
This.fr.setParam(This.fr.LIBFPTR_PARAM_COMMODITY_NAME, Alltrim(bascheckd.Name))
This.fr.setParam(This.fr.LIBFPTR_PARAM_POSITION_SUM , bascheckd.Summa-bascheckd.discount)
This.fr.setParam(This.fr.LIBFPTR_PARAM_QUANTITY, bascheckd.kol)
This.fr.setParam(This.fr.LIBFPTR_PARAM_PRICE, (bascheckd.cena*bascheckd.kol-bascheckd.discount)/bascheckd.kol)
This.fr.setParam(This.fr.LIBFPTR_PARAM_TAX_MODE, This.fr.LIBFPTR_TM_POSITION )
This.fr.setParam(This.fr.LIBFPTR_PARAM_INFO_DISCOUNT_SUM , bascheckd.discount)
_unit=0 &&штуки по умолчанию
Do Case
Case Atc('л',bascheckd.edn)>0
_unit=This.fr.LIBFPTR_IU_LITER
Case Atc('кг',bascheckd.edn)>0
_unit=This.fr.LIBFPTR_IU_KILOGRAM
Endcase
*теперь обязательно передавать единицу измерения
This.fr.setParam(This.fr.LIBFPTR_PARAM_MEASUREMENT_UNIT, _unit) &&Единица, мать её, измерения...
txtlog('checks.txt','Товар('+Alltrim(bascheckd.Code)+')'+Alltrim(bascheckd.Name)+' '+_str(bascheckd.cena)+'*'+_str(bascheckd.kol)+' скидка '+_str(bascheckd.discount)+' сумма '+_str(bascheckd.Summa-bascheckd.discount))
*// TaxTypeNumber - Номер налога:
*// 0 - Налог из секции -LIBFPTR_TAX_DEPARTMENT
*// 5 - НДС 0% - LIBFPTR_TAX_VAT0
*// 2 - НДС 10% - LIBFPTR_TAX_VAT10
*// 1 - НДС 18% - LIBFPTR_TAX_VAT18
*// 6 - НДС не облагается - LIBFPTR_TAX_NO
*// 4 - НДС с расчётной ставкой 10% - LIBFPTR_TAX_VAT110
*// 3 - НДС с расчётной ставкой 18% - LIBFPTR_TAX_VAT118
*// 7 - НДС 20% - LIBFPTR_TAX_VAT20
*// 8 - НДС с расчётной ставкой 20% - LIBFPTR_TAX_VAT120
*выводим налогоую ставку
*This.fr.setParam(This.fr.LIBFPTR_PARAM_TAX_TYPE, This.fr.LIBFPTR_TAX_VAT0)
If bascheck.sno#1 Or bascheckd.nds=-1
This.fr.setParam(This.fr.LIBFPTR_PARAM_TAX_TYPE, This.fr.LIBFPTR_TAX_NO)
Else
Select taxes
Locate For Val(taxe)=bascheckd.nds
If Found()
This.fr.setParam(This.fr.LIBFPTR_PARAM_TAX_TYPE, taxes.nn)
Endif
Endif
If !Empty(Nvl(bascheckd.ismarked,'')) And !Empty(Nvl(marked.barcode,'')) &&And Len(Alltrim(marked.barcode))=29
This.fr.setParam(This.fr.LIBFPTR_PARAM_MARKING_CODE,Alltrim(marked.barcode))
*////валидэйшн маркировки
If _checktype=This.fr.LIBFPTR_RT_SELL
This.fr.setParam(This.fr.LIBFPTR_PARAM_MARKING_CODE_STATUS, This.fr.LIBFPTR_MES_PIECE_SOLD )
Else
This.fr.setParam(This.fr.LIBFPTR_PARAM_MARKING_CODE_STATUS, This.fr.LIBFPTR_MES_DRY_RETURN )
Endif
validationResult=0
*ищем марку в результатах валидации
If Used('kmvalresult')
Select kmvalresult
Locate For mark_code=marked.barcode
If Found()
validationResult=kmvalresult.vresult
Endif
Endif
Select bascheckd
This.fr.setParam(This.fr.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT, validationResult)
This.fr.setParam(This.fr.LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0)
*////валидэйшн маркировки
Else && для маркированного алкоголя теперь тоже (ФФД >1.2 - не как маркированный товар, проверка не нужна, там все ЕГАИС должен сделать)
If Reccount('egaised')>0 And !Empty(Nvl(egaised.barcode,''))
This.fr.setParam(This.fr.LIBFPTR_PARAM_PRODUCT_CODE,Alltrim(egaised.barcode))
*This.fr.setParam(This.fr.LIBFPTR_PARAM_MARKING_CODE,egaised.barcode)
*If Len(Alltrim(egaised.barcode))=150
* This.fr.setParam(This.fr.LIBFPTR_PARAM_MARKING_CODE_TYPE, This.fr.LIBFPTR_MCT_EGAIS_30)
*Else
* This.fr.setParam(This.fr.LIBFPTR_PARAM_MARKING_CODE_TYPE, This.fr.LIBFPTR_MCT_EGAIS_20)
*Endif
txtlog('checks.txt','Код марки алкоголя '+Cast(egaised.barcode As Varchar(254)))
Endif
Endif
This.fr.setParam(1212, Nvl(bascheckd.TOVFISCTYPE,1) )
*This.fr.setParam(1212, 31 )
This.fr.setParam(This.fr.LIBFPTR_PARAM_DEPARTMENT, bascheckd.section)
This.fr.setParam(1214, 4) &&Признак способа расчёта 4- полный расчёт
This.fr.registration()
*проводим продажу или возврат по чеку
*если не напечатали, аннулируем чек
If This.fr.errorCode#0
Throw 'Ошибка печати вывода тела чека '+This._geterror()
Endif
*Endif
Endscan
Ratings: 0 negative/0 positive
Re: И снова маркировка Атол
Равиль

Сообщений: 6576
Откуда: Уфа
Дата регистрации: 01.08.2003
Спасибо, Денис - все в нашу копилку знаний - всяко пригодится !


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: И снова маркировка Атол
Victoriacom
Автор

Сообщений: 119
Дата регистрации: 08.12.2010
Здравствуйте!
Вариант, предложенный Atlant'ом прекрасно работает.

У меня задача усложнилась.
У клиента на одном компьютере установлено две наши кассовые проги.
Одна до сегодняшнего дня работала с фискальником, другая - с принтером чеков. Зачем так сделано? У них разная номенклатура и др.
Кассиры уже научились без страха нажимать Alt-Tab.
Возникла необходимость, чтобы и вторая программа перешла на фискальник.
Вроде не должно быть никаких проблем. Один фискальник определяется на COM7, другой на COM12.
Но практически безбожно глючит.
Один раз получился эксперимент: с одновременно запущенных программ сделал два Х-отчета. Каждый вышел на своем ФР.
Больше так не получилось: то с одним ФР теряется соединение, то с другим.

У кого-нибудь есть подобный опыт?


------------------
Алло, это прачечная? Да, это прачечная. Здравствуйте.
Ratings: 0 negative/0 positive
Re: И снова маркировка Атол
Евгений Банщиков

Сообщений: 223
Откуда: Kurgan
Дата регистрации: 09.04.2004
Victoriacom
Здравствуйте!
Один раз получился эксперимент: с одновременно запущенных программ сделал два Х-отчета. Каждый вышел на своем ФР.
Больше так не получилось: то с одним ФР теряется соединение, то с другим.

У кого-нибудь есть подобный опыт?
Все нормально работает с несколькими ФР. По описанию , похоже что не заданы настроики соединения с ККТ для каждого ФР. Параметр LIBFPTR_SETTING_PORT нужно выставить в LIBFPTR_PORT_COM (по умолчанию стоит LIBFPTR_PORT_USB ) и в параметр LIBFPTR_SETTING_COM_FILE прописать номер ком порта. Если этого не делать , то разные экзэмпляры драивера могут цепляться к одному порту , что и приведет к проблемам соединения.
Ratings: 0 negative/1 positive
Re: И снова маркировка Атол
Victoriacom
Автор

Сообщений: 119
Дата регистрации: 08.12.2010
Евгений Банщиков
Все нормально работает с несколькими ФР. По описанию , похоже что не заданы настроики соединения с ККТ для каждого ФР. Параметр LIBFPTR_SETTING_PORT нужно выставить в LIBFPTR_PORT_COM (по умолчанию стоит LIBFPTR_PORT_USB ) и в параметр LIBFPTR_SETTING_COM_FILE прописать номер ком порта. Если этого не делать , то разные экзэмпляры драивера могут цепляться к одному порту , что и приведет к проблемам соединения.

Спасибо! Проработал все настройки повнимательней, всё заработало как надо.


------------------
Алло, это прачечная? Да, это прачечная. Здравствуйте.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 15 (Гостей: 15)

© 2000-2024 Fox Club 
Яндекс.Метрика