Не секрет, что платформа 1С8 (8.2, 8.3) неполноценно поддерживает методы PUT и DELETE в объекте HTTPСоединение.
Два дня поиска решения в Интернет привели к выводу использовать COMОбъект WinHttpRequest. Я уж было обрадовался, что раздобыл такой интереснейший инструментик, но и тут меня ожидал сюрприз: не все сайты поддерживают свойство этого объекта SetCredentials.
Суть в том, что сервер должен запросить авторизацию и только тогда свойство SetCredentials(ИмяПользователя, Пароль, 0) сработает.
Спасибо пользователю torgm, который в ветке http://www.forum.mista.ru/topic.php?id=654266 описал свои поиски для платформы 7.7. Суть его доработки заключается в добавлении заголовка "Autorization" для WinHttpRequest с одновременным кодированием строки "ИмяПользователя:Пароль" в base64.
Итого: здесь я выкладываю рабочий код для платформ 8.2/8.3 (проверено на последних (или почти последних) релизах платформ.
Прикрепленная обработка включает в себя работу:
- со стандартным HTTPСоединение (в синтаксисе работы с запросом, т.к. для меня было важно при ошибке 400 не вылетать с исключением);
- метода DELETE с передачей тела запроса (именно то, что не умеет делать 1С) с использованием WinHttpRequest;
- ну и стандартного GET, который 1С поддерживает на ура.
Преобразование в base64, слава Богу, делается стандартными средствами 1С:
Функция Кодировать(СтрокаКодирования)
ИмяОченьВременногоФайла = ПолучитьИмяВременногоФайла();
ЗаписьТекста = Новый ЗаписьТекста(ИмяОченьВременногоФайла, СокрЛП(Кодировка));
ЗаписьТекста.Записать(СтрокаКодирования);
ЗаписьТекста.Закрыть();
ЗакодированнаяСтрока = Base64Строка(Новый ДвоичныеДанные(ИмяОченьВременногоФайла));
Попытка
УдалитьФайлы(ИмяОченьВременногоФайла);
Исключение
Возврат СтрокаКодирования;
КонецПопытки;
Возврат ЗакодированнаяСтрока;
КонецФункции
Обращение к приведенной выше функции происходит в процедуре, в которой требуется авторизация для объекта WinHttpRequest:
Процедура ЗапросНаУдаление()
//Только для удаления вагона надо воспользоваться сторонними механизмами,
//т.к. методы PUT и DELETE не поддерживаются объектом HTTPСоединение
WinHttpReq = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
Если WinHttpReq = Неопределено Тогда
Сообщить("Ошибка создания объекта WinHTTP... Обработка прервана.");
Возврат;
КонецЕсли;
//Скриптовальщик = Новый COMОбъект("MSScriptControl.ScriptControl");
//Если Скриптовальщик = Неопределено Тогда
// Сообщить("Ошибка создания объекта MSScriptControl... Обработка прервана.");
// Возврат;
//КонецЕсли;
//Скриптовальщик.language="javascript";
//Скриптовальщик.AddObject("WinHttp", WinHttpReq);
//Скриптовальщик.Eval("WinHttp.Option(2)=1251");
//Скриптовальщик = Неопределено;
WinHttpReq.Open("DELETE", "http://" + СокрЛП(АдресСервера) + "/" + СокрЛП(АдресРесурса));
WinHttpReq.setRequestHeader("Content-Charset", СокрЛП(Кодировка));
WinHttpReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=" + СокрЛП(Кодировка));
WinHttpReq.SetRequestHeader("Content-Length", СокрЛП(СтрДлина(СокрЛП(СтрокаЗапроса))));
WinHttpReq.SetRequestHeader("Authorization"," Basic " + Кодировать(СокрЛП(ЛогинНаСервер) + ":" + СокрЛП(ПарольНаСервер)));
ТелоЗапроса = СокрЛП(СтрокаЗапроса);
WinHttpReq.Send(ТелоЗапроса);
Статус = WinHttpReq.Status;
Если Статус = 200 Тогда
//Все ок, ничего не делаем
ИначеЕсли Статус = 401 Тогда
//некорректная авторизация
Сообщить("Возможно, Вы ввели неправильный логин и (или) пароль. Обработка прервана.");
ИначеЕсли Статус = 407 Тогда
//Надо авторизоваться на прокси сервере
//WinHttpReq.SetProxy();
//WinHttpReq.SetCredentials("", "", 1);
Сообщить("Разработчик не предусмотрел использование прокси-сервера. Обработка прервана.");
КонецЕсли;
Сообщить("" + СокрЛП(WinHttpReq.Status) + " " + СокрЛП(WinHttpReq.StatusText));
ТекстОтвета = СокрЛП(WinHttpReq.ResponseText());
Если НЕ ТекстОтвета = "" Тогда
Сообщить(WinHttpReq.ResponseText());
КонецЕсли;
WinHttpReq = Неопределено;
КонецПроцедуры
Удачи всем в поисках истины!