Опеределение Имени серевера / IP - адреса сервера

0 (0)
  • Развернуть Опеределение Имени серевера / IP - адреса сервера ( publicem  15.04.2016 09:43 )
    5(1)
    Какие есть функции для опеределения Имени серевера / IP адреса сервера ?
    Есть такая проблема: Файл шаблонов располагается в сетевой папке и доступ к нему осуществляется по след-му адресу:
    \\192.168.0.10\папка\имя файла.xls -к примеру
    Как определить ip-адрес сервера который прописывается как раз в term.ini

    >> Ответить
    • Развернуть если терминал находится на локале ( Белохонов Павел  15.04.2016 14:32 )
      5(1)
      или запускается непосредственно из сети (не с примапленных дисков), то параметр элементарно можно получить например так
      var ip = GetIniFileValue(GetCurDir(true)+"\\term.ini","SERVER");
      >> Ответить
      • Развернуть Отличный вариант, но... ( publicem  15.04.2016 18:33 )
        5(1)
        У меня большая проблема, с чтением term.ini находящийся со стороны терминала, вот если с серверной части любой ini без проблем Может быть проблема в функции GetIniFileValue("путь", "переменная").
        Пробовал с $ и без возвращает пустую строку...

        GetCurDir(true) - отлично работает: возвращает папку, где располагается терминал.
        А копировать на сервер ini, чтобы прочитать мне уж не хочется.))
        Подскажите в чем может быть проблема? Может с библиотекой?

        Даже нашел аналогичную функцию
        MACRO GetIniString(имя_переменной)
        //msgbox(ExistFile ("$C:\\term_test\\term.ini" ));
        //open (Bal,"$C:\\term_test\\term.ini");
        file Bal("$C:\\term_test\\term.ini") txt;
         var flag:bool=true,Позиция;
         имя_переменной="SERVER";
         while((next(Bal))AND (flag))
                 if(Substr(Bal.Str,1,1)!=";") /* убираем комментарии */
                        Позиция=Index(Bal.Str,"=");
                        if(Позиция>0)
                                if(Trim(Substr(Bal.Str,1,Позиция-1))==имя_переменной)
                                        flag=false;
                                        return(Trim(Substr(Bal.Str,Позиция+1)));
                                end;
                        end;
                 end;
         end;
         END;

        >> Ответить
        • Развернуть У меня так: ( tema  15.04.2016 20:53 )
          5(1)
          есть файл termtools.mac
          он лежит на терминале (сам копируется с сервера, но это драя история)
          в нём есть функция (очень похожая на вашу)
          macro GetIniString(sKey,sFile)
              var iParamPos;
              file f() txt;
              if (open(f,sFile))
                  while(next(f))
                      if (SubStr(f.str,1,1)!=";")
                          iParamPos=Index(f.str,"=");
                          if ((iParamPos>0) and (StrUpr(Trim(SubStr(f.str,1,iParamPos-1)))==StrUpr(sKey)))
                              return Trim(SubStr(f.str,iParamPos+1));
                          end;
                      end;
                  end;
                  return "";
              else
                  return "";
              end;
          end;
          

          а на СП в макросе вызов выглядит так
                      strTermDst=CallRemoteRsl ("termtools.mac", "GetIniString", "UPDIR",".\\RSEXTT.INI");
          
          
          Здесь читается параметр UPDIR из RSEXTT.INI
          У вас должно быть что-то вроде
          CallRemoteRsl ("termtools.mac", "GetIniString", "SERVER",".\\TERM.INI");
          


          >> Ответить
          • Развернуть сам копируется с сервера, но это драя история! ( publicem  18.04.2016 14:42 )
            5(1)
            Получилось, вот только сам создал папку MAC. И файл termtools.mac с функцией GetIniString.
            Известно, что данный файл должен находится на сервере и копироваться в папку Mac, которая тоже Должна создаться... Данный инструмент позволяет же это делать автоматически. Что для этого необходимо?

            P.S.: Какие еще функции лежат в termtools.mac? (Я его не нашел в сборке)
            И, к примеру, как вызвать GetENV("%UserProfile%"), но со стороны терминала? (Нужно же указать по принципу -
            CallRemoteRsl ("имя файла.mac", "Функция", "параметр");

            >> Ответить
            • Развернуть Может я плохо написал ( tema  18.04.2016 15:08 )
              5(1)
              termtools.mac не дистрибутивный, он пользовательский. Да, он должен лежать в MAC. Для удобства администраторов у нас применяется дополнительный макрос, который копирует termtools.mac в MAC на терминале
              >> Ответить
            • Развернуть PS. ( tema  18.04.2016 15:13 )
              5(1)
              Да, правильно :) в termtools лежит ещё
               
              macro TermGetEnv(s)
                  return GetEnv(s);
              end;
              


              Используется так:
               
              var strLocalTempFolder=CallRemoteRsl ("termtools.mac", "TermGetEnv", "TEMP");
              


              >> Ответить
            • Развернуть Как настроить автоматическое создание папок к примеру MAC и файлов с ( publicem  19.04.2016 15:29 )
              5(1)
              Именно через инструмент Rsextt.d32 : Чтобы папки и файлы добавлялись автоматически по мере необходимости и версии файлов .мас были актуальны.
              Да и есть маленькая просьба по поводу написанного вами termtools.mac .
              Не могли бы вы выслать по почте этот файл - хотелось бы посмотреть функции используемые вами.
              (Для расширения: 1)моего кругозора и 2)Инструментария RSL.)
              >> Ответить
              • Развернуть А там только 2 функции :) на текущий момент ( tema  19.04.2016 15:47 )
                5(1)
                Not specified
                >> Ответить
                • Развернуть Отлично ! Но есть вопрос касательно RsExtt.D32 ( publicem  19.04.2016 16:06 )
                  5(1)
                  Исчерпывающий ответ!
                  Но проблема с тем чтобы в папке на терминале данный макрос сам копировался и обновлялся).
                  Я, к сожалению, сделал это вручную. Т.к. не получилось автоматически...
                  Теперь хотелось бы узнать как это сделать?

                  >> Ответить
                  • Развернуть ответ в теле ( tema  19.04.2016 17:32 )
                    5(1)
                    Сейчас это происходит тупо копированием файла.
                    Вариантов тут немного, сами понимаете.
                    Копировать один раз — немного кода, проблема с версиями.
                    Копировать каждый раз — минимум кода, маленькие, но лишние тормоза.
                    Проверять дату время файла.

                    Как я сделал не скажу, мне стыдно.
                    Мне не нравится ни один из этих вариантов, но такова политика в нынешнем банке.
                    Я бы закрыл для пользователя на запись и mac и корень терминала, а макрос копировал бы админовскими скриптами вместе с обновлением терминала.

                    >> Ответить
                    • Развернуть Вот к этому и вопрос!!!! ( publicem  19.04.2016 18:05 )
                      5(1)
                      1)
                      Ссылка касательно DLM-и RSEXT
                      Инструмент сам создаст в папке \term папки \mac и \txtfile и будет с ними работать.
                      2)
                      и вторая ссылка

                      Особенности при работе WR-а в 3-х звенке:
                      1) На терминал необходимо скопировать расширение языка (из папки setup\Remote.EXT\ADD\RSL\)
                      2) На терминале должна быть dll-ка cw3220.dll
                      3) После этого, при первом запуске отчета реализованного на WR, на терминале будет создана папка MAC, куда будут скопированы файлы инструмента, и папка TXTFILE, куда будут копироваться (с сервера) отчеты.

                      и
                      Давайте по порядку:
                      1) У Вас должна быть папка терминала, назовем её Term (где находятся выполняемые файлы терминальной части программы)
                      2) В нее Вы должны скопировать расширение языка RSL.
                      3) Тестовый пример выкладываете на сервер и запускаете его на выполнение
                      4) Инструмент, АВТОМАТИЧЕСКИ, создаст папку MAC на терминале и скопирует в него терминальную часть инструмента (весь он не нужен)
                      5) После чего он создаст отчет на сервере и перешлет его на терминал в папку TXTFILE, которую сам и создаст
                      6) Всё, отчет получен
                      P.S. Если Вы повторите все эти действия, то проблем быть не должно.

                      >> Ответить
                      • Развернуть Нашёл функцию ( tema  20.04.2016 17:10 )
                        5(1)
                        /* проверка терминального макроса */                                                            
                        macro CheckTermTools
                            const sMacroName="termtools.mac";
                            var src_dt:date, src_tm:time, src_size:integer;
                            var dst_dt:date=Date(0,0,0), dst_tm:time=Time(0,0,0), dst_size:integer=0;
                        
                            var strDstPath="$MAC\\"+sMacroName;
                        
                            var ErrCode;
                            var strTermMacTemplatePath="..\\MAC\\USER_MAC\\.TERMINAL";
                            GetRegistryValue("USER_MAC\\ДИРЕКТОРИИ\\МАКРОСЫ ДЛЯ ТЕРМИНАЛА",V_STRING, strTermMacTemplatePath, ErrCode);
                        
                            var strSrcPath=strTermMacTemplatePath+"\\" + sMacroName;
                        
                            if (GetFileInfo(strSrcPath, @src_dt, @src_tm, @src_size))
                                GetFileInfo(strDstPath, @dst_dt, @dst_tm, @dst_size);
                                if ((src_dt!=dst_dt) and (src_tm!=dst_tm) or (src_size!=dst_size))
                                    if (not CopyFile (strSrcPath, strDstPath))
                                        MsgBox("Ошибка копирования макроса на терминал");
                                    end;
                                end;
                            else
                                MsgBox("Не найден эталон терминального макроса "+strSrcPath);
                            end;
                        end;//macro CheckTermTools 
                        

                        >> Ответить
    • Развернуть import doctor.d32; (+) ( григ  18.04.2016 07:23 )
      5(1)
      dcGetComputerName()

      >> Ответить
      • Развернуть ДА - но только в однораноговой сети ( publicem  18.04.2016 14:56 )
        5(1)
        Должна же, наверное, быть функция в одной из DLM -ке ведь в конкретный момент времени, term.exe коннектится к СП по определенному IP и порту.
        >> Ответить
        • Развернуть Не понял в чем проблема: (+) ( григ  19.04.2016 07:08 )
          5(1)
          term.exe запускает на каком-то СП exe-шник, который с помощью doctor.d32 возвращает имя СП, на котором этот exe-шник запущен.
          Или Вам надо что-то другое?
          >> Ответить
          • Развернуть Можно я угадаю? Особенности настройки DNS, WINS,... ( tema  19.04.2016 09:22 )
            5(1)
            проброски броадкастов нетбиоса через роутер и т.п., которые в конретной сети не позволяют обратиться по имени к хосту в другом сегменте.
            >> Ответить
            • Развернуть Так и есть!!! ( publicem  19.04.2016 11:58 )
              5(1)
              Not specified
              >> Ответить
            • Развернуть А реальное IP СП и его IP в term.ini совпадают? (-) ( григ  19.04.2016 12:28 )
              5(1)
              Not specified
              >> Ответить
              • Развернуть Да они совпадают, но ( publicem  19.04.2016 15:18 )
                5(1)
                Но у СП 2-сетевых порта и у каждого свой IP адрес. Каждый смотрит в свою сеть, которые изолированы друг от друга..
                >> Ответить
                • Развернуть Понятно (+) ( григ  19.04.2016 15:47 )
                  5(1)
                  т.е. смысла определять IP на СП - нет, получим два IP, неизвестно, какой выбрать.
                  Тогда, все-таки, нужно копировать term.ini на СП в TXTFile\ с уникальным именем и его разбирать.
                  На самом деле это просто:
                  1. Берешь lg.d32(терминал)+lgs.d32(СП)
                  2. //определяем командную строку терминала
                  CommandLineT=trim(lgGetCommandLine()); if(valtype(CommandLineT)!=V_STRING) CommandLineT=""; end;
                  3. //определяем имя term.ini
                  fTermIni=SP_GetIniFile(CommandLineT); //или ключ "-cterm2.ini" или стандартный "term.ini"
                  4. копируем на СП: lgTermServ(fTermIni,"..\\TXTFile\\term."+string(UserNumber); //как вариант
                  5. открываем файлик, ищем строки "SERVER","=" или "IP","=", удаляем файлик
                  все. Можно одной функцией оформить.

                  Что касается шаблонов - я их в локальный Terminal копирую, в подпапки, чтобы по сети не гонять. Естественно ведется система учета версий шаблонов с автоматическим обновлением. Открываются через Add.

                  Единственное что-то аналогичное было - это при импорте каких-либо здоровых справочников (типа ликвидированных ЮЛ или проверки по спискам должников ФНС), требуется знать, папка с файлом относительно терминала - сетевая шара на СП или нет. Если да - открываем ее относительно СП сразу, если нет - копируем сначала на СП, потом - все тоже самое.

                  >> Ответить
                  • Развернуть Идея хорошая.. Шаблоны на терминале.. ( publicem  19.04.2016 16:45 )
                    5(1)
                    1)Как вы проверяете актуальность
                    2)Не все шаблоны нужны для конкретного пользователя - у вас копирование/замена по мере необходимости?
                    3)Проверка доступности пути, значит там стоит таймаут по прошествии которого определяет о недоступности пути?
                    4)Да и не хотелось бы копировать term.ini на сервер ведь это траты трафика и процессорных ресурсов СП) Необходимо
                    чтобы это определялось локально на терминале.

                    Наши пользователи удаляют даже файлы D32, так это тоже проблема для администраторов!
                    Как это обеспечить и ведь версии файлов различные значить нужно их обновлять как-то до актуальной версии.
                    Но простое копирование функция CopyFile точно не поможет, т.к. затрагиваются и файлы с d32 и не только, значит через терминал не обновить?
                    Только Копировать файл bat с макросом (может быть есть другие способы?), затем запустить его он прибьет term,
                    и начнет копирование необходимого содержимого с сетевой папки.. Это собственно 5-й пункт.
                    >> Ответить
                    • Развернуть хранить шаблоны в шаре ( Sergey V. Mamaev  20.04.2016 09:32 )
                      5(1)
                      хранить шаблоны в шаре - это как бы моветон. чем вам не мила такая конструкция?
                      import rsexts;
                      copyfile("..\\templs\\retail\\f0401106.dot","$templs\\f0401106.dot");
                      она и каталоги на терминале создаст за вас

                      можно дополнить конструкцией сравнения даты+времени+размера (getfileinfo), чтоб лишний раз не копировать
                      >> Ответить
                    • Развернуть Попробую ответить (+) ( григ  20.04.2016 10:40 )
                      5(1)
                      1)+2)
                      Шаблоны лежат в папках вида: ..\Mac\MyMac\Shablon\Operday\Letter\
                      т.е. по определенной тематике. Не для конкретного пользователя, а для группы пользователей, выполняющих одинаковые задачи.
                      содержимое вида такого:
                      Letter03.doc
                      Letter03.lzh
                      lha32.exe
                      vers.txt
                      Шаблоны + их упакованные варианты + архиватор lha32.exe (маленький, 40 кб, жмет нормально и длинные имена понимает) + файл версий vers.txt вида:
                      Letter02.doc=9
                      Letter03.doc=6
                      ...
                      Т.е. правишь шаблон, переупаковываешь, меняешь номер версии и все. Файлики версий могут быть разные даже в одном каталоге. По идее можно на каждого отдельного опера клепать: vers9999.txt, хотя не вижу смысла.
                      В макросе вывода юзаешь:
                        ...
                        //автообновление ресурсов на терминале
                        path_root="Shablon\\Operday\\Letter";
                        pathS="..\\Mac\\MyMac\\"+path_root;
                        res=Word_ShablonUpdate(path_root,pathS,"vers.txt");
                        if(res!="") return; end;
                      
                        if(IsStandAlone) wrd=ActiveX("Word.Application",null,false);
                        else             wrd=TlgActiveX("Word.Application",false);
                        end;
                        
                        namefile=Word_GetPath(pathS,path_root,"Letter03.doc");
                        adoc=wrd.Documents.Add(namefile);
                        ...
                      
                      Функции Word_ - такие:
                      import doctor,lgs;
                       //автообновление ресурсов на терминале
                       macro Word_ShablonUpdate(path_root,pathS,vers)
                        if(valtype(vers)!=V_STRING) vers="vers.txt"; end;
                        res=ExecMacroFile("..\\mac\\resource.mac","lgResUpdate",paths,path_root,vers,True);
                        if(res!="") MsgBox(res); end;
                        return res;
                       end;
                      
                       //вернуть абсолютный путь с имененем шаблона для Word-a
                       macro Word_GetPath(pathS,path_root,nameF)
                        local var path,i,ndx=0;
                        if(IsStandAlone) //2-х звенка
                         path=dcGetCWD(); i=strlen(path);
                         while(i>0) //ищем первый справа слэш
                          if(substr(path,i,1)=="\\") ndx=i; i=0; end;
                          i=i-1;
                         end;
                         if(ndx>0) path=substr(path,1,ndx-1); end; //срезаем \\OBJ
                         if(substr(pathS,1,2)=="..") pathS=substr(paths,3); end; //срезаем ..
                         path=path+pathS;
                        else //3-х звенка
                         if(index(path_root,":")>0) path=path_root;
                         else path=lgGetCWD()+"\\"+path_root;
                         end;
                         if(substr(path,strlen(path),1)=="\\") path=substr(path,1,strlen(path)-1); end;
                        end;
                        return path+"\\"+nameF;
                       end;
                      

                      Сама обновлялка resource.mac:
                      import BankInter,doctor,lgs,hl_lex;
                                                    
                       /*
                          pathServ - путь к ресурсам на сервере приложений
                          pathTerm - путь к ресурсам на терминале
                          VerFile  - имя файла с информацией о версиях ресурсов
                          UseZip   - использовать по возможности архивы lzh (lha32.exe)
                          В случае ошибки возвращает текст этой ошибки или пустую строку
                          при удачной работе
                       */
                       macro lgResUpdate(pathServ,pathTerm,VerFile,UseZip,IsConsole)
                        local var path_unzip,txtfile,fileexist,t1,t,ndx,namefile,listTerm,listServ;
                        local var serv,term,node,name,atr,i,cont,file_unzip,res,err="";
                        local var namesfile,ar,attrib;
                        local var NewSize,size,tdate;   
                        private var {oper};
                      
                        /*if({oper}!=9998) return; end;*/
                      
                        if(valtype(UseZip)!=V_BOOL) UseZip=false; end;
                        if(valtype(IsConsole)!=V_BOOL) IsConsole=true; end;
                        path_unzip="..\\mac\\mymac\\zip\\";
                        file_unzip="lha32.exe";
                        txtfile=GetIniString("TEXTDIR")+"\\";
                        namesfile=txtfile+"resource."+string(UserNumber);
                      
                        //создание каталога
                        local macro f_lgMakeDir(pathTerm)
                         //Проверяем каталог на терминале
                         if((trim(pathTerm)!="") and (trim(lgFindFile(pathTerm))==""))
                          return lgMakeDir(pathTerm); //Нет каталога на терминале. Создаем его.
                         end;
                         return true;
                        end;
                      
                        //копирование файла
                        local macro f_lgCopyFile(pathServ,pathTerm,namefile,UseZip,IsConsole)
                         local var namefile1,ndx,attrib,res,err="";
                         if(valtype(UseZip)!=V_BOOL) UseZip=false; end;
                      
                         namefile1=namefile;
                         if(UseZip)
                          ndx=index(namefile,"."); if(ndx==0) ndx=1; end;
                          namefile1=substr(namefile,1,ndx)+"lzh";
                          if(trim(dcFindFile(pathServ+namefile1))=="")
                           namefile1=namefile; UseZip=false;
                          end;
                          lgDelFile(pathTerm+namefile1); //пытаемся удалять zip-файл без всяких проверок
                         end;
                      
                         attrib=32; //архивный файл
                         if(trim(dcFindFile(pathServ+namefile))=="")
                          return "Нет файла на сервере! "+namefile; 
                         else
                          attrib=dc_rtl_chmod(pathServ+namefile,0); //читаем атрибуты файла на сервере
                          if(valtype(attrib)!=V_INTEGER) return attrib+" "+namefile; end; //не удалосьhl_hp({hl_hps}+9)
                         end;
                      
                         if(trim(lgFindFile(pathTerm+namefile))!="")
                          res=lg_rtl_chmod(pathTerm+namefile,1,32); //сбрасываем атрибуты
                          //if(valtype(res)!=V_INTEGER) return res+" "+namefile; end; //не удалось
                          res=lgDelFile(pathTerm+namefile);
                          if(res!=0) return "Ошибка удаления файла! "+namefile; end;
                         end;
                         lgFindClose();
                         if(UseZip)
                          if(not lgServTerm(pathServ+namefile1,pathTerm+namefile1,IsConsole))
                           err="Ошибка копирования файла! "+namefile1;
                           if(not lgServTerm(pathServ+namefile,pathTerm+namefile,IsConsole))
                            return err+" Ошибка копирования файла! "+namefile; 
                           end;
                          end;
                         else
                          if(not lgServTerm(pathServ+namefile,pathTerm+namefile,IsConsole))
                           return "Ошибка копирования файла! "+namefile; 
                          end;
                         end;
                      
                         if(not UseZip) 
                          res=lg_rtl_chmod(pathTerm+namefile,1,attrib); //устанавливаем атрибуты
                         end;
                      
                         return err;
                        end;
                      
                        //найти заданный образец в 2-мерном массиве
                        //ndx - номер столбца, по которому искать
                        //u - номер строки, с которой начать поиск
                        local macro hl_Ar2Find(ar,obr,ndx,u)
                         local var i=0, size,ar1;
                         if ((valtype(u)==V_INTEGER) and (u>=0)) i=u; end;
                         if(valtype(ndx)!=V_INTEGER) ndx=0; end;
                         if(valtype(ar)==V_GENOBJ)
                          size=ar.size;
                          if(size==0) return -1; end;
                          while(i<size)
                           ar1=ar[i];
                           if((valtype(ar1[ndx])==valtype(obr)) and (ar1[ndx]==obr)) return i; end;
                           i=i+1;
                          end;
                         end;
                         return -1;
                        end;
                        
                        /****************/
                        /*Основной кусок*/
                        /****************/
                      
                        //Если мы в 2-х звенке - вываливаемся
                        if(IsStandAlone()) return ""; end;
                      
                        //обрезаем конечный слэш
                        pathServ=trim(pathServ);
                        if(substr(pathServ,strlen(pathServ),1)=="\\") pathServ=substr(pathServ,1,strlen(pathServ)-1); end;
                        pathTerm=trim(pathTerm);
                        if(substr(pathTerm,strlen(pathTerm),1)=="\\") pathTerm=substr(pathTerm,1,strlen(pathTerm)-1); end;
                      
                        //проверяем наличие каталога на сервере
                        if(trim(pathServ)!="")
                         if(trim(dcFindFile(pathServ))=="")
                          return "Нет каталога на сервере! "+pathServ;
                         end;                                                  
                         pathServ=pathServ+"\\";
                        end;
                      
                        //Проверяем наличие файла версий
                        if((trim(VerFile)=="") or (trim(dcFindFile(pathServ+VerFile))==""))
                         return "Нет файла на сервере! "+VerFile; 
                        end;
                      
                        fileexist=true;
                        /*проверяем/создаем вложенные каталоги на терминале*/
                        t1=pathTerm; t="";
                        ndx=index(t1,":\\"); 
                        if(ndx>0) //C:\\Path и т.д.
                         t=substr(t1,1,ndx+1); t1=substr(t1,ndx+2);
                        elif(substr(t1,1,2)=="\\\\") //UNC-нотация
                         t=substr(t1,1,2); t1=substr(t1,3);
                        elif(substr(t1,1,1)=="\\") //неправильный относительный путь
                         return "Неправильный путь! "+t1;
                        elif(index(t1,":")>0) //неправильный абсолютный путь
                         return "Неправильный путь! "+t1;
                        end; 
                      
                        ndx=index(t1,"\\");
                        while(ndx>0)
                         if((t=="") or (substr(t,strlen(t),1)=="\\")) t=t+substr(t1,1,ndx-1);
                         else t=t+"\\"+substr(t1,1,ndx-1);
                         end;
                         t1=substr(t1,ndx+1);
                         if(not f_lgMakeDir(t))
                          return "Не могу создать каталог! "+t;
                         end;
                         ndx=index(t1,"\\");
                        end;
                        if((t=="") or (substr(t,strlen(t),1)=="\\")) t=t+t1;
                        else t=t+"\\"+t1;
                        end;
                        if(not f_lgMakeDir(t))
                         return "Не могу создать каталог! "+t;
                        end;
                        pathTerm=pathTerm+"\\";
                      
                        //Проверяем наличие файла версий на терминале
                        if(fileexist)
                         namefile=trim(lgFindFile(pathTerm+VerFile));
                         if(namefile=="")
                          fileexist=false;
                         else //Копируем его на сервер
                          if(not lgTermServ(pathTerm+VerFile,namesfile,false))
                           return "Ошибка копирования файла на сервер! "+VerFile;
                          end;
                         end;
                        end;
                      
                        //Создаем список для обновленных файлов
                        listServ=TArray;
                        listTerm=null;
                      
                        serv=TdcText(); serv.Open(pathServ+VerFile);
                        if(fileexist)
                         listTerm=TArray;
                         term=TdcText(); term.Open(txtfile+namesfile);
                         //заполняем список данных с терминала
                         term.rewind;
                         while(term.next)
                          ar=null;
                          if(index(term.Str,";"))   ar=hl_ReadDelim1(term.Str,";");
                          elif(index(term.Str,"=")) ar=hl_ReadDelim1(term.Str,"=");
                          end;
                          if(valtype(ar)!=V_UNDEF)
                           ar[1]=int(ar[1]);
                           listTerm[listTerm.Size]=ar;
                          end;
                         end;
                         term.Close;
                      
                        end;
                        
                        //заполняем список для обновления
                        serv.rewind;
                        while(serv.next)
                      //if({oper}==650) message(serv.Str); TestEvent(1); end; //у 650 опера без этого виснет на строке while(serv.next)
                      //if({oper}==9998) message(serv.Str); TestEvent(1); end;
                      //   TestEvent(1); 
                         ar=null;
                         if(index(serv.Str,";"))   ar=hl_ReadDelim1(serv.Str,";");
                         elif(index(serv.Str,"=")) ar=hl_ReadDelim1(serv.Str,"=");
                         end;
                         if(valtype(ar)!=V_UNDEF)
                          ar[1]=int(ar[1]);
                          i=hl_Ar2Find(listTerm,ar[0]);
                          if((i<0)or(listTerm[i,1]!=ar[1])or(trim(lgFindFile(pathTerm+ar[0]))==""))
                           listServ[listServ.Size]=ar;
                          end;
                         end;
                        end;
                        serv.Close;
                      
                        //Если использовать lzh-файлы, то проверяем наличие lha32.exe
                        if(UseZip)
                         NewSize=39950;
                         name=atr=size=tdate="";   
                         res=lgFindFirst(file_unzip,name,atr,size,null,null,null,null,tdate); 
                         if((not res) or (NewSize!=size))
                          if(res) res=lgDelFile(file_unzip); end;
                          if(not res)
                           if(not lgServTerm(path_unzip+file_unzip,file_unzip,false))
                            err="Ошибка копирования файла на терминал! "+file_unzip;
                            UseZip=false;
                           else namefile=file_unzip;
                           end;
                          end;
                         end;
                         lgFindClose();
                        end;
                      
                        //если нет в списке самого файла версий - добавляем
                        if(listServ.Size and (hl_Ar2Find(listServ,VerFile)<0))
                         ar=TArray; ar[0]=VerFile; ar[1]=1;
                         listServ[listServ.Size]=ar;
                        end;
                      
                        //Копируем ресурсы с сервера на терминал
                        i=0;
                        while(i<listServ.Size)
                         namefile=listServ[i,0]; 
                         res=f_lgCopyFile(pathServ,pathTerm,namefile,UseZip,IsConsole);
                         if(strlen(res)>0) return res; end;
                         i=i+1; 
                        end;
                      
                        //распаковываем
                        if(UseZip and (listServ.Size>0))
                         //корежим pathTerm для относительных путей
                         if((substr(pathTerm,2,1)!=":") and (substr(pathTerm,1,2)!="\\\\"))
                          pathTerm=lgGetCWD()+"\\"+pathTerm;
                         end;
                         res=lgRun(file_unzip," e "+pathTerm+"*.lzh "+pathTerm);
                         name=""; atr=0; i=1;
                         cont=lgfindfirst(pathTerm+"*.lzh",name,atr);
                         while(cont)
                          if(dcAnd(atr,16)==0) lgDelFile(pathTerm+name); end;
                          cont=lgfindnext(name,atr);
                         end;
                         lgFindClose();
                        end;
                      
                        //Устанавливаем атрибуты файлов на терминале аналогично атрибутам файлов на сервере
                        i=0;
                        while(i<listServ.Size)
                         namefile=listServ[i,0]; 
                         attrib=dc_rtl_chmod(pathServ+namefile,0); //читаем атрибуты файла на сервере
                         if(valtype(attrib)==V_INTEGER) 
                          res=lg_rtl_chmod(pathTerm+namefile,1,attrib); //устанавливаем атрибуты на терминале
                         end;
                         i=i+1; 
                        end;
                      
                        serv=null; term=null;
                        return err;
                       end;
                      
                      end;
                      

                      У опера при первом вызове любого макроса с шаблоном из данного каталога автоматом произойдет проверка наличия цепочки каталогов на терминале (создаются автоматом), наличие архиватора на терминале (скопируется автоматом), наличие файла шаблона, наличие файла версий, сверка номера версий. Если версии не совпадают или нет шаблона - автоматом скопируется и разархивируется заархивированный шаблон (для минимизации трафика сети), если нет архива - скопируется исходный шаблон.
                      Это касается всех шаблонов в vers.txt разом.
                      Да, это все писалось много лет назад - извиняюсь за "(listServ.Size>0)".

                      3) Там юзается виндовая функция FindIncFile() - не знаю, есть там таймаут или нет. По идее должен быть.
                      4) Спорная мысль. term.ini - 1 Кбайт. Не сильно он нагрузит сетку. По сравнению с шаблонами на сетевом ресурсе это капля в море. Сетевые шаблоны на 100 Кб и более нагрузку дадут в разы больше, да еще при каждом открытии.
                      У вас возможно не совсем верный взгляд на обмен терминал-сервер в РС-е. Вот вы говорите "определять локально на терминале". Это значит длм-ка rsexts должна c СП отправить пакет-запрос на rsextt. Терминальная длм-ка что-то сделает и вернет обратно пакет с результатом. Каждый пакет в локальной сети - это примерно 1-1,5 Кб (точно не скажу), даже если 1 байт посылается. Сделали вы TestEvent - пакет туда-обратно прошел и т.д. Т.е. реально трафик всегда будет, вопрос в том как минимизировать его объем, а следовательно и количество пакетов. Вышеприведенный вариант обновления шаблонов у меня работал с приемлемой скоростью на модеме 38400. Кстати, если шаблоны с картинками - не забывайте их жать в качество для печати - сильно объем уменьшается.

                      5) Насчет пользователей с кривыми руками и прямыми извилинами, которые трут d32.
                      Во первых, как они в C:\Term залазят? Это ж надо TC запустить, нужный каталог найти. Осознанно действовать. Зачем им туда вообще лазить? Есть причины?
                      Во-вторых, можно на системные файлики в C:\Term поставить атрибут "OnlyRead" или "System". Хотя конечно не всех остановит.

                      Для обновления терминальных длм-ок я делаю так.
                      1. Копируем lg.d32+lgs.d32 в lgUp.d32+lgsUp.d32 в каталоге MAC (там же и все терминальные части длм-ок лежат). Один раз. Это нужно потом для обновления самих ld.d32+lgs.d32.
                      2. В макросах с именем подсистемы, которые вызываются при входе в подсистему mvodb32.mac. Пишем:
                       macro WorkBegin()
                        ExecMacroFile("..\\mac\\lgupdate.mac","Main_Update");
                       end;
                      
                      Сам макрос lgupdate.mac:
                      import BankInter,lgsUp,doctor;
                       lgTermDlmName("lgUp"); //говорим lgsUp.d32, что нужно работать с терминальной длм-кой lgUp.d32
                      
                      macro Main_Update()
                       if(IsStandAlone()) return; end;
                      
                        res=lgGetComputerName();
                        if((valtype(res)!=V_STRING) or (res=="")) /*нет lgUp.d32 на терминале*/
                         lgTermDlmName("lg");
                         res=lgFindFile("lgUp.d32");
                         if(not res)
                          res=lgServTerm("..\\mac\\lgUp.d32","lgUp.d32");
                          if(res)
                           res=dcInsertText("..\\mac\\lg.txt",string({oper}:4)+" - lgUp.d32 скопирован "+string(date)+" "+string(time)+StrFor(13)+StrFor(10),-1);
                          end;
                         end;
                         lgTermDlmName("lgUp");
                        end;
                      
                       if(date>=date(08,02,2011))
                      
                        NewDate=date(07,02,2011);
                        NewSize=77824;
                        name=atr=size=tdate="";   
                        fname="lg.d32";
                        res=lgFindFirst(fname,name,atr,size,null,null,null,null,tdate); 
                        lgFindClose();
                        if((not res) or (NewSize!=size) or (NewDate>tdate))
                         if(res) lgDelFile(fname); end;
                         res=lgServTerm("..\\mac\\"+fname,fname);
                         if(res)
                          res=dcInsertText("..\\mac\\lg.txt",string({oper}:4)+" "+lgGetComputerName()+" - "+fname+" обновлен "+string(date)+" "+string(time)+StrFor(13)+StrFor(10),-1);
                         else
                          res=dcInsertText("..\\mac\\lg.txt",string({oper}:4)+" "+lgGetComputerName()+" - "+fname+" ошибка копирования "+string(date)+" "+string(time)+StrFor(13)+StrFor(10),-1);
                         end;
                        end;
                      
                        ... //и так далее 
                       end;
                      end;
                      
                      end;
                      
                      На терминале изначально должна быть lg.d32. Один раз все скопировать, потом положить в дистрибутив каталога для терминала, чтобы на новое рабочее место копировалось.

                      Вот так. Сорри, что много букаф.
                      >> Ответить
                    • Развернуть Да и не хотелось бы копировать term.ini на сервер ведь это траты трафика и процессорных ресурсов СП) ( Волшебник  23.06.2016 12:37 )
                      5(1)
                      Модемы на 38к бод...
                      Терминалы на компах юзера...
                      Сборище маньяков и извращенцев! :)
                      Сейчас специально посмотрел наши шаблоны - только некоторые из них, для старых видов вкладов еще в формате Word2003 превышают 100кБ.
                      Уже давно все шаблоны стараемся делать в формате *.docx (*.dotx) - и даже самые монструозные из них (договора) не превышают 40-50кБ.
                      Вы всерьез считаете, что такой объем данных при копировании по каналам связи на современных скоростях - это проблема?
                      У РС сейчас реализован штатный функционал копирования шаблонов на терминал при их вызове. Находится в ACTIVEX.MAC
                      И в наших макросах все сводится к вызову ACTIVEX.MAC, объявлению переменных
                       
                      const TemplatePath = getCurDir() + "\\..\\mac\\template\\bank"; // путь относительно сервера!
                      var TemplateName = "vypiska.xlsx";
                      
                      и далее открытием шаблона
                      if (not OpenExcelFile (TemplateName, false, true, TemplatePath)) exit(1) end;
                      
                      И совершенно не паримся по поводу соответствия версий на сервере и терминале. Шаблон поменялся - поменял его на сервере, а юзвери получат его к себе при вызове.

                      >> Ответить
                • Развернуть Можно еще проще - перебором:(+) ( григ  19.04.2016 16:05 )
                  5(1)
                  Проверить относительно терминала наличия папок вида: \\192.168.0.10\папка (в массиве их хранить).
                  Можно через rsextt.d32+rsexts.d32 - наверное.
                  Я пользуюсь lg.d32+lgs.d32:
                  import lgs;
                  path="\\\\192.168.0.10\\папка";
                  res=lgFindFile(path)
                  println(res); //если res непустой - есть такая папка
                  end;


                  >> Ответить