Имя: Пароль:
IT
Админ
Фискальный принтер
0 247tsm
 
17.06.13
16:53
Добрый день,
Начальник поставил задачу подключить фискальный принтер Datecs FP550 к 1с8.1 и 1с7.7, но используя не драйвер работы с текстовым файлом, а используя COM-объекты. С сайта Datecs.bg я скачал COM server FP3530. Установил его, но не знаю, как к нему обратиться из 1С.
На команду СоздатьОбъект("FP3530") ругается "Неудачная попытка создания объекта". Перепробовал разные варианты:        FiscalPrinter=СоздатьОбъект("FP3530.FiscalPrinter");
FiscalPrinter=СоздатьОбъект("FP3530");
FiscalPrinter=СоздатьОбъект("FP3530_COM_Server");
FiscalPrinter=СоздатьОбъект("FP3530.DatecsFP550");
Но во всех одна и та же ошибка  "Неудачная попытка создания объекта".
В Help com-сервера даны только методы для вызова тех или иных функций фискального принтера. Но до методов нужно же "сказать 1С", с чем она должна работать, т.е. создать объект. Может я не прав. Подскажите.
Спасибо.
1 247tsm
 
17.06.13
17:24
Неужели никто не может что-то сказать по теме?
2 IVT_2009
 
17.06.13
17:28
поиск в гугле говорит что в комплекте есть пример на дельфи. Строку инициализации глядите там
3 oreshka7387
 
17.06.13
17:29
а обработки обслуживания торгового оборудования нету? тебе её самому написать надо?
4 IVT_2009
 
17.06.13
17:30
судя по коду это 77 , там обработка обслуживания не катит
5 oreshka7387
 
17.06.13
17:30
так ему на 8 же надо
6 IVT_2009
 
17.06.13
17:33
если вы правильно пишете строку инициализации в создатьОбъект то попробуйте dll файлы принудительно зарегистрировать в системе командой regsvr32
7 stix2010
 
17.06.13
17:37
драйвера Артсофт будут стоить дешевле времени потраченного Вами на разработку своего лисапета: http://www.artsoft.ua/1C+ekkr.php
8 247tsm
 
17.06.13
17:45
(6) там нет DLL. Там exe-модуль, который запускает этот COM-сервер. Он висит в трее. Мне нужно из 1С управлять фискальным принтером через этот сервер. Но как в 1С обратиться к этому серверу я не знаю, т.е. мне не известно, какое имя указать в СоздатьОбъект. В процессах компа есть процесс FP3530.EXE. Мне проще проверить в 1С7.7, а потом сделаю и в 8.1
9 247tsm
 
17.06.13
18:14
(2) просмотрел примеры на дельфи, но не смог определить, как подключиться.
10 SherifSP
 
17.06.13
18:37
(9) Компоненту зарегистрировал?
11 247tsm
 
17.06.13
19:34
(9) Как зарегистрировать? Это COM-объект. С помощью regsrv не регистрируется, не может найти точку входа.
12 247tsm
 
17.06.13
19:35
(10) Как зарегистрировать? Это COM-объект. С помощью regsrv не регистрируется, не может найти точку входа.
13 Славен
 
17.06.13
19:37
нам бы хоть примеры на дэлфи показал
14 247tsm
 
18.06.13
10:17
Вот текст на дельфи:

unit uMainForm;

interface

uses
   Windows,
   Messages,
   SysUtils,
   Variants,
   Classes,
   Graphics,
   Controls,
   Forms,
   Dialogs,
   ComCtrls,
   FP3530_TLB,
   StdCtrls, Buttons, ExtCtrls, AppEvnts;

const
   cNewLine = #13#10;
   MY_CAPTION = 'COM Server - Example';

type
   TDatecsFDevice = (
               dt_Unknown,
               dt_DP500PLUS_KL,
               dt_DP55_KL,
               dt_MP55_KL,
               dt_DP_50_KL,
               dt_FP_1000_KL,
               dt_FP_550_KL,
               dt_FMP10_KL,
               dt_FP60_KL,
               dt_FP1000_DV,
               dt_FP300_DV,
               dt_FP550_DV,
               dt_FP60_DV,
               dt_FP2000_KL,
               dt_FP_550D_KL
           );

   TfmMainForm = class(
       TForm)
       PageControl1: TPageControl;
       tsInit: TTabSheet;
   ts_DEVICE_STATUS: TTabSheet;
   btn_INIT_EX1: TButton;
       lb_COMPORT: TLabel;
       lb_Baudrate: TLabel;
       cbx_Baudrate: TComboBox;
       cbx_COMPORT: TComboBox;
   GroupBox13: TGroupBox;
   chbx_S0_7: TCheckBox;
   chbx_S0_6: TCheckBox;
   chbx_S0_5: TCheckBox;
   chbx_S0_4: TCheckBox;
   chbx_S0_3: TCheckBox;
   chbx_S0_2: TCheckBox;
   chbx_S0_1: TCheckBox;
   chbx_S0_0: TCheckBox;
   GroupBox15: TGroupBox;
   chbx_S3_7: TCheckBox;
   chbx_S3_6: TCheckBox;
   chbx_S3_5: TCheckBox;
   chbx_S3_4: TCheckBox;
   chbx_S3_3: TCheckBox;
   chbx_S3_2: TCheckBox;
   chbx_S3_1: TCheckBox;
   chbx_S3_0: TCheckBox;
   GroupBox21: TGroupBox;
   chbx_S1_7: TCheckBox;
   chbx_S1_6: TCheckBox;
   chbx_S1_5: TCheckBox;
   chbx_S1_4: TCheckBox;
   chbx_S1_3: TCheckBox;
   chbx_S1_2: TCheckBox;
   chbx_S1_1: TCheckBox;
   chbx_S1_0: TCheckBox;
   GroupBox22: TGroupBox;
   chbx_S4_7: TCheckBox;
   chbx_S4_6: TCheckBox;
   chbx_S4_5: TCheckBox;
   chbx_S4_4: TCheckBox;
   chbx_S4_3: TCheckBox;
   chbx_S4_2: TCheckBox;
   chbx_S4_1: TCheckBox;
   chbx_S4_0: TCheckBox;
   GroupBox23: TGroupBox;
   chbx_S2_7: TCheckBox;
   chbx_S2_6: TCheckBox;
   chbx_S2_5: TCheckBox;
   chbx_S2_4: TCheckBox;
   chbx_S2_3: TCheckBox;
   chbx_S2_2: TCheckBox;
   chbx_S2_1: TCheckBox;
   chbx_S2_0: TCheckBox;
   GroupBox24: TGroupBox;
   chbx_S5_7: TCheckBox;
   chbx_S5_6: TCheckBox;
   chbx_S5_5: TCheckBox;
   chbx_S5_4: TCheckBox;
   chbx_S5_3: TCheckBox;
   chbx_S5_2: TCheckBox;
   chbx_S5_1: TCheckBox;
   chbx_S5_0: TCheckBox;
   cbx_TRGT_METHOD: TComboBox;
   btn_EXECUTE_THIS: TBitBtn;
   Label1: TLabel;
   Panel1: TPanel;
   mem_LOG: TMemo;
   ApplicationEvents1: TApplicationEvents;
   Label2: TLabel;
   cbx_PrinterModel: TComboBox;
   lb_IPADDR: TLabel;
   ed_IPADDR: TEdit;
   lb_PORT: TLabel;
   ed_PORT: TEdit;
       procedure btn_INIT_EX1Click(Sender: TObject);
       procedure FormCreate(Sender: TObject);
       procedure btn_EXECUTE_THISClick(Sender: TObject);
   procedure ApplicationEvents1SettingChange(Sender: TObject;
     Flag: Integer; const Section: String; var Result: Integer);
   procedure cbx_PrinterModelChange(Sender: TObject);
   private
       TRANSTAT_MSG : String;
       FBON_OPENED,SBON_OPENED : Boolean;
       CURRENT_TENDER : WideString;
       LAST_AMOUNT : WideString;
       CURRENT_SALESCOUNT : WideString;

       function GET_COM_EX: TStringList;
       function CALC_COMNUM: Integer;
       function GetParam(src : WideString;INDX: Byte; MySep : Char = ';'): WideString;

       procedure SHOW_MYINFO(TRGT_MESSAGE : String);
       procedure SHOW_MYALERT(TRGT_MESSAGE : String);
       function SHOW_MYQUESTION (TRGT_QUESTION : string) : Integer;

       procedure ADD_LOG(TRGT_LOG : String);
       function GET_MY_DEVICE : TDatecsFDevice;

       //SAMPLES -BEGIN

       //ERROR HANDLING
       procedure ERROR_HANDLING;
       function CHECK_AND_RESOLVE : Boolean;
       function CAN_OPEN : Boolean;
       function EMERGENSY_SITUATION : Boolean;
       function FEMERGENSY_SITUATION : Boolean;
       function SEMERGENSY_SITUATION : Boolean;
       function CHECK_ASSIGNED : Boolean;
       function CALC_ERROR(TRGT_ERRCODE : Integer) : String;

       //STATUS OF THE FISCAL DEVICE
       procedure CALC_SWITCHES;
       procedure REFRESH_SWITCHES;
       procedure INIT_SWITCHES_EX(TRGT_LANG : Integer);

       //FISCAL TRANSACTIONS
       function OPEN_FISCAL_BON : Boolean;
       function SELL_SOMETHING : Boolean;
       function SELL_CMD_49(MAJOR_VERS,MINOR_VERS : Integer;MY_PARAMS : WideString):Boolean;
       function CMD_49_0(MINOR_VERS: Integer;MY_PARAMS: WideString): Integer;
       function CMD_49_1(MINOR_VERS: Integer;MY_PARAMS: WideString): Integer;
       function CMD_49_2(MINOR_VERS: Integer;MY_PARAMS: WideString): Integer;
       function CMD_49_3(MINOR_VERS: Integer;MY_PARAMS: WideString): Integer;
       function CMD_49_4(MINOR_VERS: Integer;MY_PARAMS: WideString): Integer;
       function CMD_49_5(MINOR_VERS: Integer;MY_PARAMS: WideString): Integer;
       function PRINT_DELIMITER : Boolean;
       function MAKE_SUBTOTAL(TRGT_PERCENT : Real) : Boolean;
       function MAKE_TOTAL : Boolean;
       function GET_LAST_DOCNUM : Boolean;
       function CLOSE_FISCAL_BON : Boolean;
       function PRINT_FISCAL_TEXT(TRGT_TEXT : WideString) : Boolean;
       function MAKE_FISCAL_TRANSACTION : Boolean;
       function CMD_70_0_0(Amount : WideString) : Integer;
       function CMD_88_0_0 : Boolean;



       //NONFISCAL TRANSACTIONS
       function OPEN_NONFISCAL : Boolean;
       function PRINT_NONFISCAL_TEXT(TRGT_TEXT : WideString) : Boolean;
       function CLOSE_NONFISCAL_BON : Boolean;
       function MAKE_NONFISCAL_TRANSACTION : Boolean;

       //REPORTS
       function ZX_REPORT(TRGT_OPTION : WideString) : Boolean;
       function ZXDEP_REPORT(TRGT_OPTION : WideString) : Boolean;

       //SAMPLES - END
   public
       MyFiscDevice : TDatecsFDevice;
       //...
       FPDP55_KL: ICS_BGR_DP55_KL;
       FP2000_KL : ICS_BGR_FP2000_KL;
       FP60_KL : ICS_BGR_FP60_KL;
       FP550_KL : ICS_BGR_FP550_KL;
       FP550D_KL : ICS_BGR_FP550_D_KL;
       //...
   end;

var
   fmMainForm  : TfmMainForm;



   tmp_Bol : Boolean;
   tmp_Str : string;
   tmp_Int : Integer;
   tmp_Ext : Extended;

   S0, S1, S2, S3, S4, S5: WideString;

implementation

{$R *.dfm}

function TfmMainForm.GetParam(src: WideString; INDX: Byte; MySep: Char): WideString;
var
   i, ParEnd: Byte;
   tmpS : WideString;
begin
   tmpS:=src;
   for i := 0 to INDX - 1 do
   begin
       ParEnd := pos(MySep, tmpS);
       if ParEnd = 0 then
       begin
           Result := '';
           Exit;
       end;
       Result := Copy(tmpS, 1, ParEnd - 1);
       Delete(tmpS, 1, ParEnd);
   end;
end;

function TfmMainForm.SHOW_MYQUESTION(TRGT_QUESTION: string): Integer;
begin
   Result:= MessageBox(fmMainForm.Handle,PChar(TRGT_QUESTION),PChar(MY_CAPTION),$124);
   ADD_LOG(tmp_Str);
end;

procedure TfmMainForm.SHOW_MYALERT(TRGT_MESSAGE: string);
begin
   MessageBox(fmMainForm.Handle,PChar(TRGT_MESSAGE),PChar(MY_CAPTION),$30);
   ADD_LOG(tmp_Str);
end;

procedure TfmMainForm.SHOW_MYINFO(TRGT_MESSAGE: String);
begin
   MessageBox(fmMainForm.Handle,PChar(TRGT_MESSAGE),PChar(MY_CAPTION),$40);
   ADD_LOG(tmp_Str);
end;


function TfmMainForm.GET_MY_DEVICE: TDatecsFDevice;
begin
   //Result:=dt_Unknown;
   try
       //GET FROM YOUR PROGRAM SETTINGS the type of used device
       //from registry or ini files or ...
       case cbx_PrinterModel.ItemIndex of
           0 : Result:=dt_DP55_KL;//for example
           1 : Result:=dt_FP2000_KL;
           2 : Result:=dt_FP2000_KL;
           3 : Result:=dt_FP60_KL;
           4 : Result:=dt_FP_550_KL;
           5 : Result:=dt_FP_550D_KL;
       end;
   except
       Result:=dt_Unknown;
   end;
end;

procedure TfmMainForm.btn_INIT_EX1Click(Sender: TObject);


   function INITIALISATION_OF_DEVICE_SITUATION : boolean;
   var
       NewInstanceCreated : boolean;
   begin
       NewInstanceCreated:=false;
       try
           MyFiscDevice := GET_MY_DEVICE;
           case MyFiscDevice of
               dt_DP500PLUS_KL,
               dt_DP55_KL,
               dt_MP55_KL,
               dt_DP_50_KL:
               begin
                   //CREATE INSTANCE OF ICS_BGR_DP55_KL

                   //written on Delphi this is something like:
                   if FPDP55_KL<>nil then FPDP55_KL:=nil;
                   FPDP55_KL := CoCS_BGR_DP55_KL.Create;
                   FPDP55_KL.INIT_Ex1(CALC_COMNUM, StrToInt(cbx_Baudrate.Text));
                   NewInstanceCreated:= (FPDP55_KL<>nil);
                   if NewInstanceCreated then
                   begin
                       fmMainForm.Caption:='Пример за употребата на "ICS_BGR_DP55_KL"';
                   end;
               end;
               dt_FP_1000_KL:
               begin
                   //CREATE INSTANCE OF ICS_BGR_FP1000_KL
               end;
               dt_FP_550_KL:
               begin
                   //CREATE INSTANCE OF ICS_BGR_FP550_KL

                   //written on Delphi this is something like:
                           if FP550_KL<>nil then FP550_KL:=nil;
                           FP550_KL := CoCS_BGR_FP550_KL.Create;
                           FP550_KL.INIT_EX3(                 //
                               CALC_COMNUM                ,//:
                               StrToInt(cbx_Baudrate.Text)    ,//:
                               3000                        ,//:ReadIntervalTimeout
                               0                        ,//:ReadTotalTimeoutMultiplier
                               3200                        ,//:ReadTotalTimeoutConstant
                               3000                        ,//:WriteTotalTimeoutMultiplier
                               3000                        ,//:WriteTotalTimeoutConstant
                               8                        ,//: REPEAT_COUNT
                               False                    ,//:MoreInstances
                               False                    ,//:WithInputCheck
                               True                        ,//:WithOutpCheck
                               True                        ,//:AlwaysGetOutput
                               True                        //:AutoCutText
                               );
                           NewInstanceCreated:= (FP550_KL<>nil);
                           if NewInstanceCreated then
                           begin
                               fmMainForm.Caption:='Пример за употребата на "ICS_BGR_FP550_KL"';
                           end;
               end;
               dt_FMP10_KL:
               begin
                   //CREATE INSTANCE OF ICS_BGR_FMP10_KL
               end;
               dt_FP1000_DV,
               dt_FP300_DV,
               dt_FP550_DV,
               dt_FP60_DV:
               begin
                   //CREATE INSTANCE OF ICSFP3530
               end;
               dt_FP60_KL:
               begin
                   //CREATE INSTANCE OF ICS...

                   //written on Delphi this is something like:
                           if FP60_KL<>nil then FP60_KL:=nil;
                           FP60_KL := CoCS_BGR_FP60_KL.Create;
                           FP60_KL.INIT_EX3(                 //
                               CALC_COMNUM                ,//:
                               StrToInt(cbx_Baudrate.Text)    ,//:
                               3000                        ,//:ReadIntervalTimeout
                               0                        ,//:ReadTotalTimeoutMultiplier
                               3200                        ,//:ReadTotalTimeoutConstant
                               3000                        ,//:WriteTotalTimeoutMultiplier
                               3000                        ,//:WriteTotalTimeoutConstant
                               8                        ,//: REPEAT_COUNT
                               False                    ,//:MoreInstances
                               False                    ,//:WithInputCheck
                               True                        ,//:WithOutpCheck
                               True                        ,//:AlwaysGetOutput
                               True                        //:AutoCutText
                               );
                           NewInstanceCreated:= (FP60_KL<>nil);
                           if NewInstanceCreated then
                           begin
                               fmMainForm.Caption:='Пример за употребата на "ICS_BGR_FP60_KL"';
                           end;

               end;
               dt_FP2000_KL:
               begin
                   //CREATE INSTANCE OF ICS...

                   //written on Delphi this is something like:
                   case cbx_PrinterModel.ItemIndex of
                       1:
                       begin
                           if FP2000_KL<>nil then FP2000_KL:=nil;
                           FP2000_KL := CoCS_BGR_FP2000_KL.Create;
                           //FP2000_KL.INIT_Ex1(CALC_COMNUM, StrToInt(cbx_Baudrate.Text));
                           FP2000_KL.INIT_EX3(                 //
                               CALC_COMNUM                ,//:
                               StrToInt(cbx_Baudrate.Text)    ,//:
                               3000                        ,//:ReadIntervalTimeout
                               0                        ,//:ReadTotalTimeoutMultiplier
                               3200                        ,//:ReadTotalTimeoutConstant
                               3000                        ,//:WriteTotalTimeoutMultiplier
                               3000                        ,//:WriteTotalTimeoutConstant
                               8                        ,//: REPEAT_COUNT
                               False                    ,//:MoreInstances
                               False                    ,//:WithInputCheck
                               True                        ,//:WithOutpCheck
                               True                        ,//:AlwaysGetOutput
                               True                        //:AutoCutText
                               );
                           NewInstanceCreated:= (FP2000_KL<>nil);
                           if NewInstanceCreated then
                           begin
                               fmMainForm.Caption:='Пример за употребата на "ICS_BGR_FP2000_KL"';
                           end;
                       end;
                       2:
                       begin
                           if FP2000_KL<>nil then FP2000_KL:=nil;
                           FP2000_KL := CoCS_BGR_FP2000_KL.Create;
                           tmp_Str:=FP2000_KL.INIT_Ex2(Trim(ed_IPADDR.Text),Trim(ed_PORT.Text));
                           NewInstanceCreated:= (FP2000_KL<>nil);
                           if NewInstanceCreated then
                           begin
                               fmMainForm.Caption:='Пример за употребата на "ICS_BGR_FP2000_KL"(TCP/IP)';
                               //ShowMessage(tmp_Str);
                           end;
                       end;
                   end;
               end;
               dt_FP_550D_KL:
               begin
                   //CREATE INSTANCE OF ICS_BGR_FP550_D_KL

                   //written on Delphi this is something like:
                           if FP550D_KL<>nil then FP550D_KL:=nil;
                           FP550D_KL := CoCS_BGR_FP550_D_KL.Create;
                           FP550D_KL.INIT_EX3(                 //
                               CALC_COMNUM                ,//:
                               StrToInt(cbx_Baudrate.Text)    ,//:
                               3000                        ,//:ReadIntervalTimeout
                               0                        ,//:ReadTotalTimeoutMultiplier
                               3200                        ,//:ReadTotalTimeoutConstant
                               3000                        ,//:WriteTotalTimeoutMultiplier
                               3000                        ,//:WriteTotalTimeoutConstant
                               8                        ,//: REPEAT_COUNT
                               False                    ,//:MoreInstances
                               False                    ,//:WithInputCheck
                               True                        ,//:WithOutpCheck
                               True                        ,//:AlwaysGetOutput
                               True                        //:AutoCutText
                               );
                           NewInstanceCreated:= (FP550D_KL<>nil);
                           if NewInstanceCreated then
                           begin
                               fmMainForm.Caption:='Пример за употребата на "ICS_BGR_FP550_KL"';
                           end;
               end;
           end;
           Result := (MyFiscDevice<>dt_Unknown) and (NewInstanceCreated);
       except
           Result := false;
       end;
   end;

   function CHECK_SOME_ : Boolean;
   begin
       Result:=False;
       try
           case cbx_PrinterModel.ItemIndex of
               -1 :
               begin
                   ShowMessage('Please set device model first !');
                   PageControl1.ActivePage:=tsInit;
                   if cbx_PrinterModel.Enabled then cbx_PrinterModel.SetFocus;
                   Exit;
               end;
               2 :
               begin
                   if cbx_PrinterModel.ItemIndex=2 then
                   begin
                       if (Trim(ed_IPADDR.Text)='') then
                       begin
                           ShowMessage('Please set ip address !');
                           PageControl1.ActivePage:=tsInit;
                           if ed_IPADDR.Enabled then ed_IPADDR.SetFocus;
                           Exit;
                       end;
                       if (Trim(ed_PORT.Text)='') then
                       begin
                           ShowMessage('Please set port number !');
                           PageControl1.ActivePage:=tsInit;
                           if ed_PORT.Enabled then ed_PORT.SetFocus;
                           Exit;
                       end;
                   end;
               end
               else
               begin
                   if cbx_COMPORT.ItemIndex =-1 then
                   begin
                       ShowMessage('Please set comport!');
                       PageControl1.ActivePage:=tsInit;
                       if cbx_COMPORT.Enabled then cbx_COMPORT.SetFocus;
                       Exit;
                   end;
               end;
           end;
           //...
           Result:=True;
       except
           Result:=False;
       end;
   end;


begin
   if not CHECK_SOME_ then Exit;
   try
       try
           INITIALISATION_OF_DEVICE_SITUATION;
       except
           ShowMessage('TfmMainForm.btn_INIT_EX1Click - Exception');
       end;
   finally
       INIT_SWITCHES_EX(0);
       fmMainForm.Update;
   end;
end;

procedure TfmMainForm.FormCreate(Sender: TObject);

   procedure ADD_COMPORTS;
   var
       i: Integer;
   begin
       try
           try
               cbx_COMPORT.Items.Clear;
               cbx_COMPORT.Items := Get_COM_EX;
           except
               //
           end;
       finally
           if cbx_COMPORT.Items.Count = 0 then
               for i := 1 to 28 do cbx_COMPORT.Items.Add('COM ' + IntToStr(i));
       end;
   end;

begin
   ADD_COMPORTS;

   DateSeparator := '.';
   TimeSeparator := ':';
   DecimalSeparator := '.';
   ShortDateFormat := 'dd.mm.yyyy';
   ShortTimeFormat := 'hh:mm:ss';
end;

function TfmMainForm.GET_COM_EX: TStringList;
var
   ComLst : TStringList;
   max, i : integer;
   tempStr:string;
   VerInfo: TOSVersioninfo;

   procedure EnumerateDosDevices(List: TStrings);
   var
       Buffer: pChar;
       BufLen: Cardinal;
       len   : Cardinal;
       p     : PChar;
       sl    : TStringlist;
   begin
       Assert(Assigned(List));
       BufLen := High(Word);
       Buffer := AllocMem(BufLen);
       try
           repeat
               len := QueryDosDevice(nil, Buffer, Buflen - 1);
               if len = ERROR_INSUFFICIENT_BUFFER then
               begin
                   BufLen := Buflen * 2;
                   ReAllocMem(Buffer, BufLen);
               end;
           until len <> ERROR_INSUFFICIENT_BUFFER;
           Buffer[Len]:= #0;
           sl := TStringlist.Create;
           try
               p := Buffer;
               while p <@Buffer[Len]do
               begin
                   sl.Add(p);
                   p := StrEnd(p)+ 1;
               end;
               sl.Sorted := true;
               List.Assign(sl);
           finally
               sl.Free;
           end; { finally }
       finally
           FreeMem(Buffer);
       end; { finally }
   end;

   function FillCommList(List: Tstrings): integer;
   var
       Temp    : TStringlist;
       i, index: Integer;
   begin
       try
           Assert(Assigned(List));
           List.Clear;
           Temp := TStringlist.Create;
           try
               EnumerateDosDevices(Temp);
               i := 1;
               while i < 256 do
               begin
                   if(Temp.Find('COM' + IntToStr(i), index))then
                   begin
                       List.Add('COM ' + IntToStr(i));
                   end;
                   inc(i);
               end;
           finally
               Temp.Free;
           end; { finally }
           Result := List.Count;

       except
           on E: Exception do raise Exception.Create('Exception in method "FillCommList":' + E.Message);
       end;

   end;

   function GET_WIN98_SERIAL(List: Tstrings): boolean;
   var
       i      : integer;
       portStr:String;
       portHND: THandle;
   begin
       Assert(Assigned(List));
       List.Clear;
       Result := false;
       try
           for i := 1 to 256 do
           begin
               portStr := Format('\\.\COM%d',[i]);
               portHND := CreateFile(PChar(portStr), GENERIC_READ or GENERIC_WRITE, 0,nil, OPEN_EXISTING, 0, 0);
               if portHND = INVALID_HANDLE_VALUE then
               begin
                   // Error := GetLastError;
                   // if (Error = ERROR_ACCESS_DENIED) or (Error = ERROR_ACCESS_DENIED)  then
                   // Result:=1;
                   CloseHandle(portHND);
               end
               else
               begin
                   Result := true;
                   CloseHandle(portHND);
                   List.Add('COM ' + inttostr(i));
               end;
           end;
       except
           Result := False;
       end;

   end;

begin
   ComLst := TStringList.Create;
   Result := TStringList.Create;
   try
       try
           // dm_.JvCIE_.OS.OSVersion
           VerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
           GetVersionEx(VerInfo);

           if(VerInfo.dwPlatformId = VER_PLATFORM_WIN32_NT)then
           begin
               max := FillCommList(ComLst);
               if max > 0 then
                   for i := 0 to max - 1 do
                   begin
                       tempStr := ComLst.Strings[i];
                       // Delete(tempStr, 1, 3);
                       Result.Add(tempStr);
                   end;
           end
           else GET_WIN98_SERIAL(Result);
       except
           on E: Exception do raise Exception.Create('Exception in method "Get_COM_EX":' + E.Message);
       end;
   finally
       ComLst.Free;
   end;
end;

procedure TfmMainForm.REFRESH_SWITCHES;
begin
   if not CHECK_ASSIGNED then Exit;
   try
       try
           ADD_LOG('[CMD_74_0_1]: ПОЛУЧАВАНЕ НА СТАТУСИТЕ');
           case MyFiscDevice of
               dt_DP55_KL:tmp_Int:=FPDP55_KL.CMD_74_0_1(S0, S1, S2, S3, S4, S5);
               dt_FP2000_KL:tmp_Int:=FP2000_KL.CMD_74_0_1(S0, S1, S2, S3, S4, S5);
               dt_FP60_KL:tmp_Int:=FP60_KL.CMD_74_0_1(S0, S1, S2, S3, S4, S5);
               dt_FP_550_KL:tmp_Int:=FP550_KL.CMD_74_0_1(S0, S1, S2, S3, S4, S5);
               dt_FP_550D_KL:tmp_Int:=FP550D_KL.CMD_74_0_1(S0, S1, S2, S3, S4, S5);
           end;

           if tmp_Int<>0 then
           begin
               //TODO : Exception handler
               ShowMessage('Get status error... Check connection!');
               tmp_Str:=CALC_ERROR(tmp_Int);
               ShowMessage(tmp_Str);
           end
           else CALC_SWITCHES;
       except
           //TODO : Exception handler
       end;
   finally
       fmMainForm.Update;
   end;
end;



function TfmMainForm.OPEN_FISCAL_BON: Boolean;
var
   AllReceipt,FiscReceipt,OpCode ,OpPwd,TillNmb : WideString;

   procedure INIT;
   begin
       AllReceipt:='';
       FiscReceipt:='';
   end;

   function SET_PARAMS_FROM_DB : Boolean;
   begin
       try
           //GET THIS FROM YOUR DATABASE
           case MyFiscDevice of
               dt_DP55_KL:
               begin
                   //This is default values for our ECR's
                   OpCode:='1';
                   OpPwd:='1';
                   TillNmb:='1';
               end;
               dt_FP2000_KL:
               begin
                   //This is default values for our printers
                   OpCode:='1';
                   OpPwd:='0000';
                   //OpPwd:='0001'; For error example
                   TillNmb:='1';
               end;
               dt_FP60_KL:
               begin
                   //This is default values for our printers
                   OpCode:='1';
                   OpPwd:='0000';
                   //OpPwd:='0001'; For error example
                   TillNmb:='1';
               end;
               dt_FP_550_KL:
               begin
                   //This is default values for our printers
                   OpCode:='1';
                   OpPwd:='0000';
                   //OpPwd:='0001'; For error example
                   TillNmb:='1';
               end;
               dt_FP_550D_KL:
               begin
                   //This is default values for our printers
                   OpCode:='1';
                   OpPwd:='0000';
                   //OpPwd:='0001'; For error example
                   TillNmb:='1';
               end;
           end;
           Result:=True;
       except
           Result:=False;
       end;
   end;

begin
   Result:=False;
   if not CHECK_ASSIGNED then Exit;
   try
       try
           INIT;
           if not SET_PARAMS_FROM_DB then Exit;
           ADD_LOG('[CMD_48_0_0]: ОТВАРЯНЕ НА СЛУЖЕБЕН БОН');
           case MyFiscDevice of
               dt_DP55_KL:tmp_Int:=FPDP55_KL.CMD_48_0_0(OpCode,OpPwd,TillNmb,AllReceipt,FiscReceipt);
               dt_FP2000_KL: tmp_Int:=FP2000_KL.CMD_48_0_0(OpCode,OpPwd,TillNmb,AllReceipt,FiscReceipt);
               dt_FP60_KL: tmp_Int:=FP60_KL.CMD_48_0_0(OpCode,OpPwd,TillNmb,AllReceipt,FiscReceipt);
               dt_FP_550_KL:tmp_Int:=FP550_KL.CMD_48_0_0(OpCode,OpPwd,TillNmb,AllReceipt,FiscReceipt);
               dt_FP_550D_KL:tmp_Int:=FP550D_KL.CMD_48_0_0(OpCode,OpPwd,TillNmb,AllReceipt,FiscReceipt);
           end;

           if tmp_Int<>0 then
           begin
               tmp_Str:=CALC_ERROR(tmp_Int);
               SHOW_MYALERT(tmp_Str);
               //1. Analize this...
               //2. status bytes or/and CMD_76_0_0
               //3. programatically do something or...
               //4. ...call of administrator
               //...
           end
           else Result:=True;
       except
           Result:=False;
       end;
   finally
       CALC_SWITCHES;
       fmMainForm.Update;
   end;
end;


function TfmMainForm.SELL_CMD_49(MAJOR_VERS, MINOR_VERS: Integer;MY_PARAMS: WideString): Boolean;
begin
   Result:=False;
   try
       case MAJOR_VERS of
           0 : tmp_Int := CMD_49_0(MINOR_VERS,MY_PARAMS);
           1 : tmp_Int := CMD_49_1(MINOR_VERS,MY_PARAMS);
           2 : tmp_Int := CMD_49_2(MINOR_VERS,MY_PARAMS);
           3 : tmp_Int := CMD_49_3(MINOR_VERS,MY_PARAMS);
           4 : tmp_Int := CMD_49_4(MINOR_VERS,MY_PARAMS);
           5 : tmp_Int := CMD_49_5(MINOR_VERS,MY_PARAMS);
       end;
       if tmp_Int <> 0 then
       begin
           tmp_Str:=CALC_ERROR(tmp_Int);
           SHOW_MYALERT(tmp_Str);
               //1. Analize this ...
               //2. status bytes or/and CMD_76_0_0
               //3. programatically do something or...
               //4. ...call of administrator
               //...
           Exit;
       end
       else
       begin
           Result:=True;
           CALC_SWITCHES;
       end;
   except
       Result:=False;
   end;
end;

function TfmMainForm.PRINT_DELIMITER: Boolean;
begin
   Result:=False;
   if not CHECK_ASSIGNED then Exit;
   try
       ADD_LOG('[CMD_92_0_0]: ПЕЧАТ НА РАЗДЕЛИТЕЛНА ЛИНИЯ');
       case MyFiscDevice of
           dt_DP55_KL:tmp_Int:=FPDP55_KL.CMD_92_0_0('1');
           dt_FP2000_KL:tmp_Int:=FP2000_KL.CMD_92_0_0('1');
           dt_FP60_KL:tmp_Int:=FP60_KL.CMD_92_0_0('1');
           dt_FP_550_KL:tmp_Int:=FP550_KL.CMD_92_0_0('1');
           dt_FP_550D_KL:tmp_Int:=FP550D_KL.CMD_92_0_0('1');
       end;

       if tmp_Int <> 0 then
       begin
           tmp_Str:=CALC_ERROR(tmp_Int);
           SHOW_MYALERT(tmp_Str);
           Exit;
       end
       else
       begin
           Result:=True;
           CALC_SWITCHES;
       end;
   except
       Result:=False;
   end;
end;

function TfmMainForm.SELL_SOMETHING: Boolean;
var
   MyInput : WideString;

   function GET_SELL_DATA (TRGT_EXAMPLE : Integer) : WideString;
   var
       TaxCd, Price, Qwan, Perc, L1, L2 : WideString;
   begin
       Result:='';
       case TRGT_EXAMPLE of
           0:
           begin
               //Get this data from your database
               L1:='Тест на продажба:ред 1';
               //L2:='Тест на продажба:ред 2';
               L2:='1234567890 1234567890 1234567890 1234567890 1234567890 1234567890';
               Price := FormatFloat('0.00', 0.10);
               Qwan := FormatFloat('0.000', 1.543);
               Perc := FormatFloat('0.00', 10.00);//
               TaxCd := 'Б';
               Result:=L1+';'+L2+';'+TaxCd+';'+Price+';'+Qwan+';'+Perc+';';