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

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

В программе «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;

Скачать компоненту, обработку и исходный код (Delphi 6) можно в приложении.

Приложение.

Скачать компоненту и обработку
Скачать исходник

Источник: http://masich.info/



Опубликовал admin
11 Дек, Понедельник 2006г.



Программирование для чайников.