Суббота, 27.04.2024
Королевство Delphi
Главное меню
Статьи
Наш опрос
Как часто ви на этот сайт заходите?
Всего ответов: 159
Статистика
Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Главная » Статьи » Разные » Разные

Внешняя компонента. Аналог ОтправитьДляОбработки() объекта 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;

Получить ссылку на материал

Категория: Разные | Добавил: Барон (20.12.2011)
Просмотров: 2117 | Теги: объект, v7plus.dll, 1С 7.7, HTTPReader, компонент | Рейтинг: 0.0/0
[ Пожертвования для сайта ] [ Пожаловаться на материал ]

Если вам помог материал сайта кликните по оплаченной рекламе размещенной в центре

Поиск
Категории раздела
Delphi.NET [3]
Kylix Delphi for Linux [9]
Советы Дельферу [6]
Хитрости в Delphi [2]
Обзор Delphi [45]
Инсталлятор [11]
Пользовательский интерфейс [18]
Примеры Delphi [93]
Функции и процедуры [15]
Разные [31]
Королевство Delphi © 2010-2024
Яндекс цитирования