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

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

Откуда: Екатеринбург
Сообщений: 658
насколько я понимаю, всю инфу должна передавать сама касса с онлайн-эклз
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

Откуда: г.Иркутск
Сообщений: 5082
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

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


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

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

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

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

Откуда:
Сообщений: 284
Близнец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

Откуда:
Сообщений: 284
Близнец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

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

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

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


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

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

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

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


У меня есть исходники работы с ККМ по протоколам Штрих, Атол, Дримкас, они работают безупречно, нет сомнения в их работоспособности, но публиковать их не буду, поскольку для этого нужно их сперва привести в соответствующий вид, который не будет вызывать нареканий, а это значительная работа.
5 мар 19, 16:40    [21825581]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2023
cptngrb
а покажите тот же код высокого качества, пожалуйста (кусочек)
В идеале такой код подразумевает, что его сможет использовать другой программист для своей задачи с минимальной адаптацией. А сейчас это аццкая смесь бизнес-логики с UI, с отсутствием должной обработки ошибок, завязки на текстовые константы в коде, выбор неоптимальных языковых конструкций, отсутствие вменяемой архитектуры и спагетти в коде. В общем рефакторить и рефакторить. Плюс только один - это работает.
5 мар 19, 23:22    [21825808]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
fraks
Member

Откуда: Новосибирск
Сообщений: 1418
white_nigger
cptngrb
а покажите тот же код высокого качества, пожалуйста (кусочек)
В идеале такой код подразумевает, что его сможет использовать другой программист для своей задачи с минимальной адаптацией. А сейчас это аццкая смесь бизнес-логики с UI, с отсутствием должной обработки ошибок, завязки на текстовые константы в коде, выбор неоптимальных языковых конструкций, отсутствие вменяемой архитектуры и спагетти в коде. В общем рефакторить и рефакторить. Плюс только один - это работает.

А человек и не претендует на мастер-класс по идеальному коду.
Есть рабочий код - он им поделился.
А добиваться идеальности - ему не требуется, вам - тоже не требуется. И остаются варианты - выложить что есть или не выложить ничего. Если выложить - то может быть он кому-то поможет, начать делать аналогичное. Или не делать так же плохо :)

Большинство коммерческих прикладух вот так и написано, и они работают. Да, не идеально, но и мир не идеален.
6 мар 19, 04:50    [21825871]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
Vizit0r
Member

Откуда:
Сообщений: 589
A: Покажи плиз код
B: на.
A: Спасибо!
C: Это не код, это полный ужас, это нельзя показывать, не говоря уже про использовать. Но свой, великолепный код, выполненный по всем правилам, писанным и неписанным, работающий идеально - я вам не покажу. Потому что он не идеальный.


Спасибо, последний искатель бревен в чужом глазу - умилил просто до слез.
6 мар 19, 06:00    [21825879]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
Близнец1980
Member

Откуда:
Сообщений: 76
Этот код был написан 11 лет назад на заре изучения Delphi, для он-лайн касс немого доработал и все. Выложил в качестве примера работы с ККМ Штрих-М. Программа работает в нескольких магазинах на одном предприятии, поддерживается только мной, у которого еще куча обязанностей. Рефакторить не собираюсь, нет ни времени, ни желания, все и так работает. По хорошему там все программу нужно переписывать и на другую БД, но трудозатратно. (Как там в пословице: работает - не трогай!).

А на хороший код бы посмотрел, как правильно нужно писать, я ведь самоучка. А то хаять могут а показать как надо - нет, или объяснить на примерах так не делай, а делай так и будет все по фен-шую.
6 мар 19, 07:56    [21825893]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
cptngrb
Member

Откуда:
Сообщений: 284
Vizit0r, )))
6 мар 19, 08:39    [21825901]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
Alex Zhuravlev
Member

Откуда: Воронеж
Сообщений: 46
Близнец1980, забей.
6 мар 19, 11:53    [21826073]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2023
Всего лишь вопрос профессионального развития. Развиваться или нет каждый решает сам. А граммотно оформленный код можно (и нужно) смотреть в коммерческих библиотеках коих полно в том числе на варезниках. Если человеку не указать на ошибки то возможно он их не осознает. Здесь типичный случай отсутствия команды - человек пишет код для себя, не задумываясь, что когда-нибудь кому-то придется разбираться и сопровождать это. Многие через это проходят. То что помог кому-то своим кодом - плюс. Код плохой - минус
6 мар 19, 13:33    [21826228]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
Василий 2
Member

Откуда:
Сообщений: 433
white_nigger
Всего лишь вопрос профессионального развития. Развиваться или нет каждый решает сам. А граммотно оформленный код можно (и нужно) смотреть в коммерческих библиотеках коих полно в том числе на варезниках. Если человеку не указать на ошибки то возможно он их не осознает. Здесь типичный случай отсутствия команды - человек пишет код для себя, не задумываясь, что когда-нибудь кому-то придется разбираться и сопровождать это. Многие через это проходят. То что помог кому-то своим кодом - плюс. Код плохой - минус

Вот не показатель... ковырялся в FR4, местами то еще болото.
Да и зачем лезть в варезник, когда в среднем хороший код в RTL? Разумеется, исключая некоторые индусские выверты
6 мар 19, 14:17    [21826314]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2023
Василий 2
Вот не показатель... ковырялся в FR4, местами то еще болото.
Всякое встречается, не отрицаю. Но в среднем по больнице, качество кода коммерческих библиотек гораздо выше "кода в интернете", про который у Gunsmoker-a написано
6 мар 19, 15:10    [21826393]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
cptngrb
Member

Откуда:
Сообщений: 284
white_nigger, человек ругает чужой код не говоря как надо. Это не конструктивно.
6 мар 19, 16:27    [21826504]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
antox
Member

Откуда: РФ
Сообщений: 946
Близнец1980,

А с драйвеом 10 версии этот код работает?
6 мар 19, 16:58    [21826552]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
cptngrb
Member

Откуда:
Сообщений: 284
antox, работает с последней версией драйвера штриха

1. открываешь чек
2... операция
3. закрываешь чек



procedure print_reklama(prnt: Boolean);
begin
  if prnt then
  begin
    Driver.Password := 30;
    Driver.TableNumber := 1;
    Driver.FieldNumber := 4;
    Driver.RowNumber := 1;
    Driver.ValueOfFieldInteger := 1;
    Driver.GetFieldStruct;
    Driver.WriteTable;
  end
  else
  begin
    Driver.Password := 30;
    Driver.TableNumber := 1;
    Driver.FieldNumber := 4;
    Driver.RowNumber := 1;
    Driver.ValueOfFieldInteger := 0;
    Driver.GetFieldStruct;
    Driver.WriteTable;

    Driver.Password := 30;
    Driver.TableNumber := 4;
    Driver.FieldNumber := 1;
    Driver.RowNumber := 2;
    Driver.ValueOfFieldString := '';
    Driver.GetFieldStruct;
    Driver.WriteTable;

    Driver.Password := 30;
    Driver.TableNumber := 4;
    Driver.FieldNumber := 1;
    Driver.RowNumber := 3;
    Driver.ValueOfFieldString := '';
    Driver.GetFieldStruct;
    Driver.WriteTable;
  end;

end;

//возвращает номер чека
function GetOpenCheckNumber: integer;
begin
  try
    Driver.GetECRStatus;
    Result:= Driver.OpenDocumentNumber;
  except
    on E: Exception do begin
      Result:= -1;
      ShowMessage('Ошибка получения номера чека');
    end;
  end;
end;

function CheckOpen (aType: integer): integer;
var
  ResultCode: integer;
  ResultCodeDescription: string;
begin
  //aType 0-продажа, 1-покупка
  try
    //реквизиты Академии печатаем
//      Driver.UseReceiptRibbon := true;
//      Driver.UseJournalRibbon := false;
//      Driver.UseSlipDocument := false;
//      Driver.CarryStrings := false;
//      Driver.DelayedPrint := false;
//
//      Driver.StringForPrinting := '  **************************************  ';
//      Driver.PrintString;
//      Driver.StringForPrinting := '  *                                    *  ';
//      Driver.PrintString;
//      Driver.StringForPrinting := '  *  '+ORG_NAME+'  *  ';
//      Driver.PrintString;
//      Driver.StringForPrinting := '  *  '+ORG_ADRES+'  *  ';
//      Driver.FontType := 3;
//      Driver.PrintStringWithFont;
//      Driver.StringForPrinting := '  *                                    *  ';
//      Driver.PrintString;
//      Driver.StringForPrinting := '  **************************************  ';
//      Driver.PrintString;



    print_reklama(false);
    Driver.Password := PASSWD;
    Driver.CheckType := aType; // тип чека (продажа,покупка и т.п.)
    Driver.OpenCheck;

    //Отправка данных о покупателе
//     Driver.CustomerEmail = textBox1.Text;  В качестве параметра можно передавать или телефон (+7хххххххххх) или e-mail: test@test.com
//     Driver.FNSendCustomerEmail();

    ResultCode := Driver.ResultCode;
    ResultCodeDescription := Driver.ResultCodeDescription;
    if ResultCode > 0 then
    begin
      ShowMessage('Произошла ошибка при проведении операции (Код:' + IntToStr(ResultCode) + '). Текст: '+ResultCodeDescription);
      result:=-1;
    end
    else
    begin
//      Driver.Password := PASSWD;
//      Driver.RegisterNumber := 148; // № чека
//      Driver.GetOperationReg;
//      result := Driver.ContentsOfOperationRegister + 1;
      Result:= GetOpenCheckNumber +1;
    end;
  except
    on E: exception do
    begin
      result:= -2;
      ShowMessage('Ошибка получения номера чека при открытии: '+e.message);
    end;
  end;
end;

function CheckOperation (aType, aDept: integer; aSum, aPrice:Currency; aCnt, aNDS :Double; aSTR :string): integer;
var
  ResultCode: integer;
  ResultCodeDescription: string;
begin
  result:=0;
  try
    Driver.Department := aDept; // секция
    Driver.Summ1 := aSum; // сумма
    Driver.Price := aPrice; // цена
    Driver.Quantity := aCnt; // кол-во

    // если есть НДС---------------------------------
    if aNDS > 0 then
      Driver.Tax1 := 1
    else
      Driver.Tax1 := 0;
    //-----------------------------------------------
    Driver.Tax2 := 0;
    Driver.Tax3 := 0;
    Driver.Tax4 := 0;
    Driver.StringForPrinting := aSTR;

    Driver.Password := PASSWD;
    case aType of
      0: DRIVER.Sale;
      2: DRIVER.ReturnSale;
    end;

    ResultCode := Driver.ResultCode;
    ResultCodeDescription := Driver.ResultCodeDescription;
    if ResultCode > 0 then
    begin
      ShowMessage('Произошла ошибка при проведении операции (Код:' + IntToStr(ResultCode) + '). Текст: '+ResultCodeDescription);
      result:=-1;
    end;
  except
    on E: exception do
    begin
      result:=-2;
      ShowMessage('Ошибка: '+e.message);
    end;
  end;
end;

 // закрытие чека
function CheckClose (aSum:Currency; aStr: string): integer;
var
  ResultCode: integer;
  ResultCodeDescription: string;
begin
  try
    result:=0;
    //aStr:= 'Спасибо за проживание';
    Driver.Password := PASSWD;
    Driver.Summ1 := aSum; // наличными 
    // Driver.Driver.Summ2 := StrToCurr('0'); //кредит
    // Driver.Driver.Summ3 := StrToCurr('0'); //тарой
    // Driver.Driver.Summ4 := StrToCurr('0');   //плат. картой
    // if nds>0 then
    // Driver.Driver.Tax1 := 2
    // else
    // Driver.Driver.Tax1 := 0;
    // Driver.Driver.Tax2 := 0;
    // Driver.Driver.Tax3 := 0;
    // Driver.Driver.Tax4 := 0;
    // Driver.Driver.DiscountOnCheck := StrToFloat('0'); //скидка
    Driver.StringForPrinting := aStr;
    Driver.CloseCheck;
    ResultCode := Driver.ResultCode;
    ResultCodeDescription := Driver.ResultCodeDescription;

    if ResultCode > 0 then
    begin
      ShowMessage('Произошла ошибка при закрытии чека (Код:' + IntToStr(ResultCode) + '). Текст: '+ResultCodeDescription);
      result:=-1;
      Driver.Password := PASSWD;
      Driver.CancelCheck;
    end;


  except
    on E: exception do
    begin
      result:=-2;
      ShowMessage('Ошибка: '+e.message);
    end;
  end;
end;

procedure TfrMainForm.WriteSectionFR;
var
  i: integer;
  ResultCode: integer;
  ResultCodeDescription: string;
begin
  try
  //записываем данные пользователя в ФР
  if DriverExists then
    begin
      with DATAM.ODS do
      begin
        Close;
        DeleteVariables;
        sql.Text := 'select * from PUB_SECTION order by id_rec';
        Open;
        if not IsEmpty then
        begin
          i:=0;
          while not eof do
          begin
            inc(i);
            Driver.Password := 30;
            Driver.TableNumber := 7;
            Driver.FieldNumber := 1;
            Driver.RowNumber := i;
            Driver.ValueOfFieldString := FieldByName('section_name').AsString;
            Driver.WriteTable;
            ResultCode := Driver.ResultCode;
            ResultCodeDescription := Driver.ResultCodeDescription;
            if ResultCode>0 then
            begin
              ShowMessage('Ошибка записи секций ФР: '+ResultCodeDescription);
              break;
            end;
             Next;
          end;

        end;
        CloseAll;
      end;

      Driver.Password := 30;
      Driver.TableNumber := 7;
      Driver.FieldNumber := 1;
      Driver.RowNumber := 16;
      Driver.ValueOfFieldString := '111';
      Driver.WriteTable;
      ResultCode := Driver.ResultCode;
      ResultCodeDescription := Driver.ResultCodeDescription;
      if ResultCode>0 then
      begin
        ShowMessage('Ошибка записи секций ФР: '+ResultCodeDescription);

      end;
    end;
  except
    ShowMessage('Ошибка загрузки секций в ФР');
  end;

end;

procedure SetSalesman(Vseller:string;var ResultCode:integer;var ResultCodeDescription:string);
begin
try
//установка продавца
  Driver.Password := 30;
  Driver.TableNumber := 2;
  Driver.FieldNumber := 2;
  Driver.RowNumber := 1;
  Driver.ValueOfFieldString :=vseller;
  Driver.WriteTable;
  ResultCode :=Driver.ResultCode;
  ResultCodeDescription := Driver.ResultCodeDescription;
except
  on E: Exception do begin
  showmessage('Ошибка установки кассира:'+E.Message);
end;
end;



end;
6 мар 19, 17:11    [21826571]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
antox
Member

Откуда: РФ
Сообщений: 946
cptngrb,

Ну, у них последних же три 8,9,10.

С последней имеется в виду с 10.х ? А то хотят перейти с 8ки на 10ку
6 мар 19, 17:13    [21826575]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
V.Borzov
Member

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

А с драйвеом 10 версии этот код работает?


Здесь про Штрих-М, а не про АТОЛ. И, к слову, про АТОЛ: я тыркнулся в 10 версию, хотел прокатить на халяву, узрев, что там тоже есть OLE-сервер, но напоролся на то, что переписывать практически каждую строчку придется, если до этого пользовались 6-8 версиями :) Так что писать всё заново под АТОЛ 10 .
6 мар 19, 17:16    [21826581]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
antox
Member

Откуда: РФ
Сообщений: 946
Придется писать... (
6 мар 19, 17:33    [21826601]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
V.Borzov
И, к слову, про АТОЛ: я тыркнулся в 10 версию, хотел прокатить на халяву, узрев, что там тоже есть OLE-сервер, но напоролся на то, что переписывать практически каждую строчку придется, если до этого пользовались 6-8 версиями :) Так что писать всё заново под АТОЛ 10
Не, ну чё, сходства есть.
И примеры хорошие для дельфей в доке.
Концептуальную разницу я одну заметил: ИНН оператора передается не при печати чека, а при регистрации кассира.
Я у себя сделал абстрактный класс и наследуюсь от него в зависимости от версии.
Типа TAtol и наследники TAtol8 или TAtol10.
Так вот функции классов TAtol8 и TAtol10 очень похожи, не только названием.
6 мар 19, 17:54    [21826626]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
V.Borzov
Member

Откуда: Саратов
Сообщений: 269
YuRock,
А я все драйверы касс выкинул на скрипты в фастрепорт, OLE-сервера там поддерживаются. В самой программе есть стандартный набор процедур, которые она вызывает в этом скрипте, и ей без разницы, что там стоит, а вся работа непосредственно с кассой зависит уже от установленного скрипта. Правда, из десятка когда-то освоенных драйверов реально работают сейчас только АТОЛ да ШТРИХ, а всякие там Меркурии что-то не попадались с тех пор, как ввели онлайн-кассы. Не говоря обо всяких там АМС :)
6 мар 19, 21:00    [21826764]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 768
cptngrb
white_nigger, человек ругает чужой код не говоря как надо. Это не конструктивно.


Со мной в команде 3 года работал программист, он каким-то чудом выполнил тестовое задание, за это его взяли на работу. Так он примерно в таком же стиле писал. Я все три года старался его переучить, но тщетно (ему уж 40 лет, опыт работа на Delphi более 20 лет). Недавно его уволили за профнепригодность. Иногда такой его код "выстреливает" так, что плакать хочется. Недавно пришлось модуль на 2 тыс. строк кода переписать с нуля, поскольку он работал с ошибкой, а разобраться и исправить ошибку было нереально (я даже не думал, что так бывает).
После этого случая у меня автоматически возникают нехорошие ассоциации.
6 мар 19, 21:32    [21826773]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
V.Borzov
Member

Откуда: Саратов
Сообщений: 269
DmSer,
В 2 тысячах строк не смогли найти ошибку, оказалось проще переписать? Да ладно... Отмазка это, по-моему :) Были другие причины.
6 мар 19, 22:20    [21826803]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 768
V.Borzov
DmSer,
В 2 тысячах строк не смогли найти ошибку, оказалось проще переписать? Да ладно... Отмазка это, по-моему :) Были другие причины.


По факту там ошибка была в каждой второй строке. Каким-то чудом до поры до времени этот код работал, потом перестал.
6 мар 19, 22:23    [21826804]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
cptngrb
Member

Откуда:
Сообщений: 284
DmSer,
поэтому и хочется, чтобы носом тыкнули и написали, что так и так писать не надо, а то будет бо-бо
7 мар 19, 08:22    [21826936]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
V.Borzov
Member

Откуда: Саратов
Сообщений: 269
cptngrb,
Да они хотят просто стырить твой код как есть, чтобы не заморачиваться и не переделывать, и чтобы всё разжевано было, и чтобы работало, и без ошибок. Ан-нет, придется потрудиться. Вот и расстроились.... )))
7 мар 19, 15:11    [21827415]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 768
cptngrb
DmSer,
поэтому и хочется, чтобы носом тыкнули и написали, что так и так писать не надо, а то будет бо-бо


О проблемах в критикуемом мною примере кода уже написал white_nigger. Я бы еще добавил, что работа с ФР ведется в основном потоке, поэтому если ФР подвиснет с ответом, то и у пользователя программа будет висеть в статусе "не отвечает".
А вообще обычно почти любые примеры работы со штрихом можно подсмотреть в исходниках теста драйвера.
7 мар 19, 22:21    [21827763]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
MikeDD
Member

Откуда:
Сообщений: 238
DmSer
Я бы еще добавил, что работа с ФР ведется в основном потоке, поэтому если ФР подвиснет с ответом, то и у пользователя программа будет висеть в статусе "не отвечает".

И что? Все равно пока ФР не заработает кассиру делать нечего.
8 мар 19, 09:33    [21827837]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 768
Это смотря какой функционал в программу заложен. В идеале да, программа кассира не должна делать ничего лишнего, управление всем остальным должно быть организовано в отдельных сервисах. Но все ли так делают?
Проблема не отвечающей программы в том, что кассир пытается нажимать, получается не то, что он планирует, хуже того, иногда модальные окна на задний план улетают, иногда исчезает модальность и пользователь может закрыть нижележащее окно.
8 мар 19, 11:14    [21827851]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
MikeDD
Member

Откуда:
Сообщений: 238
DmSer, да какой бы функционал не был заложен - обязанность кассира обслужить клиента и выдать чек. И до тех пор пока от ФР не получено подтверждение об успехе операции либо ошибка - кассовое ПО не должно реагировать на действия юзера от слова совсем.
8 мар 19, 13:20    [21827943]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
Gator
Member

Откуда: Москва
Сообщений: 14084
MikeDD,

С таким подходом вернется аналог "пустых полок". Накопление очереди с телегами у кассы, увеличение времени ожидания/обслуживания кассы, уход без покупок. Связь/софт/хард ещё - те ещё. Действия юзверя понятны - разломать кассу, народ побить и на подножный корм переходить...

Короче,- КИРДЫК
8 мар 19, 14:02    [21827958]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
MikeDD
Member

Откуда:
Сообщений: 238
Gator, очень интересно. У нас что уже разрешили торговать без применения ККТ?
8 мар 19, 14:37    [21827969]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
V.Borzov
Member

Откуда: Саратов
Сообщений: 269
Gator,
Нет, ну разве только если распараллелить процедуры печати чека и сохранения продажи в базе данных, какие еще преимущества от вывода печати в отдельный поток с точки зрения уменьшения размера очереди могут быть?
8 мар 19, 14:47    [21827975]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
Gator
Member

Откуда: Москва
Сообщений: 14084
MikeDD
Gator, очень интересно. У нас что уже разрешили торговать без применения ККТ?

Нет конечно. Но когда "не работает" и спешат - торгуют за нал и без чеков. Это жизнь! А вся это обеспечение расчётов через ККМ - мертвечина мёртвая.
imho
8 мар 19, 15:17    [21827995]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
Gator
Member

Откуда: Москва
Сообщений: 14084
V.Borzov,

Ничего ты не распараллелишь. В любой момент может канал распахать пьяный тракторист или пролететь дрон тупого дитяти.
8 мар 19, 15:21    [21827998]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 768
MikeDD
DmSer, да какой бы функционал не был заложен - обязанность кассира обслужить клиента и выдать чек. И до тех пор пока от ФР не получено подтверждение об успехе операции либо ошибка - кассовое ПО не должно реагировать на действия юзера от слова совсем.


Если при отпуске товара всё выполнять в основном потоке, то программа превращается в неповоротливого урода:
1. Выполняем запросы к базе данных (время операции непредсказуемо)
2. Обращаемся к дисконтной системе (время операции непредсказуемо)
3. Выполняем операцию с банковской картой (время операции непредсказуемо)
4. Бьём чек (время операции непредсказуемо и чем больше позиций, тем дольше будет висеть интерфейс).

Что в это время должен видеть на экране кассир?
8 мар 19, 19:42    [21828093]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
rgreat
Member

Откуда:
Сообщений: 4826
Стасус выпоонения всех этих действий.
8 мар 19, 19:57    [21828103]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 768
rgreat
Стасус выпоонения всех этих действий.


С помощью каких средств Вы предлагаете отображать статус операций в условиях блокировки основного потока? Я хочу при этом в программе видеть индикацию доительности операции.
Пару средств я знаю. Одно из них мой TProgressViewer, но у него проблема со скачущим фокусом и он не помешает кассиру тыкнуть на повисшую форму и словить какой-нибудь глюк с подачи ОС.
Вопрос очень актуальный для меня на самом деле.
8 мар 19, 20:45    [21828126]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
rgreat
Member

Откуда:
Сообщений: 4826
Не блокировать основной поток - не вариант?
8 мар 19, 21:22    [21828141]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
MikeDD
Gator, очень интересно. У нас что уже разрешили торговать без применения ККТ?
Печатать чек синхронно с главным потоком - согласен. Любыми остальными командами к кассе совсем не обязательно тормозить главный поток.
А еще бывают, представьте, варианты, когда кассира и АРМ два (второй чз сеть работает через первого), а касса - одна между ними. Так вот опять же, тормозить при чеке обязан только один из них.
8 мар 19, 21:57    [21828164]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 768
rgreat
Не блокировать основной поток - не вариант?


Это вариант, который я как раз поддерживаю. Но обсуждается вариант с блокировкой.
9 мар 19, 00:59    [21828226]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
antox
Member

Откуда: РФ
Сообщений: 946
Кто делал под atol 10й драйвер, скиньте примеры, если не жалко... )
9 мар 19, 08:30    [21828271]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
MikeDD
Member

Откуда:
Сообщений: 238
DmSer
Если при отпуске товара всё выполнять в основном потоке, то программа превращается в неповоротливого урода:

У меня почему-то не превращается.
DmSer
1. Выполняем запросы к базе данных (время операции непредсказуемо)

Да ладно? Тут либо твоя БД находится за сотни километров от РМ кассира (неоднозначное решение между прочим) либо нужно руки оторвать программисту.
DmSer
2. Обращаемся к дисконтной системе (время операции непредсказуемо)

Тоже самое. А п.2 зависит от п.1 т.к. не сформировав полностью чек скидку на него ты не сделаешь. Эти операции не распараллеливаются.
DmSer
3. Выполняем операцию с банковской картой (время операции непредсказуемо)

Ты не сможешь инициировать снятие денег с карты не выполнив п.1 и п.2. И пока ты не получишь подтверждения от банка ты не сможешь напечатать чек.
DmSer
4. Бьём чек (время операции непредсказуемо и чем больше позиций, тем дольше будет висеть интерфейс).

Кассир в любом случае должен дождаться пока ФР не завершит свою работу успехом либо ошибкой. Кстати ему еще нужно получить деньги и выдать сдачу если расчет за нал.

Ни в одном магазине ни разу в жизни не видел чтобы начинали обслуживать следующего клиента не завершив обслуживание предыдущего.
9 мар 19, 17:47    [21828435]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
MikeDD
Member

Откуда:
Сообщений: 238
YuRock
А еще бывают, представьте, варианты, когда кассира и АРМ два (второй чз сеть работает через первого), а касса - одна между ними. Так вот опять же, тормозить при чеке обязан только один из них.

Было такое, но это редкость. Сейчас все это решается установкой ФР с сетевым интерфейсом.
9 мар 19, 17:55    [21828439]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
antox
Кто делал под atol 10й драйвер, скиньте примеры, если не жалко... )
Прекрасные примеры внутри официальной документации.
9 мар 19, 18:46    [21828453]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
MikeDD
Ни в одном магазине ни разу в жизни не видел чтобы начинали обслуживать следующего клиента не завершив обслуживание предыдущего.
Во всех супермаркетах Украины давно так.
9 мар 19, 18:47    [21828454]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
MikeDD
Кассир в любом случае должен дождаться пока ФР не завершит свою работу успехом либо ошибкой.
Он и дожидается, пока сканирует товары следующего клиента.

MikeDD
Кстати ему еще нужно получить деньги и выдать сдачу если расчет за нал.
Все это делается перед нажатием на кнопку "Чек".
9 мар 19, 18:55    [21828455]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
MikeDD
Member

Откуда:
Сообщений: 238
YuRock
MikeDD
Кассир в любом случае должен дождаться пока ФР не завершит свою работу успехом либо ошибкой.
Он и дожидается, пока сканирует товары следующего клиента.

А что он будет делать если ФР сказал до скорого и махнул рукой? Предыдущий клиент ушел без чека, а продолжить работу кассир все равно не сможет и все что он отсканировал придется грохнуть и послать клиента на другую кассу. И нафига все это?
YuRock
MikeDD
Кстати ему еще нужно получить деньги и выдать сдачу если расчет за нал.
Все это делается перед нажатием на кнопку "Чек".

1. берем деньги от клиента
2. инициируем печать чека
3. пока печатается чек - выдаем сдачу.
9 мар 19, 19:13    [21828457]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
MikeDD
Member

Откуда:
Сообщений: 238
YuRock
MikeDD
Ни в одном магазине ни разу в жизни не видел чтобы начинали обслуживать следующего клиента не завершив обслуживание предыдущего.
Во всех супермаркетах Украины давно так.

Очень интересно. А сколько проходит времени между инициированием печати чека и получением от ФР ответа?
9 мар 19, 19:17    [21828458]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 768
MikeDD
Тоже самое. А п.2 зависит от п.1 т.к. не сформировав полностью чек скидку на него ты не сделаешь. Эти операции не распараллеливаются.


Я нигде про распараллеливание не говорил. Мы с Вами про разные вещи говорим.
9 мар 19, 19:22    [21828460]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
MikeDD
YuRock
пропущено...
Во всех супермаркетах Украины давно так.

Очень интересно. А сколько проходит времени между инициированием печати чека и получением от ФР ответа?
В зависимости от формы оплаты. По наличке - секунды, по карте - может и больше минуты быть, от терминала зависит, но в любом случае достаточно долго.
9 мар 19, 19:46    [21828464]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
MikeDD
Member

Откуда:
Сообщений: 238
DmSer
MikeDD
Тоже самое. А п.2 зависит от п.1 т.к. не сформировав полностью чек скидку на него ты не сделаешь. Эти операции не распараллеливаются.


Я нигде про распараллеливание не говорил. Мы с Вами про разные вещи говорим.


Видимо я что-то не понимаю. Какой смысл городить расчет скидки в отдельном потоке? Пока считается скидка что можно сделать? Добавить позицию? Нет, т.к. скидку придется пересчитывать. Инициировать оплату картой или печать чека? Нет, т.к. неизвестна итоговая сумма.
9 мар 19, 19:48    [21828465]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
MikeDD
А что он будет делать если ФР сказал до скорого и махнул рукой? Предыдущий клиент ушел без чека, а продолжить работу кассир все равно не сможет и все что он отсканировал придется грохнуть и послать клиента на другую кассу.
Значит клиенту не нужен чек, раз ушел. Я всегда ухожу. Клиента не волнует, что в этом случае будет делать кассир, он заплатил и ушел.

Что делать кассиру? Тоже масса вариантов. Да, например на другой кассе чек пробить, если эта поломалась.

Заметь, это редчайший форсмажорный случай. Но и он не приводит ни к чему плохому.
9 мар 19, 19:50    [21828467]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
MikeDD
YuRock
пропущено...
Все это делается перед нажатием на кнопку "Чек".

1. берем деньги от клиента
2. инициируем печать чека
3. пока печатается чек - выдаем сдачу.
Пока клиент считает наличку, кстати, тоже уже идет обслуживание следующего.
Как насчитал - кассир "возвращается", считает деньги, выдает сдачу, нажимает "Чек" и говорит до свидания, и опять возвращается к следующему.
9 мар 19, 19:53    [21828469]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
MikeDD
Member

Откуда:
Сообщений: 238
YuRock
MikeDD
пропущено...

Очень интересно. А сколько проходит времени между инициированием печати чека и получением от ФР ответа?
В зависимости от формы оплаты. По наличке - секунды, по карте - может и больше минуты быть, от терминала зависит, но в любом случае достаточно долго.

Ни разу не видел чтобы после набора пина/прикладывания карты проходило больше нескольких секунд. А если на карте недостаточно средств то все равно придется разбираться с предыдущим клиентом. Нет смысла начинать работу со следующим клиентом не закончив работу с предыдущим.
9 мар 19, 19:57    [21828471]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
MikeDD
Member

Откуда:
Сообщений: 238
YuRock
MikeDD
пропущено...

1. берем деньги от клиента
2. инициируем печать чека
3. пока печатается чек - выдаем сдачу.
Пока клиент считает наличку, кстати, тоже уже идет обслуживание следующего.
Как насчитал - кассир "возвращается", считает деньги, выдает сдачу, нажимает "Чек" и говорит до свидания, и опять возвращается к следующему.

Бред какой-то. Клиенту считать особо нечего, ему называют итоговую сумму - он дает либо сумму превышающую сумму покупки либо если хочет избавиться от мелочи - вообще без сдачи либо чтобы сдача была бумажками а не мелочью. Следующего клиента до расчета с предыдущим не обслуживают.
9 мар 19, 20:06    [21828474]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 768
MikeDD

Видимо я что-то не понимаю. Какой смысл городить расчет скидки в отдельном потоке? Пока считается скидка что можно сделать?


Пока выполняются эти операции кассиру ничего не нужно делать. Я лишь против того, чтобы вешать основной поток программы. Мы, например, обращение к торговому оборудованию выносим в доп. поток, а в момент обращения открываем в главном потоке модальную форму, которую кассир закрыть не может. В этой форме можем выводить любую дополнительную информацию.
9 мар 19, 20:11    [21828478]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
MikeDD
Ни разу не видел чтобы после набора пина/прикладывания карты проходило больше нескольких секунд.
Ты извини, но я так понял, что ты еще много чего ни разу не видел.

MikeDD
А если на карте недостаточно средств то все равно придется разбираться с предыдущим клиентом.
Это совершенно ничего не меняет.

MikeDD
Нет смысла начинать работу со следующим клиентом не закончив работу с предыдущим.
Смысл огромен - быстрее идет очередь. Клиенты экономят время, магазины экономят на кол-ве касс, что также выражается в кол-ве лицензий на алкоголь и табак.
9 мар 19, 20:25    [21828484]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
MikeDD
Member

Откуда:
Сообщений: 238
DmSer
MikeDD
Видимо я что-то не понимаю. Какой смысл городить расчет скидки в отдельном потоке? Пока считается скидка что можно сделать?


Пока выполняются эти операции кассиру ничего не нужно делать. Я лишь против того, чтобы вешать основной поток программы. Мы, например, обращение к торговому оборудованию выносим в доп. поток, а в момент обращения открываем в главном потоке модальную форму, которую кассир закрыть не может. В этой форме можем выводить любую дополнительную информацию.

Дополнительную инфу о чем? Работа с этим клиентом де-факто уже закончена, раскрутить на доппродажу зачитав с экрана инфу от товаре дне или что там еще у вас есть вы его уже не сможете т.к. он уже оплатил свою покупку. Это нужно было делать ДО закрытия чека. В чем смысл городить весь этот огород?
9 мар 19, 20:25    [21828486]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
MikeDD
Следующего клиента до расчета с предыдущим не обслуживают.
В мечтах.
9 мар 19, 20:25    [21828487]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
MikeDD
Member

Откуда:
Сообщений: 238
YuRock
MikeDD
Ни разу не видел чтобы после набора пина/прикладывания карты проходило больше нескольких секунд.
Ты извини, но я так понял, что ты еще много чего ни разу не видел.

И слава Богу, что у нас нет такого гемора от слова вообще.

YuRock
MikeDD
Нет смысла начинать работу со следующим клиентом не закончив работу с предыдущим.
Смысл огромен - быстрее идет очередь. Клиенты экономят время, магазины экономят на кол-ве касс, что также выражается в кол-ве лицензий на алкоголь и табак.
У нас лицензируется сама торговая точка а не количество касс.
9 мар 19, 20:29    [21828488]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
MikeDD
В чем смысл городить весь этот огород?
Чтобы удовлетворить требования заказчика (владельца магазина), который хочет, например, показывать в это время рекламу, которую оператор должен прочесть клиенту.
9 мар 19, 20:29    [21828489]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
MikeDD
Member

Откуда:
Сообщений: 238
YuRock
MikeDD
Следующего клиента до расчета с предыдущим не обслуживают.
В мечтах.
Добро пожаловать в Россию.
9 мар 19, 20:30    [21828490]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
MikeDD
Member

Откуда:
Сообщений: 238
YuRock
MikeDD
В чем смысл городить весь этот огород?
Чтобы удовлетворить требования заказчика (владельца магазина), который хочет, например, показывать в это время рекламу, которую оператор должен прочесть клиенту.
У нас требуют зачитывать рекламу ДО закрытия чека.
9 мар 19, 20:32    [21828491]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
Cobalt747
Member

Откуда:
Сообщений: 2057
YuRock
Значит клиенту не нужен чек, раз ушел. Я всегда ухожу. Клиента не волнует, что в этом случае будет делать кассир, он заплатил и ушел.

Видимо, вам никогда не приходилось возвращать скоропортящийся товар.
Счастливчик
9 мар 19, 20:33    [21828493]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
MikeDD
YuRock
пропущено...
Ты извини, но я так понял, что ты еще много чего ни разу не видел.

И слава Богу, что у нас нет такого гемора от слова вообще.
Это не у вас гемора нет, это просто лично твоя программа не может по другому.


MikeDD
У нас лицензируется сама торговая точка а не количество касс.
Это не отменяет остальной, немалой экономии на кол-ве касс.
Хотя главное, конечно, это время клиентов.
У нас без наличия касс самообслуживания, например, магазин считается говномагазином и туда мало кто ходит.
И именно это время кассир экономит, обслуживая одновременно двоих (тех, кто не пошел на кассу самообслуживания, их все же большинство пока).
9 мар 19, 20:35    [21828495]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
MikeDD
YuRock
пропущено...
Чтобы удовлетворить требования заказчика (владельца магазина), который хочет, например, показывать в это время рекламу, которую оператор должен прочесть клиенту.
У нас требуют зачитывать рекламу ДО закрытия чека.
Тебя послушать, так можно подумать, что "у вас" делается всё, чтобы очереди были как можно длиннее и тянулись как можно дольше, чтобы в итоге это привело к тому, что клиентов в сутки магазин обслуживал как можно меньше и товаров продавал, соответственно, тоже как можно меньше.
9 мар 19, 20:38    [21828499]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
MikeDD
YuRock
пропущено...
В мечтах.
Добро пожаловать в Россию.
Мой АРМ работает и в России тоже (иначе нафиг бы мне подпрыгнул АТОЛ-10), и в нем поддерживается и постоянно используется одновременное обслуживание нескольких клиентов.
9 мар 19, 20:40    [21828500]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
Cobalt747
YuRock
Значит клиенту не нужен чек, раз ушел. Я всегда ухожу. Клиента не волнует, что в этом случае будет делать кассир, он заплатил и ушел.

Видимо, вам никогда не приходилось возвращать скоропортящийся товар.
Счастливчик
Ну да, не приходилось.
Два раза в жизни я покупал протухшие яйца, но даже если бы у меня был чек, я все равно не пошел бы возвращать их из-за 10 гривен.
А на дату молочки я всегда смотрю.
9 мар 19, 20:44    [21828503]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
MikeDD
Member

Откуда:
Сообщений: 238
YuRock
MikeDD
пропущено...
Добро пожаловать в Россию.
Мой АРМ работает и в России тоже (иначе нафиг бы мне подпрыгнул АТОЛ-10), и в нем поддерживается и постоянно используется одновременное обслуживание нескольких клиентов.

Интересно где? Пятерочка, Магнит, Лента, Перекресток, Карусель, Полушка - нигде я не видел такого.
9 мар 19, 20:45    [21828504]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
MikeDD
Member

Откуда:
Сообщений: 238
YuRock
MikeDD
пропущено...
У нас требуют зачитывать рекламу ДО закрытия чека.
Тебя послушать, так можно подумать, что "у вас" делается всё, чтобы очереди были как можно длиннее и тянулись как можно дольше, чтобы в итоге это привело к тому, что клиентов в сутки магазин обслуживал как можно меньше и товаров продавал, соответственно, тоже как можно меньше.
Это тебе так кажется. У нас просто кассир не сидит минуты в ожидании пока ФР или банковский терминал разродится ответом. Все происходит достаточно быстро.
9 мар 19, 20:52    [21828510]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
MikeDD
YuRock
пропущено...
Мой АРМ работает и в России тоже (иначе нафиг бы мне подпрыгнул АТОЛ-10), и в нем поддерживается и постоянно используется одновременное обслуживание нескольких клиентов.

Интересно где? Пятерочка, Магнит, Лента, Перекресток, Карусель, Полушка - нигде я не видел такого.
Нет, есть на некоторых автозаправочных комплексах. На каких - не скажу, сорри.
9 мар 19, 20:56    [21828518]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
MikeDD
Member

Откуда:
Сообщений: 238
YuRock
MikeDD
пропущено...

И слава Богу, что у нас нет такого гемора от слова вообще.
Это не у вас гемора нет, это просто лично твоя программа не может по другому.


Не может потому что смысла в этом нет. Кстати я работаю не в продуктовом ритейле, у нас самообслуживания нет. Ну практически нет.
9 мар 19, 20:57    [21828519]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
MikeDD
YuRock
пропущено...
Тебя послушать, так можно подумать, что "у вас" делается всё, чтобы очереди были как можно длиннее и тянулись как можно дольше, чтобы в итоге это привело к тому, что клиентов в сутки магазин обслуживал как можно меньше и товаров продавал, соответственно, тоже как можно меньше.
Это тебе так кажется. У нас просто кассир не сидит минуты в ожидании пока ФР или банковский терминал разродится ответом. Все происходит достаточно быстро.
Угу. Кассир у вас заставляет бабушку в течении секунды пинкод вспомнить и ввести.
9 мар 19, 20:58    [21828520]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
MikeDD
YuRock
пропущено...
Это не у вас гемора нет, это просто лично твоя программа не может по другому.


Не может потому что смысла в этом нет. Кстати я работаю не в продуктовом ритейле, у нас самообслуживания нет. Ну практически нет.
Ну да, конечно, смысла нет.
А в Украине на такую схему все перешли, конечно же, только потому, что сами себе враги.
9 мар 19, 20:59    [21828523]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
MikeDD
Member

Откуда:
Сообщений: 238
YuRock
MikeDD
пропущено...
Это тебе так кажется. У нас просто кассир не сидит минуты в ожидании пока ФР или банковский терминал разродится ответом. Все происходит достаточно быстро.
Угу. Кассир у вас заставляет бабушку в течении секунды пинкод вспомнить и ввести.

Почему сразу бабушка? Ну я пару раз тупил и путал пинконд от одной карты и пытался его вбить для другой карты. Ничего страшного не случилось. У нас в супермаркетах обычная ситуация когда из десятка касс работают 2-3, и когда накапливается очередь больше нескольких человек просто открываются другие кассы и очередь рассасывается.
9 мар 19, 21:04    [21828525]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
MikeDD
Member

Откуда:
Сообщений: 238
YuRock
MikeDD
пропущено...


Не может потому что смысла в этом нет. Кстати я работаю не в продуктовом ритейле, у нас самообслуживания нет. Ну практически нет.
Ну да, конечно, смысла нет.
А в Украине на такую схему все перешли, конечно же, только потому, что сами себе враги.

Да переходите куда хотите. Но это не значит что ваш путь единственно правильный а все кто не делает также - враги народа.
9 мар 19, 21:10    [21828529]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 768
MikeDD
Дополнительную инфу о чем?


Например, терминал самообслуживания может вывести клиенту строки "вставьте карту", "введите пин-код", "извлеките карту" и любой другой текст, который предоставляет библиотека эквайринга.
9 мар 19, 21:31    [21828537]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
MikeDD
YuRock
пропущено...
Ну да, конечно, смысла нет.
А в Украине на такую схему все перешли, конечно же, только потому, что сами себе враги.

Да переходите куда хотите. Но это не значит что ваш путь единственно правильный а все кто не делает также - враги народа.
Единственно верным есть тот путь, который повышает прибыль магазина.
А она зависит от скорости обслуживания и кол-ва касс.
9 мар 19, 22:17    [21828552]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
MikeDD
YuRock
Угу. Кассир у вас заставляет бабушку в течении секунды пинкод вспомнить и ввести.

Почему сразу бабушка? Ну я пару раз тупил и путал пинконд от одной карты и пытался его вбить для другой карты. Ничего страшного не случилось.
Ну вот. А за это время кассир мог бы, если б ПО позволяло, просканировать товары следующего клиента. И тоже ничего страшного не случилось бы.
9 мар 19, 22:20    [21828553]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
Vizit0r
Member

Откуда:
Сообщений: 589
YuRock
MikeDD
пропущено...

Почему сразу бабушка? Ну я пару раз тупил и путал пинконд от одной карты и пытался его вбить для другой карты. Ничего страшного не случилось.
Ну вот. А за это время кассир мог бы, если б ПО позволяло, просканировать товары следующего клиента. И тоже ничего страшного не случилось бы.


Товары перемешиваются, потому что первый клиент вместо того, чтобы собрать свои покупки - возится с терминалом, а сверху уже летят товары следующего клиента. Несколько раз наблюдал скандалы из-за этого. Поэтому чаще всего кассиры, даже есть есть возможность пробивать следующую покупку - подождут.
Магазин может хотеть ускорения работы - это понятно, но еще больше он хочет отсутствия скандалов.
10 мар 19, 04:17    [21828629]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
MikeDD
Member

Откуда:
Сообщений: 238
YuRock
MikeDD
пропущено...

Почему сразу бабушка? Ну я пару раз тупил и путал пинконд от одной карты и пытался его вбить для другой карты. Ничего страшного не случилось.
Ну вот. А за это время кассир мог бы, если б ПО позволяло, просканировать товары следующего клиента. И тоже ничего страшного не случилось бы.

От ситуации зависит. К примеру на карте не хватает средств - и вот кассиру приходится опять возвращаться к предыдущему клиенту, менять тип оплаты на смешанный если клиент добавляет недостающее налом либо удалять позиции. А следующий клиент в это время курит в сторонке хотя тихо мирно мог бы пойти на соседнюю освободившуюся кассу. И ради чего весь этот головняк? Чтобы возможно сэкономить пару минут из 12-часовой смены? Кстати пока клиент возится с пином кассир помогает собрать товар в пакеты и/или отсчитывает наклейки для покупки очередной шняги якобы со скидкой. Никто не сидит и не плюет в потолок.
Наличие/отсутствие очередей не является первостепенным конкурентным преимуществом. Ну не поеду я на другой конец города лишь бы не стоять в очереди из 2-3 человек. А вот за ценой и ассортиментом может быть и поеду, и даже в очереди постою. Впрочем от ПО это уже не зависит.
10 мар 19, 07:42    [21828640]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
Vizit0r
а сверху уже летят товары следующего клиента
Такого не бывает никогда, ибо есть 2 отдельных бокса для разных клиентов, перегороженные
10 мар 19, 10:00    [21828652]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
MikeDD
Чтобы возможно сэкономить пару минут из 12-часовой смены?
Кассиру? Ничего. Клиенту? Репутацию магазина.
10 мар 19, 10:01    [21828654]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
s62
Member

Откуда: Жуковский
Сообщений: 893
YuRock
Vizit0r
а сверху уже летят товары следующего клиента
Такого не бывает никогда, ибо есть 2 отдельных бокса для разных клиентов, перегороженные
Далеко не везде. В Пятерочке близко от дома, где я часто покупаю продукты, так и бывает - предыдущий покупатель еще собирает свои покупки, а кассир уже с краю бокса подкладывает покупки следующего. Или например в Перекрестке в тц Калужский (Мск) то же самое. То есть - обычная ситуация.
10 мар 19, 13:03    [21828683]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
s62
Member

Откуда: Жуковский
Сообщений: 893
s62,
точнее, в таких случаях бывало так: где-то второго бокса, насколько помню, нет, а где-то он есть, но кассир им не всегда пользуется - м.б. не очень удобно и др., уж не знаю какие, причины.
10 мар 19, 13:11    [21828684]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
s62
В Пятерочке близко от дома, где я часто покупаю продукты, так и бывает - предыдущий покупатель еще собирает свои покупки, а кассир уже с краю бокса подкладывает покупки следующего.
Ну уже норм. DD же меня убеждал, что у вас такое совсем не практикуется, вернее, он не видел.
10 мар 19, 13:59    [21828694]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
antox
Member

Откуда: РФ
Сообщений: 946
YuRock
antox
Кто делал под atol 10й драйвер, скиньте примеры, если не жалко... )
Прекрасные примеры внутри официальной документации.


Спасибо, посмотрю. А из приложения 64х с
10кой пробовали работать?
вчера, 06:27    [21835046]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
antox
YuRock
пропущено...
Прекрасные примеры внутри официальной документации.


Спасибо, посмотрю. А из приложения 64х с
10кой пробовали работать?
Нет, не пробовал.
вчера, 08:47    [21835060]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
Arioch
Member

Откуда:
Сообщений: 10598
YuRock
Vizit0r
а сверху уже летят товары следующего клиента
Такого не бывает никогда, ибо есть 2 отдельных бокса для разных клиентов, перегороженные


....и кассиры эти НЕ пользуются, хоть кол на голове теши.
Одна из сотни если воспользуется.

Вы им многозадачность хотите - а для них два бокса перед глазами - уже запрещающе сложно
сегодня, 11:28    [21835712]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
Arioch
YuRock
пропущено...
Такого не бывает никогда, ибо есть 2 отдельных бокса для разных клиентов, перегороженные


....и кассиры эти НЕ пользуются, хоть кол на голове теши.
Одна из сотни если воспользуется.

Вы им многозадачность хотите - а для них два бокса перед глазами - уже запрещающе сложно
Если б не пользовались - перемешивались бы товары клиентов. Пользуются, конечно.
сегодня, 13:48    [21835928]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
V.Borzov
Member

Откуда: Саратов
Сообщений: 269
YuRock
Если б не пользовались - перемешивались бы товары клиентов. Пользуются, конечно.

Ой, ну вот точно не пользуются. Сгребаешь в корзину товар побыстрее, лишь бы не начали накидывать чужой тебе, и тут зависит от кассира: либо будет ждать, пока не сгребешь всё свое, либо пофиг ей, швыряет в ту же кучу, напрягая этим другого покупателя )))
сегодня, 14:03    [21835946]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
Arioch
Member

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

наверное у вас удивительно хорошие кассиры.

я даже передвигал разграничитель, чтобы мне кидали в дальний отсек, чтобы я потом не спеша выбирал и не мешал другим

кассир все равно перекидывает "стенку" обратно и кидает в ближний, ей так проще, она по другoму не умеет
сегодня, 14:22    [21835974]     Ответить | Цитировать Сообщить модератору
 Re: Delphi + онлайн-кассы  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
Arioch
YuRock,

наверное у вас удивительно хорошие кассиры.

я даже передвигал разграничитель, чтобы мне кидали в дальний отсек, чтобы я потом не спеша выбирал и не мешал другим

кассир все равно перекидывает "стенку" обратно и кидает в ближний, ей так проще, она по другoму не умеет
Понятно, что бывают разные случаи. Но стараются, им лишние скандалы не нужны, и так работа нервная.
Я и сам стараюсь побыстрее свой товар собирать навсякий))
сегодня, 16:01    [21836164]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3 4 5      [все]
Все форумы / Delphi Ответить