Внешняя компонента. Аналог ОтправитьДляОбработки() объекта HTTPReader v7plus.dll (1С 7.7)

В программе «1С:Предприятие» версии 7.7 для работы с Интернет предусмотрен объект HTTPReader компоненты v7plus.dll. В частности, для получения WEB-станицы с сервера предусмотрен метод ОтправитьДляОбработки(). Пример использования указанного метода можно найти здесь. Как видно из примера функционал данного метода может очень сильно помочь при решении интеграционных задач. И не было б никакого смысла в написании данной статьи, если б не одно НО. У метода ОтправитьДляОбработки() ест один весьма существенный недостаток: в случае, если сервер в заголовке ответа не передает размер пакета, то принимаемая страница обрезается до размера в примерно 1024 байта (приблизительно логику данного явления можно понять при дальнейшем ознакомлении с этой статьей). Именно указанное неудобство побудило автора сначала к написанию внешней компоненты, а впоследствии и этой статьи.
Для реализации задачи средством разработки было принято Delphi 6 как единственная среда разработки кроме 1С, которой автор владеет на необходимом уровне. Скажу сразу, что писать компоненты для 1С «с нуля» дело весьма хлопотное и неблагодарное. По этой причине был использован шаблон, взятый отсюда. Я не стану подробно останавливаться на принципах разработки внешних компонент для 1С (это весьма хорошо описано в последней ссылке) а сразу перейду к делу.

Итак, для получения данных по HTTP используем следующие методы (не забыв подключить библиотеку wininet).


InternetOpen  
InternetOpenUrl  
HttpQueryInfo  
InternetReadFile  
InternetQueryDataAvailable  
InternetReadFile  
InternetQueryDataAvailable  
InternetCloseHandle  

О назначении и применении указанных методов можно прочесть здесь.

Работа метода аналогична методу ОтправитьДляОбработки(): полученные данные можно записать в файл или получить в виде строки. Ниже приведен фрагмент кода с комментариями.

var url: string;  
        hSession, hfile: hInternet;  
        dwindex,dwcodelen :dword;  
        dwcode:array[1..20] of char;  
        res : pchar;  
        fSize, ReadLen:DWORD; //<-количество реально прочитанных байт  
        fBuf:array[1..1024]of byte;//<-буфер куда качаем  
        f:file; //<-файл куда качаем  
        s,i_f: string;  
        flag:integer;  
  begin  
    case mode of  
      m_rus_name: Result:='ПолучитьВебСтраницу';//Имя процедуры  
      m_eng_name: Result:='GetWWWPage';//Англоязычный синоним  
      m_n_params: g_NParams:=3; //Количество параметров функции  
      m_execute: begin  
        flag:=GetParamAsInteger(0);//тип действия 1-записать в файл, 2-записать в переменную  
        url:=GetParamAsString(1);//адрес  
        i_f:=GetParamAsString(2);//имя файла  
        fSize:=0; //<- |переменных  
        if pos('http://',lowercase(url))=0 then  
        url := 'http://'+url;  
        hSession := InternetOpen('InetURL:/1.0',//открываем адрес  
        INTERNET_OPEN_TYPE_PRECONFIG,nil, nil, 0);  
        if assigned(hsession) then  
        begin  
        hfile := InternetOpenUrl(hsession, pchar(url), nil,  0,  INTERNET_FLAG_RELOAD, 0);  
        dwIndex  := 0;  
        dwCodeLen := 10;  
        HttpQueryInfo(hfile, HTTP_QUERY_STATUS_CODE, @dwcode, dwcodeLen, dwIndex);  
        res := pchar(@dwcode);  
        if (res ='200') or (res ='302') then  
        result:= '1'  
        else result:= '0';  
        //Попробуем получить страницу...  
        if result='1' then  
        begin  
                if flag=1 then begin  
                AssignFile(f,i_f);//открываем файл  
                ReWrite(f,1);  
                while ReadLen<>0 do  
                begin  
                //читаем в буфер  
                InternetReadFile(hfile, @fBuf, SizeOf(fBuf), ReadLen);  
                //смотрим ск-ко осталось докачать  
                InternetQueryDataAvailable(hfile, fSize,0,0);  
                BlockWrite(f, fBuf, ReadLen) //<-пишем в файл  
                end;  
                end  
                else  
                begin  
                result:='';  
                while ReadLen<>0 do  
                begin  
                //читаем в буфер  
                        InternetReadFile(hfile, @fBuf, SizeOf(fBuf), ReadLen);  
                        //смотрим ск-ко осталось докачать  
                        InternetQueryDataAvailable(hfile, fSize,0,0);  
                        s := '';  
                        SetString(S, pchar(@fBuf), ReadLen);//преобразуем массив в сторку  
                        result:=result+s;  
                end;  
                end;  
                if flag=1 then  
                CloseFile(f) //<закроем файл  
                else begin  
                g_Value:=result;  
                PutNParam(2,g_Value);//установим значение третьей переменной  
                end;  
                result:='1';  
                end;  
                g_Value:=StrToInt(result);//Установим возвращаемое функцией  
                //конец получения страницы  
                InternetCloseHandle(hfile);//закроем сессию  
                InternetCloseHandle(hsession);  
        end;  
      end;  
    end;//case  

Для проверки работы внешней компоненты используем обработку (ссылка для скачивания в конце статьи). Вот код процедуры проверки:

Попытка  
             vk = СоздатьОбъект("AddIn.GetURL");  
Исключение  
             Сообщить("Не удается создать объект AddIn.GetURL... !!");  
             Сообщить("Зайдите в Windows под правами локального администратора и повторите попытку.");     
  
КонецПопытки;      
  
Ф = СокрЛП(СТР);  
Сообщить(vk.ПолучитьВебСтраницу(фл,СОКРЛП(адр),Ф));   
Стр = Ф;   
vk = 0;  
Теги:
HTTPReader
Добавлено: 01 Августа 2018 07:17:50 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...