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