Форум » Для флейма » Фискальный регистратор. Как работать из Harbour? » Ответить

Фискальный регистратор. Как работать из Harbour?

AndreyZh: Доброго времени суток! Возможно придётся интегрировать свои программы с данным устройством. Конечно "драйвера" на разное оборудование разные, но если можно дайте пожалуйста пинок в нужном направлении - где посмотреть, а если возможно фрагмент кода. Никогда этим не занимался и пока полное непонимание, а рунет завален лишь рекомендациями по настройке с "1с"

Ответов - 10

Dima: Это смотря какой фискальный регистратор. Кусок кода для Мария 301 Пробитие чека , делал давно еще на Clipper У меня было подробное описание протокола обмена , листов эдак 40 или больше. [pre2] Check301(oe2,oe1,if(summa>0,.t.,.f.),vt) ***************** Func Check301(oe1,oe2,siges,toksi) local ret:=.f. local olina:=padl(alltrim(str(oe1*100,9)),9,"0") local olina1:=padl(alltrim(str(oe1*100,10)),10,"0") local olina2:=padl(alltrim(str(oe2*100,10)),10,"0") local old_nch:="" local pris:="" local xbva local new_nch:="" local use_ok:=.f. local old_scr:=savescreen(10,20,13,61) local old_color:=setcolor() local tvr:='Продтовары ' do while .t. setcolor("b/b") v_box(10,20,12,60,1,1) @ 11,21 say padc("Передача данных в кассу.....",40) color "gr+/b" close_301() if open_301() if KasPasw() millisec(kas_zad) com_send(kas_port,CHR(253)+'CONF'+CHR(5)+CHR(254)) millisec(kas_zad) pris:=COM_READ(kas_port) xbva:=at('CONF',pris) pris:=substr(pris,xbva) old_nch:=val(substr(pris,95,12)) if v_kassa('PREP','1') if !siges v_kassa('FINF',"Возврат денег") endif if v_kassa(if(siges,'FISC','BFIS'),; if(siges,if(toksi==1,tvr,if(toksi==2,tvr,'Аренда ')),'покупателю '),; olina,; olina,'00000','1','0',; 'А12000','000000','000000','000000',; '000000','000000','000000','000000') com_send(kas_port,CHR(253)+'CONF'+CHR(5)+CHR(254)) millisec(kas_zad) pris:=COM_READ(kas_port) xbva:=at('CONF',pris) pris:=substr(pris,xbva) new_nch:=val(substr(pris,95,12)) if new_nch-old_nch==1 use_ok:=.t. else v_kassa('CANC') endif if v_kassa('COMP',if(siges,olina1,'0000000000'),if(siges,'0000000000',olina1),; '0000000000','0000000000','0000000000',olina2) if use_ok nwzntstw(new_nch,siges,toksi) restscreen(10,20,13,61,old_scr) ok() else bad() restscreen(10,20,13,61,old_scr) soob('Чек не проведен.......','r/r','gr+/r') endif endif endif endif endif endif close_301() exit enddo restscreen(10,20,13,61,old_scr) setcolor(old_color) return ret ******************** Func Open_301(tilik) local ret:=.f. local prisen:="" local popi_1:=0 local dtqad:={'WAIT','DONE','READY','SYNC'} *set cons on *setcolor('w/n') if COM_OPEN(kas_port,255,255) com_dtr(kas_port,.t.) if COM_INIT(kas_port,kas_speed,"E",8,2) com_dtr(kas_port,.t.) *MILLISEC(5) com_send(kas_port,chr(85)) MILLISEC(2) com_send(kas_port,chr(85)) MILLISEC(2) com_send(kas_port,chr(85)) MILLISEC(2) com_send(kas_port,chr(253)+chr(85)+chr(254)) ******* ************ do while .t. if tilik#nil MILLISEC(kas_zad) com_send(kas_port,CHR(253)+'SYNC'+CHR(5)+CHR(254)) endif com_send(kas_port,CHR(253)+'SYNC'+CHR(5)+CHR(254)) MILLISEC(200) prisen:=COM_READ(kas_port) if dtqad[2]$prisen .and. dtqad[3]$prisen .and. dtqad[4]$prisen ret:=.t. exit else popi_1++ if popi_1>15 if msg_z({"Связь не установлена !",; "Возможно закончилась бумага или рулон",; "установлен не верно........",; "Или касса не включена.",; " ",; "Повторить попытку связи еще раз ?"},,"Внимание")#1 exit endif popi_1:=0 MILLISEC(2) com_send(kas_port,chr(85)) MILLISEC(2) com_send(kas_port,chr(85)) endif endif enddo else soob("Не могу инициализировать порт.......","r/r","gr+/r") endif else soob("Порт не доступен.......","r/r","gr+/r") endif return ret [/pre2] а вот и сами протоколы

AndreyZh: Dima пишет: Это смотря какой фискальный регистратор. Кусок кода для Мария 301 Спасибо! Это "что-то", но, как читал (возможно не понял) сейчас (в России? в свете нового закона об on-line кассах) используют более "высокоуровневые" механизмы взаимодействия. Действительно всё сильно зависит от типа ФР, т.к. подходы к взаимодействию сильно разнятся... но мне бы, для ориентации взглянуть некий самодостаточный пример, типа приведённого Dima, но для чего-то типа Штрих, Атол, Меркурий с доработками под ФЗ 53? Может быть кто-нибудь, что пытался делать... "На пока" даже будет полезен опыт общения с современными off-line кассами... т.е. пока и не срочно пытаюсь понять "идеологию"... да и в этом направлении пока не очень хочется работать, а возможно "нада"

Dima: AndreyZh Уточни модель фискальной кассы AndreyZh пишет: используют более "высокоуровневые" механизмы взаимодействия. Ну так код писался 100 лет назад

AndreyZh: Dima пишет: Уточни модель фискальной кассы На сей момент не важно! ФР должен удовлетворять закону об on-line кассах, желательно недорого стоить - будет "готовое" простое решение, то допишу программу и купим "эту кассу"

Dima: AndreyZh Ну по началу надо обзавестись протоколом обмена , определиться с ФР , купить его и тогда уже делать , до того как её профискализируют. Не имея на руках ФР врядли сможешь написать готовый код , без тестов.

AndreyZh: Dima пишет: Ну по началу надо обзавестись протоколом обмена , определиться с ФР , купить его и тогда уже делать , до того как её профискализируют В этом и анекдот! Есть закон, действующий с июля 16... есть куча "презентаций", обсуждений среди бухов и спецов, как правило "при 1с"... и даже говорят есть тестовые образцы оборудования и "драйвера" для 1с... Например получить какой-нибудь ФР для создания проги нужно заплатить за предзаказ и через 1-2 месяца получить "кота в мешке" для "игрушек". Моё умное (в отличии от большинства) руководство "волнуется", а я могу лишь ему показать картинки презентаций "виртуальных коней в вакууме" и при этом ничего не могу сказать "как мы будем поступать"... Хочу понять, есть ли у программистам на Harbour опыт - смогу ли допилить свои програмки... или нужно искать другие решения?... и вообще "розница в России" для меня тупиковое направление

Dima: AndreyZh пишет: Хочу понять, есть ли у программистам на Harbour опыт - смогу ли допилить свои програмки На Harbour думаю сможешь.

Dima: Как то делал на Clipper связь с одним ФР , можно было сделать связь на низком уровне или же путем создания OLE объекта (DLL прилагалась) и в дальнейшем общаться с кассой через него. Но тогда я еще не писал на Harbour и сделал на низком уровне.

AndreyZh: Ежели кому интересно??? Два основных типа драйвера: от Atol и Штрих. Возможны варианты: загрузка DLL или подключения OLE объекта. Пример с форума БЭСТ, дающий общую идею создания, отправки и сохранения чека: Код рассчитан на работу с драйвером АТОЛ, он для "Меркуриев" бесплатный, http://www.atol.ru/products/programs/trade-work/driver/driver-kkm/ В приведенном примере в чек выводятся построчно наименования товаров из накладной, НДС не выделяется, регистрация всегда идет через секцию 1, поле mdoc->date0 используется для защиты от повторнной печати чека при пересохранении документа. [pre2] Function Main() local ss,gg,ml,hkkm if select('MDOC') > 0 .and. select('MDOCM') > 0 if empty(mdoc->date0) mdoc->(ordsetfocus('MDOC')) mdocm->(ordsetfocus('MDOCM')) mlabel->(ordsetfocus('MLABEL')) ss := mdoc->sclad + mdoc->vid + mdoc->type ss := ss + mdoc->codedoc + mdoc->numdoc + dtos(mdoc->date) ss := upper(ss) gg := ss if mdocm->(dbseek(ss)) hkkm := CreateObject('AddIn.FprnM45') try hkkm:DeviceEnabled := .t. hkkm:CheckState() hkkm:CancelCheck() hkkm:Password := '1' hkkm:Mode := 1 hkkm:SetMode() do while !mdocm->(eof()) .and. (ss == gg) if mlabel->(dbseek(upper(mdocm->grup + mdocm->nnum))) ml := mlabel->name ml := rtrim(ml) do while len(ml) > 19 hkkm:Caption := OemToAnsi(left(ml, 19)) hkkm:PrintString() ml := substr(ml, 20) enddo hkkm:Name := OemToAnsi(ml) else hkkm:Name := '?' endif hkkm:Price := Round(mdocm->Cenaout, 2) hkkm:Quantity := Round(mdocm->Kolout, 3) hkkm:Department := 1 hkkm:Registration() mdocm->(dbskip()) ss := mdocm->sclad + mdocm->vid + mdocm->type ss := ss + mdocm->codedoc + mdocm->numdoc + dtos(mdocm->date) ss := upper(ss) enddo hkkm:TypeClose := 0 hkkm:CloseCheck() hkkm := nil catch hkkm:CancelCheck() hkkm := nil alert('ЋиЁЎЄ ЇаЁ ЇҐз ⨠祪 !') return -1 end mdoc->(dbrlock()) mdoc->date0 := Date() mdoc->summa0 := mdoc->summa mdoc->(dbcommit()) mdoc->(dbunlock()) endif endif endif return 0 [/pre2] Пример на C# для штриха - нужно загрузить DLL перед использованием, а так всё кажется понятным? Правда DLL они утверждают, что только для C, но высылают пример, что можно использовать из Delphi и Васика [pre2] private void button2_Click_1(object sender, EventArgs e) { //Открываем чек продажи Driver.CheckType = 0; Driver.OpenCheck(); //Отправка данных о покупателе Driver.CustomerEmail = textBox1.Text; //В качестве параметра можно передавать или телефон (+7хххххххххх) или e-mail: test@test.com Driver.FNSendCustomerEmail(); //Формируем продажу Driver.Quantity = Convert.ToDouble(textBox3.Text); Driver.Price = Convert.ToInt32(textBox2.Text); Driver.Department = 1; Driver.Tax1 = 0; Driver.Tax2 = 0; Driver.Tax3 = 0; Driver.Tax4 = 0; Driver.StringForPrinting = "Булка с маком"; Driver.Sale(); Driver.CheckSubTotal(); //Закрываем чек Driver.Summ1 = Driver.Summ1; Driver.Summ2 = 0; Driver.Summ3 = 0; Driver.Summ4 = 0; Driver.Tax1 = 0; Driver.Tax2 = 0; Driver.Tax3 = 0; Driver.Tax4 = 0; Driver.StringForPrinting = ""; Driver.CloseCheck(); } [/pre2]

Петр: AndreyZh пишет: Правда DLL они утверждают, что только для C, но высылают пример, что можно использовать из Delphi и Васика Скорее всего, написана на C, а для использовании с Делфи или Бейсик используется стандартная техника: функции DLL экспортируются с использованием соответствующего соглашения о вызовах (calling conventions) и без декорирования имен.



полная версия страницы