Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4 5   вперед  Ctrl      все
 Delphi + онлайн-кассы  [new]
арт2010
Member

Откуда:
Сообщений: 281
На подходе переход на онлайн кассы. У нас по точкам самописная кассовая прога (Delphi 2007), аппараты Штрих-М. Сейчас печатаем чек в собственном формате (основная инфа + общая скидка по чеку). Как я понимаю скоро всю инфу надо будет передавать через онлайн кассы в строго определенном формате (в частности, к примеру, как я понимаю скидка уже должна быть по каждому наименованию в чеке). Кто-нибудь может поделиться выходными структурами данными на Delphi, которые должны буду передаваться в онлайн по новому формату? Как это вообще все должно работать? В общем нужна любая инфа по теме Delphi + онлайн-кассы
9 ноя 17, 10:43    [20939215]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
krapotkin
Member

Откуда: Екатеринбург
Сообщений: 671
насколько я понимаю, всю инфу должна передавать сама касса с онлайн-эклз
9 ноя 17, 11:06    [20939322]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
Близнец1980
Member

Откуда:
Сообщений: 76
арт2010,

Касса сама данные передает ОФД.
Мне не потребовалось много усилий переделать под он-лайн, тоже ШТРИХ.
Там все тоже самое, что и раньше, кроме нескольких нюансов.

Я использую такой алгоритм:

по каждой строке чека:
Price - цена уже со скидкой, т.к. скидку он не делает, а в конце чека просто ее печатаем как обычный текст.
Quantity - Количество,
Department - Отдел,
StringforPrinting = Наименование товара. Тут из-за одного аппарата пришлось резать до 1 строки - 48 символов для ШТРИХ-М-02Ф, а то ошибку выдавало. А вообще в ОФД должно передаваться не более 64 символов.
Дальше Sale или ReturnSale, с чеками корректировки так и не разобрался.
Любой дополнительный текст StringforPrinting и PrintString.

После в Summ1 - сумма от покупателя наличными, Summ2..4 - электронными (названия настраиваются в кассовом аппарате)
Если нужно отправить чек на эл.почту или на телефон, то в CustomerEmail соответственно адрес почты или № телефона и вызываем метод FNSendCustomerEmail. Но дойдет или нет зависит от ОФД.
Закрытие чека CloseCheck.

Еще одна особенности ШТРИХа:
Хоть и ФИО кассира настраивается в самом аппарате в отдельном поле, но аппарат его берет из таблицы настроек паролей кассиров.
Что-бы аппарат выводил правильное ФИО кассира, а сделал так:
DrvFR = := CreateOleObject('AddIn.DrvFR');
            DrvFR.Password:=30;
            DrvFR.TableNumber:=2;
            DrvFR.RowNumber:=30;
            DrvFR.FieldNumber:=2;
            DrvFR.ValueOfFieldString:='ÊÀÑÑÈÐ '+User;
            DrvFR.WriteTable;

т.е. подмена названия кассира и работаем всегда от сист.администратора.
9 ноя 17, 12:45    [20939695]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
Gallemar
Member

Откуда: г.Иркутск
Сообщений: 5085
krapotkin
насколько я понимаю, всю инфу должна передавать сама касса с онлайн-эклз

Не обязательно. Есть ккм с ethernet,они сразу передают, есть с usb, там эмуляция ethernet over usb, там на кассе ПО ставится
9 ноя 17, 12:46    [20939698]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Delphi + онлайн-кассы  [new]
Aleks2019
Member

Откуда:
Сообщений: 3
Близнец1980, Есть исходные коды для Delphi 2010? хочу прикрутить функционал к проге для работы с Штрих-М и онлайн-кассой
4 мар 19, 14:01    [21824366]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
Близнец1980
Member

Откуда:
Сообщений: 76
Aleks2019,

Delphi 7, если нужно могу немного кода именно работы со Штрихом сюда выложить.
4 мар 19, 14:21    [21824398]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
Aleks2019
Member

Откуда:
Сообщений: 3
Близнец1980, на почту мне можешь скинуть исх.коды?
4 мар 19, 14:55    [21824462]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
Близнец1980
Member

Откуда:
Сообщений: 76
Aleks2019,

E-Mail: скрыт
4 мар 19, 14:59    [21824468]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
Aleks2019
Member

Откуда:
Сообщений: 3
Близнец1980,auto-soft2012@mail.ru
4 мар 19, 15:08    [21824487]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
Alex Zhuravlev
Member

Откуда: Воронеж
Сообщений: 46
А можно сюда код выложить?
4 мар 19, 15:50    [21824564]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
Близнец1980
Member

Откуда:
Сообщений: 76
Alex Zhuravlev,

Код работы с ККТ из работающей программы.

Ничего сложного нет, все в документации описано.

+

//регистрация чека в ККТ
function TFProdChek.RegProdInFR: boolean;
var
  Npp, I, lStrSum, len: integer;
  S, S1: string;
  BonusPlus, BonusMinus, BonusOst: Double;
  DECIMALSEPARATOR_OLD :Char;

begin
  FMain.WriteLogToFile('Регистрация чека в ККМ');
  Result := False;
  len := 0; //длина строки

  if KKM = 1 then
    len := 50
  else if (KKM = 2) or (KKM = 3) then
    len := 48;

  try
     DECIMALSEPARATOR_OLD := DECIMALSEPARATOR ;
     DECIMALSEPARATOR := '.';

    //открываем чек
    if TypeCheck = 1 then
      FMain.DrvFR.CheckType := 0//продажа
    else
      FMain.DrvFR.CheckType := 2; //возврат
    if FMain.DrvFR.OpenCheck <> 0 then
    begin
      FMain.GetErrorFR;
      FMain.WriteLogToFile('Ошибка ККМ: Не открывается чек!');
      raise Exception.Create('Ошибка ККМ!' + #13 + 'Не открывается чек!');
      Exit;
    end;
     //строки
    MTChek.First;
    Npp := 0;
    BonusPlus := 0;
    BonusMinus := 0;
    BonusOst := 0;
    while not MTChek.Eof do
    begin
      Npp := Npp + 1;
      if TypeCheck = 1 then
        if KKM = 3 then //он-лайн
           FMain.DrvFR.Price := MTChek.FieldByName('ZENAPROD').Value
        else
          FMain.DrvFR.Price := MTChek.FieldByName('ZENBSK').Value
      else
        FMain.DrvFR.Price := MTChek.FieldByName('ZENAPROD').Value;

      FMain.DrvFR.Quantity := MTChek.FieldByName('KOL').Value;

	//наименование товара
      S := IntToStr(Npp) + '. ' + MTChek.FieldByName('CODE').AsString + ' ' + MTChek.FieldByName('NAME').AsString + ' ' + MTChek.FieldByName('MODEL').AsString + ', ' + MTChek.FieldByName('EDIZM').AsString;
      FMain.WriteLogToFile('S = ' + S);

      if length(s) > len then
      begin
        s:=Copy(S, 0, len);
      end;

      FMain.DrvFR.StringforPrinting := S;

      if TypeCheck = 1 then
      begin

        if FMain.DrvFR.Sale <> 0 then
        begin
          FMain.GetErrorFR;
          FMain.WriteLogToFile('Ошибка ККМ: Не регистрируется продажа по строке - ' + IntToStr(Npp) + ' !');
          raise Exception.Create('Ошибка ККМ!' + #13 + 'Не регистрируется продажа по строке - ' + IntToStr(Npp) + ' !');
          Exit;
        end;
      end
      else
      begin
        if FMain.DrvFR.ReturnSale <> 0 then
        begin
          FMain.GetErrorFR;
          FMain.WriteLogToFile('Ошибка ККМ: Не регистрируется возврат продажи по строке - ' + IntToStr(Npp) + ' !');
          raise Exception.Create('Ошибка ККМ!' + #13 + 'Не регистрируется возврат продажи по строке - ' + IntToStr(Npp) + ' !');
          Exit;
        end;
      end;

      FMain.WriteLogToFile('Регистрация в ККМ, подсчет бонусов');
      BonusPlus := BonusPlus + MTChek.FieldByName('BonusPlus').AsFloat;

      BonusMinus := BonusMinus + MTChek.FieldByName('BonusMinus').AsFloat;

      if MTChek.FieldByName('SumSK').AsFloat <> 0 then
         begin

            S := 'ЦЕНА БЕЗ СКИДКИ:';
            S1 := Format('= %0:f', [MTChek.FieldByName('ZENBSK').AsFloat]);
            lStrSum := len - length(S1);
            for I := 17 to lStrSum do
              S := S + '_';

            S := S + S1;
            FMain.DrvFR.StringforPrinting := S;
            FMain.DrvFR.PrintString;

            FMain.WriteLogToFile('Строка ЦЕНА БЕЗ СКИДКИ: "'+S+'"');

            S := Format('СКИДКА: %0:.1f', [MTChek.FieldByName('ProcSK').AsFloat])+'%';
            S1 := Format('= %0:f', [MTChek.FieldByName('SumSK').AsFloat]);
            lStrSum := len - length(S1);
            for I := 14 to lStrSum do
              S := S + '_';

            S := S + S1;
            FMain.DrvFR.StringforPrinting := S;
            FMain.DrvFR.PrintString;

            FMain.WriteLogToFile('Строка со скидкой: "'+S+'"');

         end;


      MTChek.Next;

    end;

    FMain.WriteLogToFile('закрываем чек');

     //закрываем чек
         //скидка
    FMain.DrvFR.StringforPrinting := '==================================================';
    FMain.DrvFR.PrintString;

    if TypeCheck = 1 then
    begin
      if SumSkid <> 0 then
      begin
        //итоговая сумма
        S := 'ИТОГО БЕЗ СКИДКИ:';
        S1 := Format('%0:f', [SumBezSkid]); 
        lStrSum := len - length(S1);
        for I := 18 to lStrSum do
          S := S + '_';

        S := S + S1;
        FMain.DrvFR.StringforPrinting := S;
        FMain.DrvFR.PrintString;

        FMain.WriteLogToFile('S = ' + S);

        if trim(Shtrih) <> '' then
          if FMain.ThisBonusCard(Shtrih) then
            FMain.DrvFR.StringforPrinting := 'Бонусная карта: ' + Shtrih
          else
            FMain.DrvFR.StringforPrinting := 'Дисконтная карта: ' + Shtrih
        else
          FMain.DrvFR.StringforPrinting := '';

        FMain.WriteLogToFile('скидка = ' + FloatToStr(SumSkid) + ' FMain.DrvFR.StringforPrinting = ' + FMain.DrvFR.StringforPrinting);

        if KKM = 3 then //он-лайн
          begin
             FMain.DrvFR.PrintString;
             FMain.DrvFR.FontType:=2;

              S := 'СКИДКА';
              S1 := Format('%0:f', [SumSkid]); //Trim(CurrToStr(SumChek+SumSkid));
              lStrSum := 23 - length(S1);
              for I := 6 to lStrSum do
                S := S + ' ';

              S := S + S1;
              FMain.DrvFR.StringforPrinting := S;

             FMain.DrvFR.PrintStringWithFont;

          end
        else
          begin
             //скидка
             FMain.DrvFR.Summ1 := SumSkid;
              if FMain.DrvFR.Discount <> 0 then
              begin
                FMain.GetErrorFR;
                FMain.WriteLogToFile('Ошибка ККМ: Некорректная скидка!');
                raise Exception.Create('Ошибка ККМ!' + #13 + 'Некорректная скидка!');
                Exit;
              end;

          end;

      end;

    end; //продажа

        //бонусы
    if FMain.ThisBonusCard(Shtrih) then
    begin
      if FMain.ZConMySQL.Connected then
              //проверим еще раз
        if FMain.ZConMySQL.PingServer then
        begin
          try
            FMain.ZQTmp.Close;
            FMain.ZQTmp.SQL.Text := 'SELECT SUM(ba.Summa) AS Summa FROM sprdk s, bonus_account ba WHERE s.ID_BONUS_ACCOUNT = ba.ID AND s.Shtrih = :vShtrih ';
            FMain.ZQTmp.ParamByName('vShtrih').Value := Shtrih;
            FMain.ZQTmp.Open;
            if FMain.ZQTmp.RecordCount > 0 then
              BonusOst := FMain.ZQTmp.FIeldByName('Summa').Value;
          except
            BonusOst := 0;
          end;

        end;

      FMain.DrvFR.StringforPrinting := '';
      FMain.DrvFR.PrintString;
      FMain.DrvFR.StringforPrinting := '==================================================';
      FMain.DrvFR.PrintString;
      FMain.DrvFR.StringforPrinting := '';
      FMain.DrvFR.PrintString;

      if BonusPlus > 0 then
      begin
        if TypeCheck = 1 then
          S := 'Начислено бонусов:'
        else
          S := 'Списано бонусов:';

        S1 := Format('%0:f', [BonusPlus]);
        lStrSum := len - length(S1);
        for I := length(S) + 1 to lStrSum do
          S := S + '_';
        S := S + S1;
        FMain.DrvFR.StringforPrinting := S;
        FMain.DrvFR.PrintString;
        FMain.WriteLogToFile('S = ' + S);

      end;


      if BonusMinus > 0 then
      begin
        if TypeCheck = 1 then
          S := 'Использовано бонусов:'
        else
          S := 'Возвращено бонусов:';

        S1 := Format('%0:f', [BonusMinus]);
        lStrSum := len - length(S1);
        for I := length(S) + 1 to lStrSum do
          S := S + '_';
        S := S + S1;

        FMain.DrvFR.StringforPrinting := S;
        FMain.DrvFR.PrintString;

        FMain.WriteLogToFile('S = ' + S);

      end;

      if BonusOst <> 0 then
      begin
        S := 'Остаток бонусов:';
        S1 := Format('%0:f', [BonusOst]);
        lStrSum := len - length(S1);
        for I := length(S) + 1 to lStrSum do
          S := S + '_';
        S := S + S1;
        FMain.DrvFR.StringforPrinting := S;
        FMain.DrvFR.PrintString;

        FMain.WriteLogToFile('S = ' + S);

      end;

      FMain.DrvFR.StringforPrinting := '';
      FMain.DrvFR.PrintString;
      FMain.DrvFR.StringforPrinting := '==================================================';
      FMain.DrvFR.PrintString;
      FMain.DrvFR.StringforPrinting := '';
      FMain.DrvFR.PrintString;

    end;

    FMain.DrvFR.Summ1:=0;
    FMain.DrvFR.Summ2:=0;
    FMain.DrvFR.Summ3:=0;
    FMain.DrvFR.Summ4:=0;

        //суммы от покупателя
    if (CurrEditNal.Value = 0) and (CurrEditCart.Value <> SumChek) then
      FMain.DrvFR.Summ1 := SumChek  - CurrEditCart.Value
    else
      FMain.DrvFR.Summ1 := CurrEditNal.Value;

    if CBCard.Checked then
       FMain.DrvFR.Summ4 := CurrEditCart.Value;

    if Trim(edEmail.Text) <> '' then
       begin
         //В качестве параметра можно передавать или телефон (+7хххххххххх) или e-mail: test@test.com
         try
            FMain.DrvFR.CustomerEmail := Trim(edEmail.Text);
            FMain.DrvFR.FNSendCustomerEmail;
          except
           on E: Exception do
             begin
                 FMain.WriteLogToFile('Регистрация в ККМ: Ошибка передачи телефона или e-mail: '+E.Message);
             end;

          end;
       end;

    FMain.DrvFR.StringforPrinting := '';
    if FMain.DrvFR.CloseCheck <> 0 then
    begin
      FMain.GetErrorFR;
      FMain.WriteLogToFile('Ошибка ККМ: Ошибка закрытия чека!');
      FMain.DrvFR.CancelCheck;
      raise Exception.Create('Ошибка ККМ!' + #13 + 'Ошибка закрытия чека!');
      Exit;
    end;
       result:=True;
  finally
     DECIMALSEPARATOR := DECIMALSEPARATOR_OLD;

  end;
end;


procedure TFMain.FormDestroy(Sender: TObject);
begin
	DrvFR.Disconnect;
end;

procedure TFMain.FormCreate(Sender: TObject);
begin
	DrvFR:= CreateOleObject('AddIn.DrvFR');
end;

procedure TFMain.FormShow(Sender: TObject);
begin      
    if DrvFR.Connect = 0 then
        begin
            DrvFR.Password:=30;
            DrvFR.TableNumber:=2;
            DrvFR.RowNumber:=30;
            DrvFR.FieldNumber:=2;
            DrvFR.ValueOfFieldString:='КАССИР '+User;
            DrvFR.WriteTable;
            FWait.Close;
        end
    else
            GetErrorFR;
    end;
end;

procedure TFMain.GetErrorFR;
var
  ResultCode: Integer;
  ResultCodeDescription: string;
begin
  ResultCode := DrvFR.ResultCode;
  ResultCodeDescription := DrvFR.ResultCodeDescription;
  WriteLogToFile('Ошибка фискального регистратора: '+Format('(%d) %s', [ResultCode, ResultCodeDescription]));
  Application.MessageBox(PAnsiChar('Ошибка фискального регистратора!'+#13+Format('(%d) %s', [ResultCode, ResultCodeDescription])),'Ошибка ККМ',MB_ICONSTOP);
end;

//аннулировать чек
procedure TFMain.N36Click(Sender: TObject);
begin
   if DrvFR.CancelCheck<>0 then
       GetErrorFR;
end;

//закрыть чек
procedure TFMain.N35Click(Sender: TObject);
begin
   if DrvFR.CloseCheck<>0 then
       GetErrorFR;
end;

//окно свойств
procedure TFMain.NNastrFRClick(Sender: TObject);
begin
    DrvFR.ShowProperties;
end;

//Z-Отчет
procedure TFMain.NCloseSmenFRClick(Sender: TObject);
begin
    if Application.MessageBox('Закрыть смену в ККМ и снять Z-Отчет ?', 'Касса', MB_ICONWARNING+MB_YESNO) = IDYES then
      begin
        DrvFR.Password:=30;
        if DrvFR.PrintReportWithCleaning<>0 then
	    // DrvFR.PrintReportWithoutCleaning - Х-отчет (без гашения)

            GetErrorFR;
      end;
end;

//продолжить печать
procedure TFMain.NContinuePrintClick(Sender: TObject);
begin
   if DrvFR.ContinuePrint<>0 then
       GetErrorFR;
end;

//повторная печать последнего чека
procedure TFMain.N33Click(Sender: TObject);
begin
   if DrvFR.RepeatDocument<>0 then
       GetErrorFR;
end;

//показать статус ККМ
procedure TFMain.NGetModeFRClick(Sender: TObject);
begin
    if DrvFR.GetShortECRStatus=0 then
        ShowMessage('Режим ККМ: '+DrvFR.ECRModeDescription+#13+'Подрежим ККМ:'+DrvFR.ECRAdvancedModeDescription)
    else
        GetErrorFR;
end;

//данные по кассовой смене из ККМ 
procedure TFMain.AddToJournKKM(Kassmen:string);
var SumN, SumViruchki, SumProd:Double;
begin

   if not CreateFR then Exit;


    //данные ККМ запишем в таблицу

    if FTJournKKM.Locate('Kassmen',Kassmen,[]) then
       FTJournKKM.Edit
    else
       FTJournKKM.Append;

    FTJournKKM.FieldByName('Kassmen').Value:= Kassmen;
    FTJournKKM.FieldByName('datetime').AsDateTime := Now;

    SumViruchki:=0;
    SumProd:=0;

    //сумма на начало смены
    DrvFR.Password:= 30;
    DrvFR.TypeOfSumOfEntriesFM := True;
    DrvFR.GetFMRecordsSum;
    SumN:=DrvFR.Summ1;
    FTJournKKM.FieldByName('sumsmenn').Value:=SumN ;

   // ДЕНЕЖНЫЕ РЕГИСТРЫ

   //продажа наличнымим
    DrvFR.RegisterNumber:= 193;
    DrvFR.GetCashReg;
    FMain.FTJournKKM.FieldByName('SUMNAL').Value:=DrvFR.ContentsOfCashRegister;
    SumProd:=DrvFR.ContentsOfCashRegister;

    SumViruchki:=DrvFR.ContentsOfCashRegister;

   //продажа по картам
    DrvFR.RegisterNumber:= 205;
    DrvFR.GetCashReg;
    FMain.FTJournKKM.FieldByName('SUMCARD').Value:=DrvFR.ContentsOfCashRegister;
    SumProd:=SumProd + DrvFR.ContentsOfCashRegister;
    SumViruchki:=SumViruchki + DrvFR.ContentsOfCashRegister;

    FTJournKKM.FieldByName('sumsmenk').Value:=SumN+SumProd;
    FMain.FTJournKKM.FieldByName('SUMPROD').Value:=SumProd;


   //возврат продажа наличнымим
    DrvFR.RegisterNumber:= 195;
    DrvFR.GetCashReg;
    FMain.FTJournKKM.FieldByName('SUMVNAL').Value:=DrvFR.ContentsOfCashRegister;

    SumViruchki:=SumViruchki - DrvFR.ContentsOfCashRegister;

   //возврат продажа по картам
    DrvFR.RegisterNumber:= 207;
    DrvFR.GetCashReg;
    FMain.FTJournKKM.FieldByName('SUMVCARD').Value:=DrvFR.ContentsOfCashRegister;

    SumViruchki:=SumViruchki - DrvFR.ContentsOfCashRegister;

   //наличность в кассе
    DrvFR.RegisterNumber:= 241;
    DrvFR.GetCashReg;
    FMain.FTJournKKM.FieldByName('SUMNALKAS').Value:=DrvFR.ContentsOfCashRegister;

   //внесенные суммы
    DrvFR.RegisterNumber:= 242;
    DrvFR.GetCashReg;
    FMain.FTJournKKM.FieldByName('SUMVNESEN').Value:=DrvFR.ContentsOfCashRegister;

   //выплаченные суммы
    DrvFR.RegisterNumber:= 243;
    DrvFR.GetCashReg;
    FMain.FTJournKKM.FieldByName('SUMVIPLAT').Value:=DrvFR.ContentsOfCashRegister;


     //сумма выручки
     //(193-194-195+196)+(197-198-199+200)+(201-202-203+204)+(205-206-207+208)
     //наш часный случай   (193-195)+(205-207)
      FMain.FTJournKKM.FieldByName('Viruchka').Value:=SumViruchki ;

   // ОПЕРАЦИОННЫЕ РЕГИСТРЫ

   //кол-во продаж
     DrvFR.RegisterNumber:= 144;
     DrvFR.GetOperationReg;
     FMain.FTJournKKM.FieldByName('KOLPROD').Value:=DrvFR.ContentsOfOperationRegister;

     //кол возвратов продаж
     DrvFR.RegisterNumber:= 146;
     DrvFR.GetOperationReg;
     FMain.FTJournKKM.FieldByName('KOLVOZVRAT').Value:=DrvFR.ContentsOfOperationRegister;

     //номер смены
     //GetEKLZCode2Report
     DrvFR.GetECRStatus;
     FMain.FTJournKKM.FieldByName('NUMBER').Value:=DrvFR.SessionNumber+1;

    FMain.FTJournKKM.Post;
    FMain.FTJournKKM.Close;

end;


//закончились ли 24 часа в текущей смене
function  TFMain.ItEnded24Hours:Boolean;
begin
   result:=False;

   if CreateFR then
       begin
       if FMain.DrvFR.GetECRStatus <> 0 then
          begin
              FMain.WriteLogToFile('Ошибка получения статуса ККМ! '+Format('(%d) %s', [FMain.DrvFR.ResultCode, FMain.DrvFR.ResultCodeDescription]));
              Application.MessageBox(PAnsiChar('Ошибка получения статуса ККМ! '+#13+Format('(%d) %s', [FMain.DrvFR.ResultCode, FMain.DrvFR.ResultCodeDescription])),'Регистрация чека',MB_ICONSTOP);
              Exit;
          end;
       
         if DrvFR.IsFM24HoursOver then
            begin
               Application.MessageBox(PAnsiChar('Время текущей смены в ККМ превысило 24 часа!'+#13+'Закройте текущую смену и откройте новую!'),'24 часа кончились', MB_ICONSTOP);
               result:= True;
            end;
       end;

end;

перед регистрацией продажи
    //если открытый документ, пытаемся аннулировать
       if FMain.DrvFR.ECRMode = 8 then
          begin
               FMain.DrvFR.Password:=30;
               FMain.DrvFR.SysAdminCancelCheck;
          end;


       if (FMain.DrvFR.ECRMode <> 2) and (FMain.DrvFR.ECRMode <> 4) then
          begin
              FMain.WriteLogToFile('ККМ находиться в неправильном режиме! Режим ККМ: '+FMain.DrvFR.ECRModeDescription+', Подрежим ККМ:'+FMain.DrvFR.ECRAdvancedModeDescription);
//              Application.MessageBox(PAnsiChar(
              ShowMessage('ККМ находиться в неправильном режиме!'+#13+'Режим ККМ: '+FMain.DrvFR.ECRModeDescription+#13+'Подрежим ККМ: '+FMain.DrvFR.ECRAdvancedModeDescription) ;
              //,'Регистрация чека',MB_ICONSTOP);
              Exit;
          end;


        FMain.WriteLogToFile('Режим ККМ: '+FMain.DrvFR.ECRModeDescription+', Подрежим ККМ:'+FMain.DrvFR.ECRAdvancedModeDescription);

        //текст в чеке внизу
        FMain.DrvFR.TableNumber:=4;
        FMain.DrvFR.FieldNumber:=1;

        for J:=1 to 3 do
           begin
              FMain.DrvFR.RowNumber:=J;
              if J > ChechReklama.Count then
                 FMain.DrvFR.ValueOfFieldString:=''
              else
                FMain.DrvFR.ValueOfFieldString:=ChechReklama.Strings[J-1];

              FMain.DrvFR.WriteTable;
           end;





   //Регистрация в ФР
      //открываем чек
        try

           if  OperKKM='Продажа' then
               FMain.DrvFR.CheckType := 0
           else
              if OperKKM='Возврат продажи' then
                 FMain.DrvFR.CheckType := 2;

           if (OperKKM='Продажа') or (OperKKM='Возврат продажи') then
               if FMain.DrvFR.OpenCheck<> 0 then
                  begin
                    FMain.GetErrorFR;
                    FMain.WriteLogToFile('Ошибка ККМ: Не открывается чек!');
                    raise Exception.Create('Ошибка ККМ!'+#13+'Не открывается чек!')
                  end;


    FMain.DrvFR.Summ1:=0;
    FMain.DrvFR.Summ2:=0;
    FMain.DrvFR.Summ3:=0;
    FMain.DrvFR.Summ4:=0;

        //суммы от покупателя
    if (CurrEditNal.Value = 0) and (CurrEditCart.Value <> CurrEditSum.Value) then
      FMain.DrvFR.Summ1 := CurrEditSum.Value - CurrEditCart.Value
    else
      FMain.DrvFR.Summ1 := CurrEditNal.Value;

    FMain.DrvFR.Summ4 := CurrEditCart.Value;

            FMain.DrvFR.Price := CurrEditSum.Value;
            FMain.DrvFR.Quantity :=1;

            if (OperKKM='Продажа') or (OperKKM='Возврат продажи') then
               begin
                  FMain.DrvFR.Department := StrToInt(EditOtdel.Text); //отдел
               end;

            FMain.DrvFR.StringforPrinting := ComboBoxOper.Text;

           if  OperKKM='Продажа' then
               if FMain.DrvFR.Sale<>0 then
                  begin
                    FMain.GetErrorFR;
                    FMain.WriteLogToFile('Ошибка ККМ: Не регистрируется продажа!');
                    raise Exception.Create('Ошибка ККМ!'+#13+'Не регистрируется продажа!')
                  end;
           if OperKKM='Возврат продажи' then
               if FMain.DrvFR.ReturnSale<>0 then
                  begin
                    FMain.GetErrorFR;
                    FMain.WriteLogToFile('Ошибка ККМ: Не регистрируется возврат продажи!');
                    raise Exception.Create('Ошибка ККМ!'+#13+'Не регистрируется возврат продажи!')
                  end;
           if OperKKM='Внесение' then
               if FMain.DrvFR.CashIncome<>0 then
                  begin
                    FMain.GetErrorFR;
                    FMain.WriteLogToFile('Ошибка ККМ: Не регистрируется внесение!');
                    raise Exception.Create('Ошибка ККМ!'+#13+'Не регистрируется внесение!')
                  end;

           if OperKKM='Выплата' then
              BEGIN
               if FMain.DrvFR.CashOutcome<>0 then
                  begin
                    FMain.GetErrorFR;
                    FMain.WriteLogToFile('Ошибка ККМ: Не регистрируется выплата!');
                    raise Exception.Create('Ошибка ККМ!'+#13+'Не регистрируется выплата!')
                  end;
               end;


           if (OperKKM='Продажа') or (OperKKM='Возврат продажи') then
              begin
                FMain.DrvFR.StringforPrinting := '';
                if FMain.DrvFR.CloseCheck<>0 then
                    begin
                      FMain.GetErrorFR;
                      FMain.WriteLogToFile('Ошибка ККМ: Ошибка закрытия чека!');
                      raise Exception.Create('Ошибка ККМ!'+#13+'Ошибка закрытия чека!');
                    end;
              end;
         except
           exit;
         end;
    end; // Регистрация в ФР

4 мар 19, 17:18    [21824663]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 820
Код работы с ККТ из работающей программы.


У этой чудесной программы есть имя?
4 мар 19, 22:46    [21824880]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
Близнец1980
Member

Откуда:
Сообщений: 76
DmSer
Код работы с ККТ из работающей программы.

У этой чудесной программы есть имя?

Да. В одной небольшой компании на кассовых терминалах работает, а что не так?
5 мар 19, 07:25    [21825003]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
cptngrb
Member

Откуда:
Сообщений: 322
Близнец1980, а номер чека где берешь?
5 мар 19, 08:08    [21825014]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
Близнец1980
Member

Откуда:
Сообщений: 76
cptngrb
Близнец1980, а номер чека где берешь?

Сам формирую, независимо от ККМ.
В других операциях (не продажа или возврат) беру из ККМ так:
       if KKM = 3 then //он-лайн
            begin
               FMain.DrvFR.FNGetCurrentSessionParams;
               FMain.FTJournNOPER.AsInteger := FMain.DrvFR.ReceiptNumber;
            end
       else
         if StrToInt(EditNChek.Text) = 0 then
            begin
              FMain.DrvFR.GetECRStatus;
              FMain.FTJournNOPER.AsInteger := FMain.DrvFR.OpenDocumentNumber;
            end
         else
          FMain.FTJournNOPER.AsInteger := StrToInt(EditNChek.Text);
5 мар 19, 10:30    [21825124]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
cptngrb
Member

Откуда:
Сообщений: 322
Близнец1980, я делаю по справке, но номер чека отличается на бумажном чеке почему то. А в твоем примере берется сквозной номер документа

автор
запрос содержимого операционного регистра 148 (номер чека продажи)
Перед тем, как вызвать метод GetOperationReg, необходимо заполнить следующие
свойства: присвоим свойству Password значение «1» (пароль кассира №1 по умолчанию),
а свойству RegisterNumber – значение «148» (номер операционного регистра). Вызовем
метод. В случае успешного выполнения метода значение свойства ResultCode будет
равно «0» («Ошибок нет»), в противном случае см. описание кода ошибки в свойстве
ResultCodeDescription. Если ResultCode=0, метод возвращает значения в следующие
свойства: OperatorNumber=1 (порядковый номер оператора, вызвавшего метод);
ContentsOfOperationRegister=13 (содержимое операционного регистра №148 – 13 чеков
продаж); NameOperationReg=«Номер чека продажи» (название регистра)
.

Driver.Password:= PASSWD;
Driver.RegisterNumber:= 148;
Driver.GetOperationReg;
Result:= Driver.ContentsOfOperationRegister;
5 мар 19, 10:59    [21825148]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
Близнец1980
Member

Откуда:
Сообщений: 76
cptngrb
Близнец1980, я делаю по справке, но номер чека отличается на бумажном чеке почему то. А в твоем примере берется сквозной номер документа

Сейчас проверил на одной кассе:
FMain.DrvFR.FNGetCurrentSessionParams;
ShowMessage('FMain.DrvFR.ReceiptNumber = '+IntToStr(FMain.DrvFR.ReceiptNumber));
показал правильный номер последнего пробитого чека в текущей смене (12)

DrvFR.RegisterNumber:= 148;
DrvFR.GetOperationReg;
ShowMessage('Name='+DrvFR.NameOperationReg+' content '+IntToStr(DrvFR.ContentsOfOperationRegister));

непонятная цифра 666.
5 мар 19, 11:31    [21825177]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
Alex Zhuravlev
Member

Откуда: Воронеж
Сообщений: 46
Близнец1980
Alex Zhuravlev,
Код работы с ККТ из работающей программы.
Ничего сложного нет, все в документации описано.

Спасибо. Касса подключена к компу или по сети общение идет?
5 мар 19, 11:35    [21825178]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
Близнец1980
Member

Откуда:
Сообщений: 76
Alex Zhuravlev
Спасибо. Касса подключена к компу или по сети общение идет?

К ПК по кабелю COM или USB.
5 мар 19, 11:42    [21825181]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
V.Borzov
Member

Откуда: Саратов
Сообщений: 269
Близнец1980
арт2010,

Еще одна особенности ШТРИХа:
Хоть и ФИО кассира настраивается в самом аппарате в отдельном поле, но аппарат его берет из таблицы настроек паролей кассиров.
Что-бы аппарат выводил правильное ФИО кассира, а сделал так:
+
DrvFR = := CreateOleObject('AddIn.DrvFR');
            DrvFR.Password:=30;
            DrvFR.TableNumber:=2;
            DrvFR.RowNumber:=30;
            DrvFR.FieldNumber:=2;
            DrvFR.ValueOfFieldString:='&#202;&#192;&#209;&#209;&#200;&#208; '+User;
            DrvFR.WriteTable;

т.е. подмена названия кассира и работаем всегда от сист.администратора.


Попробовал вот так юзера в чеке задать, вроде прокатило:

+
          VarDevice.TagNumber := 1021;
          VarDevice.TagType := 7;
          VarDevice.TagValueStr := 'Неворишка М.Н.';
          VarDevice.FNSendTag;

          VarDevice.TagNumber := 1203;
          VarDevice.TagType := 7;
          VarDevice.TagValueStr := '123456789012';  // ИНН
          VarDevice.FNSendTag;

Пароль - первого кассира, например, '1', то есть.
5 мар 19, 12:03    [21825205]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
V.Borzov
Member

Откуда: Саратов
Сообщений: 269
cptngrb
Близнец1980, а номер чека где берешь?


DocumentNumber не подходит?
5 мар 19, 12:08    [21825208]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 820
Близнец1980
DmSer
пропущено...

У этой чудесной программы есть имя?

Да. В одной небольшой компании на кассовых терминалах работает, а что не так?


Вы опубликовали в качестве примера код крайне низкого качества. Но для небольшой компании возможно, что и сойдёт.
5 мар 19, 12:33    [21825243]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
cptngrb
Member

Откуда:
Сообщений: 322
V.Borzov, может и подходит, только я в справке нашел только по номеру регистра. надо попробовать
5 мар 19, 16:25    [21825553]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
cptngrb
Member

Откуда:
Сообщений: 322
DmSer,
а покажите тот же код высокого качества, пожалуйста (кусочек)
5 мар 19, 16:26    [21825555]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 820
cptngrb
DmSer,
а покажите тот же код высокого качества, пожалуйста (кусочек)


У меня есть исходники работы с ККМ по протоколам Штрих, Атол, Дримкас, они работают безупречно, нет сомнения в их работоспособности, но публиковать их не буду, поскольку для этого нужно их сперва привести в соответствующий вид, который не будет вызывать нареканий, а это значительная работа.
5 мар 19, 16:40    [21825581]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4 5   вперед  Ctrl      все
Все форумы / Delphi Ответить