powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi + онлайн-кассы
125 сообщений из 125, показаны все 5 страниц
Delphi + онлайн-кассы
    #39550056
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На подходе переход на онлайн кассы. У нас по точкам самописная кассовая прога (Delphi 2007), аппараты Штрих-М. Сейчас печатаем чек в собственном формате (основная инфа + общая скидка по чеку). Как я понимаю скоро всю инфу надо будет передавать через онлайн кассы в строго определенном формате (в частности, к примеру, как я понимаю скидка уже должна быть по каждому наименованию в чеке). Кто-нибудь может поделиться выходными структурами данными на Delphi, которые должны буду передаваться в онлайн по новому формату? Как это вообще все должно работать? В общем нужна любая инфа по теме Delphi + онлайн-кассы
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39550077
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
насколько я понимаю, всю инфу должна передавать сама касса с онлайн-эклз
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39550157
Близнец1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
арт2010,

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

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

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

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

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


т.е. подмена названия кассира и работаем всегда от сист.администратора.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39550158
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkinнасколько я понимаю, всю инфу должна передавать сама касса с онлайн-эклз
Не обязательно. Есть ккм с ethernet,они сразу передают, есть с usb, там эмуляция ethernet over usb, там на кассе ПО ставится
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Delphi + онлайн-кассы
    #39781935
Aleks2019
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Близнец1980, Есть исходные коды для Delphi 2010? хочу прикрутить функционал к проге для работы с Штрих-М и онлайн-кассой
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39781957
Близнец1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleks2019,

Delphi 7, если нужно могу немного кода именно работы со Штрихом сюда выложить.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782003
Aleks2019
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Близнец1980, на почту мне можешь скинуть исх.коды?
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782008
Близнец1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleks2019,

E-Mail: скрыт
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782021
Aleks2019
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Близнец1980,auto-soft2012@mail.ru
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782064
Alex Zhuravlev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можно сюда код выложить?
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782141
Близнец1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Zhuravlev,

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

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


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.
577.
578.
579.
580.
581.
582.
583.
584.
585.
586.
587.
588.
589.
590.
591.
592.
593.
594.
595.
596.
597.
598.
599.
600.
601.
602.
603.
604.
605.
606.
607.
608.
609.
610.
611.
612.
613.
614.
615.
616.
617.
618.
619.
620.
621.
622.
623.
624.
625.
626.
627.
628.
629.
630.
631.
632.
633.
634.
635.
636.
637.
638.
639.
640.
641.
642.
643.
644.
645.
646.
647.
648.
649.
650.
651.
652.
653.
654.
655.
656.
657.
658.
659.
660.
661.
662.
663.
664.
665.
666.
667.
668.
669.
670.
671.
672.
673.
674.
675.
676.
677.
678.
679.
680.
681.
682.
683.
//регистрация чека в ККТ
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; // Регистрация в ФР


...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782269
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код работы с ККТ из работающей программы.

У этой чудесной программы есть имя?
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782314
Близнец1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerКод работы с ККТ из работающей программы.
У этой чудесной программы есть имя?
Да. В одной небольшой компании на кассовых терминалах работает, а что не так?
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782323
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Близнец1980, а номер чека где берешь?
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782376
Близнец1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbБлизнец1980, а номер чека где берешь?
Сам формирую, независимо от ККМ.
В других операциях (не продажа или возврат) беру из ККМ так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
       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);
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782384
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Близнец1980, я делаю по справке, но номер чека отличается на бумажном чеке почему то. А в твоем примере берется сквозной номер документа

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

Код: pascal
1.
2.
3.
4.
Driver.Password:= PASSWD;
Driver.RegisterNumber:= 148;
Driver.GetOperationReg;
Result:= Driver.ContentsOfOperationRegister;
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782403
Близнец1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbБлизнец1980, я делаю по справке, но номер чека отличается на бумажном чеке почему то. А в твоем примере берется сквозной номер документа

Сейчас проверил на одной кассе:
Код: pascal
1.
2.
FMain.DrvFR.FNGetCurrentSessionParams;
ShowMessage('FMain.DrvFR.ReceiptNumber = '+IntToStr(FMain.DrvFR.ReceiptNumber));

показал правильный номер последнего пробитого чека в текущей смене (12)

Код: pascal
1.
2.
3.
DrvFR.RegisterNumber:= 148;
DrvFR.GetOperationReg;
ShowMessage('Name='+DrvFR.NameOperationReg+' content '+IntToStr(DrvFR.ContentsOfOperationRegister));


непонятная цифра 666.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782404
Alex Zhuravlev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Близнец1980Alex Zhuravlev,
Код работы с ККТ из работающей программы.
Ничего сложного нет, все в документации описано.

Спасибо. Касса подключена к компу или по сети общение идет?
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782407
Близнец1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex ZhuravlevСпасибо. Касса подключена к компу или по сети общение идет?
К ПК по кабелю COM или USB.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782415
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Близнец1980арт2010,

Еще одна особенности ШТРИХа:
Хоть и ФИО кассира настраивается в самом аппарате в отдельном поле, но аппарат его берет из таблицы настроек паролей кассиров.
Что-бы аппарат выводил правильное ФИО кассира, а сделал так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
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;


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

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
          VarDevice.TagNumber := 1021;
          VarDevice.TagType := 7;
          VarDevice.TagValueStr := 'Неворишка М.Н.';
          VarDevice.FNSendTag;

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


Пароль - первого кассира, например, '1', то есть.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782418
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbБлизнец1980, а номер чека где берешь?

DocumentNumber не подходит?
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782433
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Близнец1980DmSerпропущено...

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

Вы опубликовали в качестве примера код крайне низкого качества. Но для небольшой компании возможно, что и сойдёт.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782594
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
V.Borzov, может и подходит, только я в справке нашел только по номеру регистра. надо попробовать
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782595
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,
а покажите тот же код высокого качества, пожалуйста (кусочек)
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782612
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbDmSer,
а покажите тот же код высокого качества, пожалуйста (кусочек)

У меня есть исходники работы с ККМ по протоколам Штрих, Атол, Дримкас, они работают безупречно, нет сомнения в их работоспособности, но публиковать их не буду, поскольку для этого нужно их сперва привести в соответствующий вид, который не будет вызывать нареканий, а это значительная работа.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782740
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbа покажите тот же код высокого качества, пожалуйста (кусочек)В идеале такой код подразумевает, что его сможет использовать другой программист для своей задачи с минимальной адаптацией. А сейчас это аццкая смесь бизнес-логики с UI, с отсутствием должной обработки ошибок, завязки на текстовые константы в коде, выбор неоптимальных языковых конструкций, отсутствие вменяемой архитектуры и спагетти в коде. В общем рефакторить и рефакторить. Плюс только один - это работает.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782762
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggercptngrbа покажите тот же код высокого качества, пожалуйста (кусочек)В идеале такой код подразумевает, что его сможет использовать другой программист для своей задачи с минимальной адаптацией. А сейчас это аццкая смесь бизнес-логики с UI, с отсутствием должной обработки ошибок, завязки на текстовые константы в коде, выбор неоптимальных языковых конструкций, отсутствие вменяемой архитектуры и спагетти в коде. В общем рефакторить и рефакторить. Плюс только один - это работает.
А человек и не претендует на мастер-класс по идеальному коду.
Есть рабочий код - он им поделился.
А добиваться идеальности - ему не требуется, вам - тоже не требуется. И остаются варианты - выложить что есть или не выложить ничего. Если выложить - то может быть он кому-то поможет, начать делать аналогичное. Или не делать так же плохо :)

Большинство коммерческих прикладух вот так и написано, и они работают. Да, не идеально, но и мир не идеален.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782768
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A: Покажи плиз код
B: на.
A: Спасибо!
C: Это не код, это полный ужас, это нельзя показывать, не говоря уже про использовать. Но свой, великолепный код, выполненный по всем правилам, писанным и неписанным, работающий идеально - я вам не покажу. Потому что он не идеальный.


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

А на хороший код бы посмотрел, как правильно нужно писать, я ведь самоучка. А то хаять могут а показать как надо - нет, или объяснить на примерах так не делай, а делай так и будет все по фен-шую.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782783
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r, )))
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782853
Alex Zhuravlev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Близнец1980, забей.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782957
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всего лишь вопрос профессионального развития. Развиваться или нет каждый решает сам. А граммотно оформленный код можно (и нужно) смотреть в коммерческих библиотеках коих полно в том числе на варезниках. Если человеку не указать на ошибки то возможно он их не осознает. Здесь типичный случай отсутствия команды - человек пишет код для себя, не задумываясь, что когда-нибудь кому-то придется разбираться и сопровождать это. Многие через это проходят. То что помог кому-то своим кодом - плюс. Код плохой - минус
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39782996
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerВсего лишь вопрос профессионального развития. Развиваться или нет каждый решает сам. А граммотно оформленный код можно (и нужно) смотреть в коммерческих библиотеках коих полно в том числе на варезниках. Если человеку не указать на ошибки то возможно он их не осознает. Здесь типичный случай отсутствия команды - человек пишет код для себя, не задумываясь, что когда-нибудь кому-то придется разбираться и сопровождать это. Многие через это проходят. То что помог кому-то своим кодом - плюс. Код плохой - минус
Вот не показатель... ковырялся в FR4, местами то еще болото.
Да и зачем лезть в варезник, когда в среднем хороший код в RTL? Разумеется, исключая некоторые индусские выверты
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783026
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2Вот не показатель... ковырялся в FR4, местами то еще болото.Всякое встречается, не отрицаю. Но в среднем по больнице, качество кода коммерческих библиотек гораздо выше "кода в интернете", про который у Gunsmoker-a написано
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783090
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger, человек ругает чужой код не говоря как надо. Это не конструктивно.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783120
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Близнец1980,

А с драйвеом 10 версии этот код работает?
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783132
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antox, работает с последней версией драйвера штриха

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



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
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;
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783134
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb,

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

С последней имеется в виду с 10.х ? А то хотят перейти с 8ки на 10ку
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783136
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antoxБлизнец1980,

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

Здесь про Штрих-М, а не про АТОЛ. И, к слову, про АТОЛ: я тыркнулся в 10 версию, хотел прокатить на халяву, узрев, что там тоже есть OLE-сервер, но напоролся на то, что переписывать практически каждую строчку придется, если до этого пользовались 6-8 версиями :) Так что писать всё заново под АТОЛ 10 .
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783147
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Придется писать... (
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783158
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
V.BorzovИ, к слову, про АТОЛ: я тыркнулся в 10 версию, хотел прокатить на халяву, узрев, что там тоже есть OLE-сервер, но напоролся на то, что переписывать практически каждую строчку придется, если до этого пользовались 6-8 версиями :) Так что писать всё заново под АТОЛ 10Не, ну чё, сходства есть.
И примеры хорошие для дельфей в доке.
Концептуальную разницу я одну заметил: ИНН оператора передается не при печати чека, а при регистрации кассира.
Я у себя сделал абстрактный класс и наследуюсь от него в зависимости от версии.
Типа TAtol и наследники TAtol8 или TAtol10.
Так вот функции классов TAtol8 и TAtol10 очень похожи, не только названием.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783235
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,
А я все драйверы касс выкинул на скрипты в фастрепорт, OLE-сервера там поддерживаются. В самой программе есть стандартный набор процедур, которые она вызывает в этом скрипте, и ей без разницы, что там стоит, а вся работа непосредственно с кассой зависит уже от установленного скрипта. Правда, из десятка когда-то освоенных драйверов реально работают сейчас только АТОЛ да ШТРИХ, а всякие там Меркурии что-то не попадались с тех пор, как ввели онлайн-кассы. Не говоря обо всяких там АМС :)
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783242
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbwhite_nigger, человек ругает чужой код не говоря как надо. Это не конструктивно.

Со мной в команде 3 года работал программист, он каким-то чудом выполнил тестовое задание, за это его взяли на работу. Так он примерно в таком же стиле писал. Я все три года старался его переучить, но тщетно (ему уж 40 лет, опыт работа на Delphi более 20 лет). Недавно его уволили за профнепригодность. Иногда такой его код "выстреливает" так, что плакать хочется. Недавно пришлось модуль на 2 тыс. строк кода переписать с нуля, поскольку он работал с ошибкой, а разобраться и исправить ошибку было нереально (я даже не думал, что так бывает).
После этого случая у меня автоматически возникают нехорошие ассоциации.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783264
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,
В 2 тысячах строк не смогли найти ошибку, оказалось проще переписать? Да ладно... Отмазка это, по-моему :) Были другие причины.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783265
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
V.BorzovDmSer,
В 2 тысячах строк не смогли найти ошибку, оказалось проще переписать? Да ладно... Отмазка это, по-моему :) Были другие причины.

По факту там ошибка была в каждой второй строке. Каким-то чудом до поры до времени этот код работал, потом перестал.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783332
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,
поэтому и хочется, чтобы носом тыкнули и написали, что так и так писать не надо, а то будет бо-бо
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783594
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb,
Да они хотят просто стырить твой код как есть, чтобы не заморачиваться и не переделывать, и чтобы всё разжевано было, и чтобы работало, и без ошибок. Ан-нет, придется потрудиться. Вот и расстроились.... )))
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783784
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbDmSer,
поэтому и хочется, чтобы носом тыкнули и написали, что так и так писать не надо, а то будет бо-бо

О проблемах в критикуемом мною примере кода уже написал white_nigger. Я бы еще добавил, что работа с ФР ведется в основном потоке, поэтому если ФР подвиснет с ответом, то и у пользователя программа будет висеть в статусе "не отвечает".
А вообще обычно почти любые примеры работы со штрихом можно подсмотреть в исходниках теста драйвера.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783825
MikeDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerЯ бы еще добавил, что работа с ФР ведется в основном потоке, поэтому если ФР подвиснет с ответом, то и у пользователя программа будет висеть в статусе "не отвечает".
И что? Все равно пока ФР не заработает кассиру делать нечего.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783832
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это смотря какой функционал в программу заложен. В идеале да, программа кассира не должна делать ничего лишнего, управление всем остальным должно быть организовано в отдельных сервисах. Но все ли так делают?
Проблема не отвечающей программы в том, что кассир пытается нажимать, получается не то, что он планирует, хуже того, иногда модальные окна на задний план улетают, иногда исчезает модальность и пользователь может закрыть нижележащее окно.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783851
MikeDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer, да какой бы функционал не был заложен - обязанность кассира обслужить клиента и выдать чек. И до тех пор пока от ФР не получено подтверждение об успехе операции либо ошибка - кассовое ПО не должно реагировать на действия юзера от слова совсем.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783853
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDD,

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

Короче,- КИРДЫК
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783859
MikeDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gator, очень интересно. У нас что уже разрешили торговать без применения ККТ?
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783861
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gator,
Нет, ну разве только если распараллелить процедуры печати чека и сохранения продажи в базе данных, какие еще преимущества от вывода печати в отдельный поток с точки зрения уменьшения размера очереди могут быть?
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783871
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDDGator, очень интересно. У нас что уже разрешили торговать без применения ККТ?
Нет конечно. Но когда "не работает" и спешат - торгуют за нал и без чеков. Это жизнь! А вся это обеспечение расчётов через ККМ - мертвечина мёртвая.
imho
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783872
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
V.Borzov,

Ничего ты не распараллелишь. В любой момент может канал распахать пьяный тракторист или пролететь дрон тупого дитяти.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783919
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDDDmSer, да какой бы функционал не был заложен - обязанность кассира обслужить клиента и выдать чек. И до тех пор пока от ФР не получено подтверждение об успехе операции либо ошибка - кассовое ПО не должно реагировать на действия юзера от слова совсем.

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

Что в это время должен видеть на экране кассир?
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783929
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стасус выпоонения всех этих действий.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783949
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatСтасус выпоонения всех этих действий.

С помощью каких средств Вы предлагаете отображать статус операций в условиях блокировки основного потока? Я хочу при этом в программе видеть индикацию доительности операции.
Пару средств я знаю. Одно из них мой TProgressViewer, но у него проблема со скачущим фокусом и он не помешает кассиру тыкнуть на повисшую форму и словить какой-нибудь глюк с подачи ОС.
Вопрос очень актуальный для меня на самом деле.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783957
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не блокировать основной поток - не вариант?
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39783968
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDDGator, очень интересно. У нас что уже разрешили торговать без применения ККТ?Печатать чек синхронно с главным потоком - согласен. Любыми остальными командами к кассе совсем не обязательно тормозить главный поток.
А еще бывают, представьте, варианты, когда кассира и АРМ два (второй чз сеть работает через первого), а касса - одна между ними. Так вот опять же, тормозить при чеке обязан только один из них.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784003
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatНе блокировать основной поток - не вариант?

Это вариант, который я как раз поддерживаю. Но обсуждается вариант с блокировкой.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784015
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто делал под atol 10й драйвер, скиньте примеры, если не жалко... )
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784092
MikeDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerЕсли при отпуске товара всё выполнять в основном потоке, то программа превращается в неповоротливого урода:
У меня почему-то не превращается.
DmSer1. Выполняем запросы к базе данных (время операции непредсказуемо)
Да ладно? Тут либо твоя БД находится за сотни километров от РМ кассира (неоднозначное решение между прочим) либо нужно руки оторвать программисту.
DmSer2. Обращаемся к дисконтной системе (время операции непредсказуемо)
Тоже самое. А п.2 зависит от п.1 т.к. не сформировав полностью чек скидку на него ты не сделаешь. Эти операции не распараллеливаются.
DmSer3. Выполняем операцию с банковской картой (время операции непредсказуемо)
Ты не сможешь инициировать снятие денег с карты не выполнив п.1 и п.2. И пока ты не получишь подтверждения от банка ты не сможешь напечатать чек.
DmSer4. Бьём чек (время операции непредсказуемо и чем больше позиций, тем дольше будет висеть интерфейс).
Кассир в любом случае должен дождаться пока ФР не завершит свою работу успехом либо ошибкой. Кстати ему еще нужно получить деньги и выдать сдачу если расчет за нал.

Ни в одном магазине ни разу в жизни не видел чтобы начинали обслуживать следующего клиента не завершив обслуживание предыдущего.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784093
MikeDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockА еще бывают, представьте, варианты, когда кассира и АРМ два (второй чз сеть работает через первого), а касса - одна между ними. Так вот опять же, тормозить при чеке обязан только один из них.
Было такое, но это редкость. Сейчас все это решается установкой ФР с сетевым интерфейсом.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784106
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antoxКто делал под atol 10й драйвер, скиньте примеры, если не жалко... )Прекрасные примеры внутри официальной документации.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784107
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDDНи в одном магазине ни разу в жизни не видел чтобы начинали обслуживать следующего клиента не завершив обслуживание предыдущего.Во всех супермаркетах Украины давно так.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784108
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDDКассир в любом случае должен дождаться пока ФР не завершит свою работу успехом либо ошибкой.Он и дожидается, пока сканирует товары следующего клиента.

MikeDDКстати ему еще нужно получить деньги и выдать сдачу если расчет за нал.Все это делается перед нажатием на кнопку "Чек".
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784109
MikeDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockMikeDDКассир в любом случае должен дождаться пока ФР не завершит свою работу успехом либо ошибкой.Он и дожидается, пока сканирует товары следующего клиента.
А что он будет делать если ФР сказал до скорого и махнул рукой? Предыдущий клиент ушел без чека, а продолжить работу кассир все равно не сможет и все что он отсканировал придется грохнуть и послать клиента на другую кассу. И нафига все это?
YuRockMikeDDКстати ему еще нужно получить деньги и выдать сдачу если расчет за нал.Все это делается перед нажатием на кнопку "Чек".
1. берем деньги от клиента
2. инициируем печать чека
3. пока печатается чек - выдаем сдачу.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784110
MikeDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockMikeDDНи в одном магазине ни разу в жизни не видел чтобы начинали обслуживать следующего клиента не завершив обслуживание предыдущего.Во всех супермаркетах Украины давно так.
Очень интересно. А сколько проходит времени между инициированием печати чека и получением от ФР ответа?
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784112
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDDТоже самое. А п.2 зависит от п.1 т.к. не сформировав полностью чек скидку на него ты не сделаешь. Эти операции не распараллеливаются.

Я нигде про распараллеливание не говорил. Мы с Вами про разные вещи говорим.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784114
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDDYuRockпропущено...
Во всех супермаркетах Украины давно так.
Очень интересно. А сколько проходит времени между инициированием печати чека и получением от ФР ответа?В зависимости от формы оплаты. По наличке - секунды, по карте - может и больше минуты быть, от терминала зависит, но в любом случае достаточно долго.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784115
MikeDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerMikeDDТоже самое. А п.2 зависит от п.1 т.к. не сформировав полностью чек скидку на него ты не сделаешь. Эти операции не распараллеливаются.

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

Видимо я что-то не понимаю. Какой смысл городить расчет скидки в отдельном потоке? Пока считается скидка что можно сделать? Добавить позицию? Нет, т.к. скидку придется пересчитывать. Инициировать оплату картой или печать чека? Нет, т.к. неизвестна итоговая сумма.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784116
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDDА что он будет делать если ФР сказал до скорого и махнул рукой? Предыдущий клиент ушел без чека, а продолжить работу кассир все равно не сможет и все что он отсканировал придется грохнуть и послать клиента на другую кассу.Значит клиенту не нужен чек, раз ушел. Я всегда ухожу. Клиента не волнует, что в этом случае будет делать кассир, он заплатил и ушел.

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

Заметь, это редчайший форсмажорный случай. Но и он не приводит ни к чему плохому.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784118
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDDYuRockпропущено...
Все это делается перед нажатием на кнопку "Чек".
1. берем деньги от клиента
2. инициируем печать чека
3. пока печатается чек - выдаем сдачу.Пока клиент считает наличку, кстати, тоже уже идет обслуживание следующего.
Как насчитал - кассир "возвращается", считает деньги, выдает сдачу, нажимает "Чек" и говорит до свидания, и опять возвращается к следующему.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784119
MikeDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockMikeDDпропущено...

Очень интересно. А сколько проходит времени между инициированием печати чека и получением от ФР ответа?В зависимости от формы оплаты. По наличке - секунды, по карте - может и больше минуты быть, от терминала зависит, но в любом случае достаточно долго.
Ни разу не видел чтобы после набора пина/прикладывания карты проходило больше нескольких секунд. А если на карте недостаточно средств то все равно придется разбираться с предыдущим клиентом. Нет смысла начинать работу со следующим клиентом не закончив работу с предыдущим.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784121
MikeDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockMikeDDпропущено...

1. берем деньги от клиента
2. инициируем печать чека
3. пока печатается чек - выдаем сдачу.Пока клиент считает наличку, кстати, тоже уже идет обслуживание следующего.
Как насчитал - кассир "возвращается", считает деньги, выдает сдачу, нажимает "Чек" и говорит до свидания, и опять возвращается к следующему.
Бред какой-то. Клиенту считать особо нечего, ему называют итоговую сумму - он дает либо сумму превышающую сумму покупки либо если хочет избавиться от мелочи - вообще без сдачи либо чтобы сдача была бумажками а не мелочью. Следующего клиента до расчета с предыдущим не обслуживают.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784124
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDD
Видимо я что-то не понимаю. Какой смысл городить расчет скидки в отдельном потоке? Пока считается скидка что можно сделать?

Пока выполняются эти операции кассиру ничего не нужно делать. Я лишь против того, чтобы вешать основной поток программы. Мы, например, обращение к торговому оборудованию выносим в доп. поток, а в момент обращения открываем в главном потоке модальную форму, которую кассир закрыть не может. В этой форме можем выводить любую дополнительную информацию.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784127
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDDНи разу не видел чтобы после набора пина/прикладывания карты проходило больше нескольких секунд.Ты извини, но я так понял, что ты еще много чего ни разу не видел.

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

MikeDDНет смысла начинать работу со следующим клиентом не закончив работу с предыдущим.Смысл огромен - быстрее идет очередь. Клиенты экономят время, магазины экономят на кол-ве касс, что также выражается в кол-ве лицензий на алкоголь и табак.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784128
MikeDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerMikeDDВидимо я что-то не понимаю. Какой смысл городить расчет скидки в отдельном потоке? Пока считается скидка что можно сделать?

Пока выполняются эти операции кассиру ничего не нужно делать. Я лишь против того, чтобы вешать основной поток программы. Мы, например, обращение к торговому оборудованию выносим в доп. поток, а в момент обращения открываем в главном потоке модальную форму, которую кассир закрыть не может. В этой форме можем выводить любую дополнительную информацию.
Дополнительную инфу о чем? Работа с этим клиентом де-факто уже закончена, раскрутить на доппродажу зачитав с экрана инфу от товаре дне или что там еще у вас есть вы его уже не сможете т.к. он уже оплатил свою покупку. Это нужно было делать ДО закрытия чека. В чем смысл городить весь этот огород?
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784129
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDDСледующего клиента до расчета с предыдущим не обслуживают.В мечтах.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784130
MikeDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockMikeDDНи разу не видел чтобы после набора пина/прикладывания карты проходило больше нескольких секунд.Ты извини, но я так понял, что ты еще много чего ни разу не видел.
И слава Богу, что у нас нет такого гемора от слова вообще.

YuRockMikeDDНет смысла начинать работу со следующим клиентом не закончив работу с предыдущим.Смысл огромен - быстрее идет очередь. Клиенты экономят время, магазины экономят на кол-ве касс, что также выражается в кол-ве лицензий на алкоголь и табак. У нас лицензируется сама торговая точка а не количество касс.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784131
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDDВ чем смысл городить весь этот огород?Чтобы удовлетворить требования заказчика (владельца магазина), который хочет, например, показывать в это время рекламу, которую оператор должен прочесть клиенту.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784132
MikeDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockMikeDDСледующего клиента до расчета с предыдущим не обслуживают.В мечтах. Добро пожаловать в Россию.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784133
MikeDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockMikeDDВ чем смысл городить весь этот огород?Чтобы удовлетворить требования заказчика (владельца магазина), который хочет, например, показывать в это время рекламу, которую оператор должен прочесть клиенту. У нас требуют зачитывать рекламу ДО закрытия чека.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784135
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockЗначит клиенту не нужен чек, раз ушел. Я всегда ухожу. Клиента не волнует, что в этом случае будет делать кассир, он заплатил и ушел.
Видимо, вам никогда не приходилось возвращать скоропортящийся товар.
Счастливчик
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784137
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDDYuRockпропущено...
Ты извини, но я так понял, что ты еще много чего ни разу не видел.
И слава Богу, что у нас нет такого гемора от слова вообще.Это не у вас гемора нет, это просто лично твоя программа не может по другому.


MikeDDУ нас лицензируется сама торговая точка а не количество касс.Это не отменяет остальной, немалой экономии на кол-ве касс.
Хотя главное, конечно, это время клиентов.
У нас без наличия касс самообслуживания, например, магазин считается говномагазином и туда мало кто ходит.
И именно это время кассир экономит, обслуживая одновременно двоих (тех, кто не пошел на кассу самообслуживания, их все же большинство пока).
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784140
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDDYuRockпропущено...
Чтобы удовлетворить требования заказчика (владельца магазина), который хочет, например, показывать в это время рекламу, которую оператор должен прочесть клиенту. У нас требуют зачитывать рекламу ДО закрытия чека.Тебя послушать, так можно подумать, что "у вас" делается всё, чтобы очереди были как можно длиннее и тянулись как можно дольше, чтобы в итоге это привело к тому, что клиентов в сутки магазин обслуживал как можно меньше и товаров продавал, соответственно, тоже как можно меньше.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784141
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDDYuRockпропущено...
В мечтах. Добро пожаловать в Россию.Мой АРМ работает и в России тоже (иначе нафиг бы мне подпрыгнул АТОЛ-10), и в нем поддерживается и постоянно используется одновременное обслуживание нескольких клиентов.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784144
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747YuRockЗначит клиенту не нужен чек, раз ушел. Я всегда ухожу. Клиента не волнует, что в этом случае будет делать кассир, он заплатил и ушел.
Видимо, вам никогда не приходилось возвращать скоропортящийся товар.
СчастливчикНу да, не приходилось.
Два раза в жизни я покупал протухшие яйца, но даже если бы у меня был чек, я все равно не пошел бы возвращать их из-за 10 гривен.
А на дату молочки я всегда смотрю.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784145
MikeDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockMikeDDпропущено...
Добро пожаловать в Россию.Мой АРМ работает и в России тоже (иначе нафиг бы мне подпрыгнул АТОЛ-10), и в нем поддерживается и постоянно используется одновременное обслуживание нескольких клиентов.
Интересно где? Пятерочка, Магнит, Лента, Перекресток, Карусель, Полушка - нигде я не видел такого.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784150
MikeDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockMikeDDпропущено...
У нас требуют зачитывать рекламу ДО закрытия чека.Тебя послушать, так можно подумать, что "у вас" делается всё, чтобы очереди были как можно длиннее и тянулись как можно дольше, чтобы в итоге это привело к тому, что клиентов в сутки магазин обслуживал как можно меньше и товаров продавал, соответственно, тоже как можно меньше. Это тебе так кажется. У нас просто кассир не сидит минуты в ожидании пока ФР или банковский терминал разродится ответом. Все происходит достаточно быстро.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784154
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDDYuRockпропущено...
Мой АРМ работает и в России тоже (иначе нафиг бы мне подпрыгнул АТОЛ-10), и в нем поддерживается и постоянно используется одновременное обслуживание нескольких клиентов.
Интересно где? Пятерочка, Магнит, Лента, Перекресток, Карусель, Полушка - нигде я не видел такого.Нет, есть на некоторых автозаправочных комплексах. На каких - не скажу, сорри.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784155
MikeDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockMikeDDпропущено...

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

Не может потому что смысла в этом нет. Кстати я работаю не в продуктовом ритейле, у нас самообслуживания нет. Ну практически нет.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784156
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDDYuRockпропущено...
Тебя послушать, так можно подумать, что "у вас" делается всё, чтобы очереди были как можно длиннее и тянулись как можно дольше, чтобы в итоге это привело к тому, что клиентов в сутки магазин обслуживал как можно меньше и товаров продавал, соответственно, тоже как можно меньше. Это тебе так кажется. У нас просто кассир не сидит минуты в ожидании пока ФР или банковский терминал разродится ответом. Все происходит достаточно быстро.Угу. Кассир у вас заставляет бабушку в течении секунды пинкод вспомнить и ввести.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784158
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDDYuRockпропущено...
Это не у вас гемора нет, это просто лично твоя программа не может по другому.

Не может потому что смысла в этом нет. Кстати я работаю не в продуктовом ритейле, у нас самообслуживания нет. Ну практически нет.Ну да, конечно, смысла нет.
А в Украине на такую схему все перешли, конечно же, только потому, что сами себе враги.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784160
MikeDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockMikeDDпропущено...
Это тебе так кажется. У нас просто кассир не сидит минуты в ожидании пока ФР или банковский терминал разродится ответом. Все происходит достаточно быстро.Угу. Кассир у вас заставляет бабушку в течении секунды пинкод вспомнить и ввести.
Почему сразу бабушка? Ну я пару раз тупил и путал пинконд от одной карты и пытался его вбить для другой карты. Ничего страшного не случилось. У нас в супермаркетах обычная ситуация когда из десятка касс работают 2-3, и когда накапливается очередь больше нескольких человек просто открываются другие кассы и очередь рассасывается.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784162
MikeDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockMikeDDпропущено...


Не может потому что смысла в этом нет. Кстати я работаю не в продуктовом ритейле, у нас самообслуживания нет. Ну практически нет.Ну да, конечно, смысла нет.
А в Украине на такую схему все перешли, конечно же, только потому, что сами себе враги.
Да переходите куда хотите. Но это не значит что ваш путь единственно правильный а все кто не делает также - враги народа.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784168
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDDДополнительную инфу о чем?

Например, терминал самообслуживания может вывести клиенту строки "вставьте карту", "введите пин-код", "извлеките карту" и любой другой текст, который предоставляет библиотека эквайринга.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784176
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDDYuRockпропущено...
Ну да, конечно, смысла нет.
А в Украине на такую схему все перешли, конечно же, только потому, что сами себе враги.
Да переходите куда хотите. Но это не значит что ваш путь единственно правильный а все кто не делает также - враги народа.Единственно верным есть тот путь, который повышает прибыль магазина.
А она зависит от скорости обслуживания и кол-ва касс.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784177
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDDYuRockУгу. Кассир у вас заставляет бабушку в течении секунды пинкод вспомнить и ввести.
Почему сразу бабушка? Ну я пару раз тупил и путал пинконд от одной карты и пытался его вбить для другой карты. Ничего страшного не случилось.Ну вот. А за это время кассир мог бы, если б ПО позволяло, просканировать товары следующего клиента. И тоже ничего страшного не случилось бы.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784219
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockMikeDDпропущено...

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

Товары перемешиваются, потому что первый клиент вместо того, чтобы собрать свои покупки - возится с терминалом, а сверху уже летят товары следующего клиента. Несколько раз наблюдал скандалы из-за этого. Поэтому чаще всего кассиры, даже есть есть возможность пробивать следующую покупку - подождут.
Магазин может хотеть ускорения работы - это понятно, но еще больше он хочет отсутствия скандалов.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784226
MikeDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockMikeDDпропущено...

Почему сразу бабушка? Ну я пару раз тупил и путал пинконд от одной карты и пытался его вбить для другой карты. Ничего страшного не случилось.Ну вот. А за это время кассир мог бы, если б ПО позволяло, просканировать товары следующего клиента. И тоже ничего страшного не случилось бы.
От ситуации зависит. К примеру на карте не хватает средств - и вот кассиру приходится опять возвращаться к предыдущему клиенту, менять тип оплаты на смешанный если клиент добавляет недостающее налом либо удалять позиции. А следующий клиент в это время курит в сторонке хотя тихо мирно мог бы пойти на соседнюю освободившуюся кассу. И ради чего весь этот головняк? Чтобы возможно сэкономить пару минут из 12-часовой смены? Кстати пока клиент возится с пином кассир помогает собрать товар в пакеты и/или отсчитывает наклейки для покупки очередной шняги якобы со скидкой. Никто не сидит и не плюет в потолок.
Наличие/отсутствие очередей не является первостепенным конкурентным преимуществом. Ну не поеду я на другой конец города лишь бы не стоять в очереди из 2-3 человек. А вот за ценой и ассортиментом может быть и поеду, и даже в очереди постою. Впрочем от ПО это уже не зависит.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784232
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rа сверху уже летят товары следующего клиентаТакого не бывает никогда, ибо есть 2 отдельных бокса для разных клиентов, перегороженные
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784234
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDDЧтобы возможно сэкономить пару минут из 12-часовой смены?Кассиру? Ничего. Клиенту? Репутацию магазина.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784255
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockVizit0rа сверху уже летят товары следующего клиентаТакого не бывает никогда, ибо есть 2 отдельных бокса для разных клиентов, перегороженныеДалеко не везде. В Пятерочке близко от дома, где я часто покупаю продукты, так и бывает - предыдущий покупатель еще собирает свои покупки, а кассир уже с краю бокса подкладывает покупки следующего. Или например в Перекрестке в тц Калужский (Мск) то же самое. То есть - обычная ситуация.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784256
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62,
точнее, в таких случаях бывало так: где-то второго бокса, насколько помню, нет, а где-то он есть, но кассир им не всегда пользуется - м.б. не очень удобно и др., уж не знаю какие, причины.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39784264
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62В Пятерочке близко от дома, где я часто покупаю продукты, так и бывает - предыдущий покупатель еще собирает свои покупки, а кассир уже с краю бокса подкладывает покупки следующего.Ну уже норм. DD же меня убеждал, что у вас такое совсем не практикуется, вернее, он не видел.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39787255
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockantoxКто делал под atol 10й драйвер, скиньте примеры, если не жалко... )Прекрасные примеры внутри официальной документации.

Спасибо, посмотрю. А из приложения 64х с
10кой пробовали работать?
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39787263
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antoxYuRockпропущено...
Прекрасные примеры внутри официальной документации.

Спасибо, посмотрю. А из приложения 64х с
10кой пробовали работать?Нет, не пробовал.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39787627
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockVizit0rа сверху уже летят товары следующего клиентаТакого не бывает никогда, ибо есть 2 отдельных бокса для разных клиентов, перегороженные

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

Вы им многозадачность хотите - а для них два бокса перед глазами - уже запрещающе сложно
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39787762
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochYuRockпропущено...
Такого не бывает никогда, ибо есть 2 отдельных бокса для разных клиентов, перегороженные

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

Вы им многозадачность хотите - а для них два бокса перед глазами - уже запрещающе сложноЕсли б не пользовались - перемешивались бы товары клиентов. Пользуются, конечно.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39787769
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockЕсли б не пользовались - перемешивались бы товары клиентов. Пользуются, конечно.
Ой, ну вот точно не пользуются. Сгребаешь в корзину товар побыстрее, лишь бы не начали накидывать чужой тебе, и тут зависит от кассира: либо будет ждать, пока не сгребешь всё свое, либо пофиг ей, швыряет в ту же кучу, напрягая этим другого покупателя )))
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39787782
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

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

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

кассир все равно перекидывает "стенку" обратно и кидает в ближний, ей так проще, она по другoму не умеет
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #39787881
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochYuRock,

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

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

кассир все равно перекидывает "стенку" обратно и кидает в ближний, ей так проще, она по другoму не умеетПонятно, что бывают разные случаи. Но стараются, им лишние скандалы не нужны, и так работа нервная.
Я и сам стараюсь побыстрее свой товар собирать навсякий))
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Delphi + онлайн-кассы
    #40035672
dima1208
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем добрый день.
Пишу программу на delphi для работы с несколькими ФР.
Нужно получить список всех лог.устройств из драйвера, отобразить их и их свойства в таблице, и потом обращаться к нужному ЛУ по IP адресу.
Каким образом получить список ЛУ?
Как я понял EnumLD возвращает свойства активного ЛУ.

Если у кого-то есть пример готовый, поделитесь пожалуйста. Или ткните носом куда копать...

Заранее спасибо.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #40036367
Gdalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Близнец1980
cptngrbБлизнец1980, а номер чека где берешь?

Сам формирую, независимо от ККМ.
В других операциях (не продажа или возврат) беру из ККМ так:
Код: pascal
1.
2.
3.
4.
5.
       if KKM = 3 then //он-лайн
            begin
               FMain.DrvFR.FNGetCurrentSessionParams;
               FMain.FTJournNOPER.AsInteger := FMain.DrvFR.ReceiptNumber;
            end



Доброе время суток!
Огромное спасибо за Ваш код, я с ККТ столкнулся впервые, очень мне это помогло.
Есть вопросы:
1. У меня пример из установки драйвера (4.15). Там нет процедуры FNGetCurrentSessionParams, хотя в инструкции по программированию она есть ([Error] Main.pas(1922): Undeclared identifier: 'FNGetCurrentSessionParams'). Возможно, что Вы объект создаете сами (DrvFR:= CreateOleObject('AddIn.DrvFR');), а я использую юнит из примера?
2. "if KKM = 3 then //он-лайн": ККМ - это что? Как он задается и какие может принимать значения?
3. Вопрос по суммам. У нас возможно продавать подарочные сертификаты, потом ими оплачивать часть покупки либо полностью. Не придумал пока ничего путного, как это отразить в фискальнике и в ОФД соответственно. Все, что мне пришло в голову, это использовать Driver.DiscountOnCheck := CertifSumm, а вот дальше и возникает проблема. Driver.Summ1 - (наличные - сдача), Driver.Summ2 - безнал. Общая сумма по чеку будет Driver.Summ1 + Driver.Summ2 - Driver.DiscountOnCheck?
Заранее благодарю.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #40036370
Gdalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dima1208, есть несколько процедур:
GetCountLD - Метод возвращает в свойство LDCount количество логических устройств
GetFreeLDNumber - Метод возвращает в свойство LDNumber номер ближайшего свободного логического
устройства.

Зная количество ЛУ, использовать EnumLD(LDIndex)
Метод возвращает в свойства LDNumber, LDName, LDComNumber, LDBaudrate,
LDComputerName и LDTimeout параметры логического устройства с индексом из свойства LDIndex.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #40036373
Gdalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dima1208, можно еще воспользоваться процедурой FindDevice:
Memo.Lines.BeginUpdate;
try
Memo.Clear;
if Driver.FindDevice = 0 then
begin
Memo.Lines.Add(SDeviceFound);
Memo.Lines.Add(Format(SDeviceParams, [Driver.ComNumber,
IntToBaudRate(Driver.BaudRate)]))
end else
Memo.Lines.Add(SDeviceNotFound);
finally
Memo.Lines.EndUpdate;
end;
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #40036698
dima1208
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gdalex
dima1208, можно еще воспользоваться процедурой FindDevice:
Memo.Lines.BeginUpdate;
try
Memo.Clear;
if Driver.FindDevice = 0 then
begin
Memo.Lines.Add(SDeviceFound);
Memo.Lines.Add(Format(SDeviceParams, [Driver.ComNumber,
IntToBaudRate(Driver.BaudRate)]))
end else
Memo.Lines.Add(SDeviceNotFound);
finally
Memo.Lines.EndUpdate;
end;


Большое спасибо, буду пробовать.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #40037431
Близнец1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gdalex


Доброе время суток!
Огромное спасибо за Ваш код, я с ККТ столкнулся впервые, очень мне это помогло.
Есть вопросы:
1. У меня пример из установки драйвера (4.15). Там нет процедуры FNGetCurrentSessionParams, хотя в инструкции по программированию она есть ([Error] Main.pas(1922): Undeclared identifier: 'FNGetCurrentSessionParams'). Возможно, что Вы объект создаете сами (DrvFR:= CreateOleObject('AddIn.DrvFR');), а я использую юнит из примера?
2. "if KKM = 3 then //он-лайн": ККМ - это что? Как он задается и какие может принимать значения?
3. Вопрос по суммам. У нас возможно продавать подарочные сертификаты, потом ими оплачивать часть покупки либо полностью. Не придумал пока ничего путного, как это отразить в фискальнике и в ОФД соответственно. Все, что мне пришло в голову, это использовать Driver.DiscountOnCheck := CertifSumm, а вот дальше и возникает проблема. Driver.Summ1 - (наличные - сдача), Driver.Summ2 - безнал. Общая сумма по чеку будет Driver.Summ1 + Driver.Summ2 - Driver.DiscountOnCheck?
Заранее благодарю.

1. Да, объект создаю CreateOleObject('AddIn.DrvFR'), может и из-за этого. Касса с фискальным накопителем?
2. ККМ - переменная, тип кассы. В настройках программы указывается.
3. Я DiscountOnCheck не использую, но по описанию так и должно быть.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #40037671
Gdalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Близнец1980, спасибо за ответы!
Да, действительно, примеры из установки драйвера безбожно устарели, хотя сам драйвер последней версии. Если создавать объект, как это делаете Вы, то все текущие методы доступны. Правда теряется возможность выбора метода из списка (надо дописывать отсутствующие методы в юнит из примера), и невозможно в пошаговом режиме посмотреть значение переменных драйвера, не, не суть: сумма удовольствий всегда равна нулю! :-)
С подарочными сертификатами разобрался. Расскажу здесь, может кому-то сэкономит пару-тройку бессонных ночей.
В ККТ есть 16 типов оплат (таблица 5). Тип 1 - неизменный. Только наличные. А дальше кого на что фантазия подвигнет. Типы 14-16 в ОФД не передаются и в итогах закрытия смены идут отдельно от всех, хоть и увеличивают общую выручку.
Я тип 16 обозвал "Подарочные сертификаты". При продаже сертификата клиенту оплата идет как за обычное изделие: хоть наличными, хоть безналичными. Даже другим сертификатом в принципе можно. А при продаже изделия, если клиент использовал сертификат, его номинал заношу в 16 тип оплаты. И вот тут начинается вся магия: если сумма сертификата больше итоговой суммы чека, то сдача не выдается, если не хватает суммы сертификата, то клиент может доплатить хоть налом, хоть безналом, хоть и тем и другим сразу. И в случае, если есть наличные и итоговая сумма меньше, то и сдача сама считается!
Во вложении образец чека с сертификатом (красная полоса рядом с типами оплаты). Единственный вопрос: есть ли возможность получить значение "ФН" (синим обвел) - это номер документа в фискальном накопителе. Пробовал так:
Код: pascal
1.
2.
Driver.FNGetCurrentSessionParams;
Result := Driver.ReceiptNumber;


Но, получил номер следующего чека (в строке "Смена: 3 Чек: 12"). А нужен именно уникальный номер в фискальнике.
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #40037750
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gdalex,

рекомендую сделать поиск в доке по словосочетанию "номер документа"
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #40037759
Близнец1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gdalex,

после
FNCloseCheckEx
или других методов с ФН типа FNBuildCalculationStateReport
DocumentNumber - Номер фискального документа

проверьте, вроде оно
...
Рейтинг: 0 / 0
Delphi + онлайн-кассы
    #40037777
Gdalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Близнец1980, да, это именно оно. Я на минут 10 раньше Вашего ответа нашел в инструкции эту функцию. Еще раз огромное Вам спасибо!
...
Рейтинг: 0 / 0
125 сообщений из 125, показаны все 5 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi + онлайн-кассы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]