На написание этой статьи сподвигли два фактора:
1. Весной 2013 в версии платформы 8.2.18 появились новые возможности языка:
Реализована возможность работы с заголовками HTTP-запросов, обработки кодов возврата, получения и установки тела запроса в виде строки или двоичных данных. Реализованы объекты HTTPЗапрос, HTTPОтвет.
В объекте HTTPСоединение реализованы следующие изменения:
Методы Записать(), ОтправитьДляОбработки(), Получить(), Удалить() возвращают значение типа HTTPОтвет;
Для методов Записать(), ОтправитьДляОбработки(), Получить(), Удалить() реализован синтаксис, позволяющий использовать программно сформированный HTTP-запрос.
2. В декабре 2013 из 1С-зазеркалья вышли две новости:
Автоматический REST интерфейс прикладных решений http://v8.1c.ru/o7/201312rest/index.htm и HTTP-сервисы в прикладном решении http://v8.1c.ru/o7/201312http/index.htm
Т.е. скоро мы получим инструмент с возможностями COM-соединения и WEB-сервисов одновременно. Задачи интеграции станут интереснее, появятся новые возможности, а это не может не радовать true-программиста! Поскольку для работы со сторонними REST сервисами можно использовать имеющиеся в платформе средства работы с HTTP: объекты HTTPСоединение, HTTPЗапрос и HTTPОтвет, предлагаю рассмотреть эти методы чуть подробней, а в конце решить прикладную задачку: программно авторизоваться на страничке https://users.v8.1c.ru/distribution/total, распарсить ее и заполнить справочники Программы и Версии. Результат прикреплен к этой статье в виде конфигурации. Запускать ее можно на платформе не ниже 8.2.18.
Что такое HTTP - запросы? Мы с ними сталкиваемся каждый день.
Для начала предлагаю открыть Инструменты разработчика в браузере Yandex - кнопками Ctrl-Shift-I и перейти на закладку Network - именно здесь можно увидеть содержимое HTTP-запросов
Например, когда в браузере вводим адрес сайта https://login.1c.ru/login, на сервер уходит HTTP-запрос типа GET:
Request URL: https://login.1c.ru/login
Request Method: GET
Request Headers:
Host: login.1c.ru
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.12785 YaBrowser/13.12.1599.12785 Safari/537.36
Accept-Encoding: gzip,deflate,sdch Accept-Language: ru,en;q=0.8
В 1С у HTTP-запроса типа GET есть вполне конкретный аналог: метод объекта HTTPСоединение.Получить(<HTTPЗапрос>)
А у объекта HTTPЗапрос есть свойства:
АдресРесурса типа Строка (он же Request URL)
и Заголовки типа Соответствие (он же Request Headers)
В ответ на этот запрос сервер возвращает браузеру HTTP-ответ:
Status Code: 200
Responce Headers:
Server: nginx
Date: Tue, 04 Feb 2014 07:36:25 GMT
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Pragma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Cache-Control: no-cache
Cache-Control: no-store
Set-Cookie: JSESSIONID=AAEB3E82351662F43E37CE3F64B7795E.login1c8010; Path=/; Secure; HttpOnly
Content-Language: ru
Content-Encoding: gzip
И тело ответа, в котором содержится код запрошенной страницы на HTML (см закладку Response в Инструментах разработчика Yandex браузера)
В 1С метод HTTPСоединение.Получить(<HTTPЗапрос>) возвращает объект типа HTTPОтвет, у которого соответственно есть свойства:
КодСостяния (он же Status Code)
Заголовки (он же Responce Headers)
и метод ПолучитьТелоКакСтроку() (он же тело ответа - Response)
Когда на страничке https://login.1c.ru/login вводим логин/пароль и нажимаем кнопку Войти, то на сервер уходит HTTP-запрос типа POST:
Request URL: https://login.1c.ru/login;jsessionid=AAEB3E82351662F43E37CE3F64B7795E.login1c8010
Request Method: POST
Request Headers:
POST /login;jsessionid=AAEB3E82351662F43E37CE3F64B7795E.login1c8010 HTTP/1.1
Host: login.1c.ru
Connection: keep-alive
Content-Length: 122
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: https://login.1c.ru
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.12785 YaBrowser/13.12.1599.12785 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: https://login.1c.ru/login
Accept-Encoding: gzip,deflate,sdch
Accept-Language: ru,en;q=0.8
Cookie: JSESSIONID=AAEB3E82351662F43E37CE3F64B7795E.login1c8010
Form Data или Request Body или Тело запроса:
inviteCode=<=LT-43557-KdRxeZdJGp2n25STSoj6meIPL09eYv&execution=e1s1&_eventId=submit&username=Barelpro&password=123
В 1С у HTTP-запроса типа POST есть вполне конкретный аналог: метод объекта HTTPСоединение.ОтправитьДляОбработки(<HTTPЗапрос>)
А у объекта HTTPЗапрос, кроме свойств АдресРесурса и Заголовки можно задать тело запроса (Request Body) с помощью метода УстановитьТелоИзСтроки()
Дальнейший парсинг странички https://users.v8.1c.ru/distribution/total я делал через объект ПостроительDOM в рекурсивной процедуре РекурсивныйПарсингСпискаКонфигураций(), а парсинг страниц с версиями делал в рекурсивной процедуре РекурсивныйПарсингСпискаВерсий().
Для запуска обработки ЗагрузкаПрограммИВерсий используйте кнопку "Загрузить" в командной панели справочника Программы. В обработке заполните поля логин/пароль для доступа к сайту 1С и нажмите по очереди кнопки "Загрузить программы" и "Загрузить версии".
В общем, как видите, в доступе к запароленным сайтам нет ничего сложного, пользуйтесь на здоровье, удачи!
PS от 01.09.2014. Выпущена версия 2. 1С слегка изменила алгоритм авторизации, пришлось слегка переписать код, попутно удалось уменьшить количество запросов с 8 до 4.
PS от 27.08.2015. Выпущена версия 3. 1С изменила дизайн и адреса.
PS от 02.09.2015. Выпущена версия 4. 1С изменила авторизацию.
PS от 08.09.2015. Выпущена версия 5. Оптимизирован код. Заменены методы рекурсивных парсингов на конструкции ПолучитьЭлементПоИдентификатору и ПолучитьЭлементыПоИмени. Старые функции остались закоментированными.
PS от 12.02.2018. Выпущена версия 6. 1С изменила авторизацию.
PS от 27.12.2019. Выпущена версия 8. 1С изменила авторизацию.