Сам пользуюсь этими функциями, в ряде случаев чуть дорабатывая "по месту", но в основном их возможностей хватает. Позволяют быстро начать работу с большинством http-сервисов.
// Вспомогательная
Процедура СообщитьИВнестиВПротокол(инфо,рПротокол,рПояснять=Ложь) Экспорт
Если Прав(инфо,3)="!!!" Тогда
рСтатус=СтатусСообщения.ОченьВажное;
ИначеЕсли Прав(инфо,2)="!!" Тогда
рСтатус=СтатусСообщения.Важное;
ИначеЕсли Прав(инфо,1)="!" Тогда
рСтатус=СтатусСообщения.Внимание;
Иначе
рСтатус=СтатусСообщения.Информация;
КонецЕсли;
Если рПояснять Тогда
Сообщить(инфо,рСтатус);
КонецЕсли;
//
Если ТипЗнч(рПротокол)=Тип("ТекстовыйДокумент") Тогда
рПротокол.ДобавитьСтроку(инфо);
КонецЕсли;
КонецПроцедуры
// Выполняет любой запрос к соединению,при необходимости создаёт соединение,заносит в параметры ответ сервиса.
// Возвращает успешность (булево), при ошибке возвращает Ложь.
//
// Параметры:
// рПараметры - структура:
//
// Соединение - HTTP-соединение; заносится в этот ключ,если не было передано (создаётся в функции),и используется из этого ключа без изменений,если было передано;
// если значение ключа Соединение не указано или имеет иной тип,то соединение создаётся согласно значениям указанных ключей:
// Сервер -строка, обязательный (если пусто или не указано,то возвращает ошибку),если начинается с http://,то приводится к правильному виду автоматически;
// Порт - число, обязательный (по умолчанию для незащищённых 80,для защищённых 443);
// Пользователь - строка, необязательный;
// Пароль - строка, необязательный;
// Таймаут - число, необязательный (по умолчанию 0);
// ПроксиПользователь - строка, необязательный (по умолчанию пуста); если не пуста,то это признак использования прокси,в этом случае требуется передача свойств:
// ПроксиПароль - строка, необязательный;
// ПроксиСервер - строка,
// ПроксиПорт - число, необязательный (по умолчанию 0);
// ЗащищенноеСоединение - булево, необязательный; если используется,то применяется SSL;
// КраткийФорматВызова - булево, необязательный; если указан,то соединение НЕ защищённое и БЕЗ прокси.
// Если Соединение не было указано,то по завершении функции в ключ Соединение вносится созданное в ней;
//
// HTTPЗапрос - запрос с уже установленными свойствами; необязательный,если не указан,то инициализируется в функции согласно значениям указанных ключей:
// АдресРесурса или АдресСкрипта (равнозначны оба ключа) - строка,необязательный; по умолчанию "/";
// ЗаголовкиЗапроса - соответствие или фикс.соответствие, необязательный;
// ПараметрыЗапроса - структура,соответствие,фикс.соответствие или список значений (где имя ключа - Представление,а значение ключа - Значение),
// список значений используется в случае,когда важен порядок следования параметров, вносит в ком.строку строго по порядку вхождения данных в список;
// ТелоЗапроса - строка или двоичные данные,необязательный;
// уточнения для тела запроса,являющегося строкой: КодировкаТелаЗапроса (по умолчанию UTF-8),ИспользованиеByteOrderMark (по умолчанию НеИспользовать);
// ИмяФайлаТелаЗапроса - строка; необязательный;
// указание тела запроса более приоритетно, чем указание имени файла тела запроса;
// Если HTTPЗапрос был указан, то по завершении функции из рПараметры значение с ключом HTTPЗапрос удаляется,во избежание кэширования;
//
// МетодHTTP - строка,необязательный (по умолчанию GET), допустимы только значения "GET" и "POST";
//
// Протокол - текстовый документ, необязательный (по умолчанию пуст и не используется);
// Пояснять - булево; если Истина, то действия поясняются и в протокол (если ведётся), и сообщениями.
//
// По итогам работы функции при её успешном завершении в рПараметры вставляется значение с ключом HTTPОтвет. При ошибке вставляет Неопределено.
//
// Возвращает успешность (булево).
//
Функция HTTPВыполнитьЗапрос(рПараметры) Экспорт
Попытка
рПротокол=?(рПараметры.Свойство("Протокол"),рПараметры.Протокол,Неопределено);
рПояснять=?(рПараметры.Свойство("Пояснять"),рПараметры.Пояснять,Ложь);
// сразу по умолчанию
//рОтвет=Новый HTTPСервисОтвет(0,"Запрос не выполнялся"); // в релизах ниже 8.3.7 не отрабатывает
рОтвет=Неопределено;
рПараметры.Вставить("HTTPОтвет",рОтвет);
рКраткийФормат=?(рПараметры.Свойство("КраткийФорматВызова"),рПараметры.КраткийФорматВызова,Ложь);
рЗащищённое=?(рПараметры.Свойство("ЗащищенноеСоединение"),рПараметры.ЗащищенноеСоединение,Ложь);
рПользователь=?(рПараметры.Свойство("Пользователь"),рПараметры.Пользователь,"");
рПароль=?(рПараметры.Свойство("Пароль"),рПараметры.Пароль,"");
рСоединение=?(рПараметры.Свойство("Соединение"),рПараметры.Соединение,Неопределено);
Если ТипЗнч(рСоединение)<>Тип("HTTPСоединение") Тогда // надо его установить
#Область УстановкаСоединения
Если не рПараметры.Свойство("Сервер") Тогда Возврат Ложь КонецЕсли;
рСервер=СокрЛП(рПараметры.Сервер);
Если ПустаяСтрока(рСервер) Тогда Возврат Ложь КонецЕсли;
рПорт=?(рПараметры.Свойство("Порт"),рПараметры.Порт,0);
рТаймаут=?(рПараметры.Свойство("Таймаут"),рПараметры.Таймаут,0);
рПроксиПользователь=?(рПараметры.Свойство("ПроксиПользователь"),рПараметры.ПроксиПользователь,""); // признак применения прокси именно в этом
Если рКраткийФормат Тогда рЗащищённое=Ложь; рПроксиПользователь="" КонецЕсли;
//
рПрокси=Неопределено;
Если не ПустаяСтрока(рПроксиПользователь) Тогда
рПрокси=Новый ИнтернетПрокси;
рПрокси.Пользователь=рПроксиПользователь;
рПрокси.Пароль=рПараметры.ПроксиПароль;
Если рПараметры.ПроксиПорт=0 Тогда
рПрокси.Установить("HTTP",рПараметры.ПроксиСервер);
Иначе
рПрокси.Установить("HTTP",рПараметры.ПроксиСервер,рПараметры.ПроксиПорт);
КонецЕсли;
КонецЕсли;
//
Если СтрНачинаетсяС(НРег(рСервер),"http://") Тогда
рСервер=Сред(рСервер,8);
КонецЕсли;
Если рПорт=0 Тогда
рПорт=?(рЗащищённое,443,80);
КонецЕсли;
//
Если рЗащищённое Тогда
си=Новый СистемнаяИнформация;
Если Число(СтрРазделить(си.ВерсияПриложения,".",Ложь).Получить(2))>9 Тогда
рSSL=Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(СпособВыбораСертификатаWindows.Выбирать),Новый СертификатыУдостоверяющихЦентровWindows());
Иначе
рSSL=Новый ЗащищенноеСоединениеOpenSSL(,Новый СертификатыУдостоверяющихЦентровWindows);
КонецЕсли;
Иначе
рSSL=Неопределено;
КонецЕсли;
//
Если рКраткийФормат Тогда
Если рЗащищённое Тогда
рСоединение=Новый HTTPСоединение(рСервер,,,,,,рSSL);
Иначе
рСоединение=Новый HTTPСоединение(рСервер);
КонецЕсли;
Иначе
Если рПрокси=Неопределено Тогда
рСоединение=Новый HTTPСоединение(рСервер,рПорт,рПользователь,рПароль,,рТаймаут,рSSL);
Иначе
рСоединение=Новый HTTPСоединение(рСервер,рПорт,рПользователь,рПароль,рПрокси,рТаймаут,рSSL);
КонецЕсли;
КонецЕсли;
//
Если ТипЗнч(рСоединение)<>Тип("HTTPСоединение") Тогда
СообщитьИВнестиВПротокол("Не удалось создать объект HTTP-соединения!",рПротокол,рПояснять);
КонецЕсли;
//
// вставим на будущее (это иногда имеет смысл кэшировать)
рПараметры.Вставить("Соединение",рСоединение);
#КонецОбласти
Иначе
рСервер=рСоединение.Сервер;
рПорт=рСоединение.Порт;
рТаймаут=рСоединение.Таймаут;
рПроксиПользователь=рСоединение.Прокси.Пользователь;
КонецЕсли;
// а эти всегда берём по итогам установленного соединения
рПроксиСервер=рСоединение.Прокси.Сервер();
рПроксиПорт=рСоединение.Прокси.Порт();
//
// выводим настройки соединения
инфо="Соединение:
|Сервер: "+СокрЛП(рСервер)+",порт: "+Строка(рПорт)+",пользователь: "+СокрЛП(рПользователь)+",таймаут: "+рТаймаут+"
|краткий формат: "+Строка(рКраткийФормат)+",защищённое: "+Строка(рЗащищённое)+Символы.ПС;
Если не ПустаяСтрока(рПроксиПользователь) Тогда
инфо=инфо+"прокси: сервер "+СокрЛП(рПроксиСервер)+",порт "+Строка(рПроксиПорт)+",пользователь "+СокрЛП(рПроксиПользователь);
Иначе
инфо=инфо+"прокси не используется";
КонецЕсли;
СообщитьИВнестиВПротокол(инфо,рПротокол,рПояснять);
//
Если ТипЗнч(рСоединение)<>Тип("HTTPСоединение") Тогда // уже без сообщения,именно выход по ошибке
Возврат Ложь;
КонецЕсли;
рЗапрос=?(рПараметры.Свойство("HTTPЗапрос"),рПараметры.HTTPЗапрос,Неопределено);
Если ТипЗнч(рЗапрос)<>Тип("HTTPЗапрос") Тогда
#Область УстановкаЗапроса
Если рПараметры.Свойство("АдресРесурса") и не ПустаяСтрока(рПараметры.АдресРесурса) Тогда
рАдресРесурса=рПараметры.АдресРесурса;
ИначеЕсли рПараметры.Свойство("АдресСкрипта") и не ПустаяСтрока(рПараметры.АдресСкрипта) Тогда
рАдресРесурса=рПараметры.АдресСкрипта;
Иначе
рАдресРесурса="/";
СообщитьИВнестиВПротокол("Используется пустой адрес ресурса для запроса.",рПротокол,рПояснять);
КонецЕсли;
//
рЗаголовки=Новый Соответствие;
Если рПараметры.Свойство("ЗаголовкиЗапроса") Тогда
Если ТипЗнч(рПараметры.ЗаголовкиЗапроса)=Тип("Соответствие") или ТипЗнч(рПараметры.ЗаголовкиЗапроса)=Тип("ФиксированноеСоответствие") Тогда
рЗаголовки=рПараметры.ЗаголовкиЗапроса;
КонецЕсли;
КонецЕсли;
//
Если рПараметры.Свойство("ПараметрыЗапроса") Тогда
Если ТипЗнч(рПараметры.ПараметрыЗапроса)=Тип("Структура")
или ТипЗнч(рПараметры.ПараметрыЗапроса)=Тип("Соответствие")
или ТипЗнч(рПараметры.ПараметрыЗапроса)=Тип("ФиксированноеСоответствие")
Тогда
Если рАдресРесурса<>"/" Тогда
разд="?";
Для каждого киз Из рПараметры.ПараметрыЗапроса Цикл
рАдресРесурса=рАдресРесурса+разд+СокрЛП(киз.Ключ)+"="+СокрЛП(Строка(киз.Значение)); разд="&";
КонецЦикла;
КонецЕсли;
ИначеЕсли ТипЗнч(рПараметры.ПараметрыЗапроса)=Тип("СписокЗначений") Тогда
// случай,когда был очень важен порядок параметров,и их разместили осознанно именно так; не сортировать!
Если рАдресРесурса<>"/" Тогда
разд="?";
Для каждого знч Из рПараметры.ПараметрыЗапроса Цикл
рАдресРесурса=рАдресРесурса+разд+СокрЛП(знч.Представление)+"="+СокрЛП(Строка(знч.Значение)); разд="&";
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЕсли;
//
рЗапрос=Новый HTTPЗапрос(рАдресРесурса,рЗаголовки);
//
Если рПараметры.Свойство("ТелоЗапроса") Тогда
Если ТипЗнч(рПараметры.ТелоЗапроса)=Тип("Строка") Тогда
рКодировка=?(рПараметры.Свойство("КодировкаТелаЗапроса"),рПараметры.КодировкаТелаЗапроса,Неопределено);
Если не ЗначениеЗаполнено(рКодировка) Тогда рКодировка=КодировкаТекста.UTF8 КонецЕсли;
рИспользоватьБОМ=?(рПараметры.Свойство("ИспользованиеByteOrderMark"),рПараметры.ИспользованиеByteOrderMark,Неопределено);
Если не ЗначениеЗаполнено(рИспользоватьБОМ) Тогда рИспользоватьБОМ=ИспользованиеByteOrderMark.НеИспользовать КонецЕсли;
рЗапрос.УстановитьТелоИзСтроки(рПараметры.ТелоЗапроса,рКодировка,рИспользоватьБОМ);
ИначеЕсли ТипЗнч(рПараметры.ТелоЗапроса)=Тип("ДвоичныеДанные") Тогда
рЗапрос.УстановитьТелоИзДвоичныхДанных(рПараметры.ТелоЗапроса);
КонецЕсли;
ИначеЕсли рПараметры.Свойство("ИмяФайлаТелаЗапроса") Тогда
// наличие файла не проверяем,считаем,что он есть априорно
рЗапрос.УстановитьИмяФайлаТела(рПараметры.ИмяФайлаТелаЗапроса);
КонецЕсли;
#КонецОбласти
КонецЕсли;
Если рПараметры.Свойство("HTTPЗапрос") Тогда
// удаляем из параметров,чтобы не повторялось в будущем (кэшировать его нам не надо)
рПараметры.Удалить("HTTPЗапрос");
КонецЕсли;
// выводим настройки запроса
инфо="Запрос:
|Адрес ресурса: "+рЗапрос.АдресРесурса+",заголовк"+?(рЗапрос.Заголовки.Количество()=0,"ов нет","и:");
Для каждого киз Из рЗапрос.Заголовки Цикл
инфо=инфо+"
| "+СокрЛП(киз.Ключ)+"="+СокрЛП(киз.Значение);
КонецЦикла;
Если рПараметры.Свойство("ТелоЗапроса") и ТипЗнч(рПараметры.ТелоЗапроса)=Тип("Строка") Тогда
инфо=инфо+"
|Тело запроса:"+Символы.ПС+рПараметры.ТелоЗапроса;
КонецЕсли;
СообщитьИВнестиВПротокол(инфо,рПротокол,рПояснять);
рМетодHTTP=?(рПараметры.Свойство("МетодHTTP"),ВРег(рПараметры.МетодHTTP),"");
Если ПустаяСтрока(рМетодHTTP) Тогда рМетодHTTP="GET" КонецЕсли;
//
Если рМетодHTTP="GET" Тогда
рОтвет=рСоединение.Получить(рЗапрос);
ИначеЕсли рМетодHTTP="POST" Тогда
рОтвет=рСоединение.ОтправитьДляОбработки(рЗапрос);
Иначе
СообщитьИВнестиВПротокол("Указан не поддерживаемый метод: "+рМетодHTTP+",никакое действие не выполняется!!",рПротокол,рПояснять);
Возврат Ложь;
КонецЕсли;
рПараметры.Вставить("HTTPОтвет",рОтвет);
Возврат Истина;
Исключение
инфо="HTTPВыполнитьЗапрос,общая ошибка: "+ОписаниеОшибки();
Сообщить(инфо,СтатусСообщения.Важное);
ЗаписьЖурналаРегистрации("Обмен",УровеньЖурналаРегистрации.Ошибка,,,инфо);
Возврат Ложь;
КонецПопытки;
КонецФункции
// Выполняет анализ ответа rest-сервиса как объекта HTTPОтвет,заносит в параметры результаты разбора.
// Возвращает успешность (булево),при ошибке возвращает Ложь.
//
// Параметры:
// HTTPОтвет - объект типа "HTTPСервисОтвет", обязательный; собственно разбираемый ответ;
// КодСостояния - число, вносимый;
// Причина - строка, вносимый; если КодСостояния 200, то пуста;
// ЗаголовкиОтвета - соответствие, вносимый;
// ТелоКакСтрока - булево; если указан и Истина, то читается тело ответа как строка, для уточнения кодировки используется ключ:
// КодировкаТелаОтвета - строка или КодировкаТекста, по умолчанию UTF8;
// ТелоКакДвоичныеДанные - булево; если указан и Истина, то читается тело ответа как двоичные данные;
// ТелоКакИмяФайла - булево; если указан и Истина, то возвращается имя файла, куда прочитано тело ответа;
// ТелоОтвета - результат чтения тела ответа, вносимый, если способ чтения тела не указан, то Неопределено;
// Протокол - текстовый документ, необязательный (по умолчанию пуст и не используется);
// Пояснять - булево; если Истина, то действия поясняются и в протокол (если ведётся), и сообщениями.
//
Функция HTTPРазобратьОтвет(рПараметры) Экспорт
Попытка
рПротокол=?(рПараметры.Свойство("Протокол"),рПараметры.Протокол,Неопределено);
рПояснять=?(рПараметры.Свойство("Пояснять"),рПараметры.Пояснять,Ложь);
Если Не (рПараметры.Свойство("HTTPОтвет") и ТипЗнч(рПараметры.HTTPОтвет)=Тип("HTTPОтвет")) Тогда
СообщитьИВнестиВПротокол("В структуре параметров не найден ответ сервиса!!",рПротокол,рПояснять);
Возврат Ложь;
КонецЕсли;
рОтвет=рПараметры.HTTPОтвет;
//
рПараметры.Вставить("КодСостояния",рОтвет.КодСостояния);
Если рОтвет.КодСостояния=200 Тогда
рПараметры.Вставить("Причина","");
Иначе
Попытка рПараметры.Вставить("Причина",рОтвет.Причина) Исключение рПараметры.Вставить("Причина","") КонецПопытки;
КонецЕсли;
рПараметры.Вставить("ЗаголовкиОтвета",рОтвет.Заголовки);
Если рПараметры.Свойство("ТелоКакСтрока") и ТипЗнч(рПараметры.ТелоКакСтрока)=Тип("Булево") и рПараметры.ТелоКакСтрока=Истина Тогда
рКодировка=КодировкаТекста.UTF8;
Если рПараметры.Свойство("КодировкаТелаОтвета") и ЗначениеЗаполнено(рПараметры.КодировкаТелаОтвета) Тогда
Если ТипЗнч(рПараметры.КодировкаТелаОтвета)=Тип("Строка") или ТипЗнч(рПараметры.КодировкаТелаОтвета)=Тип("КодировкаТекста") Тогда
рКодировка=рПараметры.КодировкаТелаОтвета;
КонецЕсли;
КонецЕсли;
рПараметры.Вставить("ТелоОтвета",рОтвет.ПолучитьТелоКакСтроку(рКодировка));
ИначеЕсли рПараметры.Свойство("ТелоКакДвоичныеДанные") и ТипЗнч(рПараметры.ТелоКакДвоичныеДанные)=Тип("Булево") и рПараметры.ТелоКакДвоичныеДанные=Истина Тогда
рПараметры.Вставить("ТелоОтвета",рОтвет.ПолучитьТелоКакДвоичныеДанные());
ИначеЕсли рПараметры.Свойство("ТелоКакИмяФайла") и ТипЗнч(рПараметры.ТелоКакИмяФайла)=Тип("Булево") и рПараметры.ТелоКакИмяФайла=Истина Тогда
рПараметры.Вставить("ТелоОтвета",рОтвет.ПолучитьИмяФайлаТела());
Иначе
СообщитьИВнестиВПротокол("Тело ответа игнорируется,т.к. его тип и способ обработки не указаны!",рПротокол,рПояснять);
рПараметры.Вставить("ТелоОтвета",Неопределено);
КонецЕсли;
//
Возврат Истина;
Исключение
инфо="HTTPРазобратьОтвет,общая ошибка: "+ОписаниеОшибки();
Сообщить(инфо,СтатусСообщения.Важное);
ЗаписьЖурналаРегистрации("Обмен",УровеньЖурналаРегистрации.Ошибка,,,инфо);
Возврат Ложь;
КонецПопытки;
КонецФункции
Важно обратить внимание на защищённые соединения и сертификаты, тут могут потребоваться небольшие доработки.
Применимо, начиная с 8.3.6.