1С 8.3 HTTP - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

1С 8.3 HTTP

HTTP в 1С 8.3 используется для передачи и получения произвольных данных, например в виде гипертекстовых документов в формате HTML. В языке программирования 1С также используются запросы (GET и POST) для обмена данными с различными веб-ресурсами, взаимодействия с веб-сервисами и прочими службами или системами. Для тестирования и отправки HTTP запросов и ответов рекомендую бесплатную консоль на УФ (сервер указывается без http!). Есть удобный HTTP-клиент для 1С:Предприятие 8.3 Коннектор (работает => 8.3.10). Подробнее про все методы HTTP запроса, их спецификацию и совместимость можно почитать здесь: https://developer.mozilla.org/ru/docs/Web/HTTP/Methods
Получение страницы сайта через HTTP запрос в 1С 8.3:
&НаКлиенте
Процедура ПолучениеСтраницыСайтаЧерезHttpЗапрос()

   
// Подключение к сайту koder.by.
    // Параметры: адрес, порт (http:80, https:443), пользователь, пароль, прокси, таймаут в секундах, защищ.соединение (для https)
   
СоединениеHTTP = Новый HTTPСоединение("koder.by", 80, , , , , );

   
// Получение текста главной страницы через запрос.
   
ЗапросHTTP = Новый HTTPЗапрос("/"); // Можно указать любую страницу например, "/services" или "/contacts"
   
РезультатЗапроса = СоединениеHTTP.Получить(ЗапросHTTP); // Get запрос

   
Сообщить("Код результата запроса: " + РезультатЗапроса.КодСостояния);
   
// Подробно про коды: https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

   
Сообщить("Текст страницы: " + РезультатЗапроса.ПолучитьТелоКакСтроку());

КонецПроцедуры

Обработка перенаправления в HTTP запросе в 1С 8.3:
&НаКлиенте
Процедура ОбработкаПеренаправленияВHttpЗапросе()

   
СоединениеHTTP = Новый HTTPСоединение("www.yandex.by", 80); // Поиск по Yandex.by

   
ЗапросHTTP = Новый HTTPЗапрос("/search/?lr=157&text=программист 1с минск"); // Текст поиска
   
РезультатЗапроса = СоединениеHTTP.Получить(ЗапросHTTP);

   
Сообщить("Код результата запроса: " + РезультатЗапроса.КодСостояния);
   
// Подробно про коды: https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

   
Если РезультатЗапроса.КодСостояния = 302 Тогда // Произошло перенаправление на другую страницу

        // Функция СтруктураURI возвращает имя, порт и путь к ресурсу.
       
СтрURI = СтруктураURI(РезультатЗапроса.Заголовки.Получить("Location"));

       
СоединениеHTTP = Новый HTTPСоединение(СтрURI.Хост, СтрURI.Порт);  // Подключение и get запрос.
       
ЗапросHTTP = Новый HTTPЗапрос(СтрURI.ПутьНаСервере);
       
РезультатЗапроса СоединениеHTTP.Получить(ЗапросHTTP); // Get запрос

        // Сохранение страницы с результатами поиска в виде html файла и тут же покажем его пользователю.
       
СоздатьКаталог(КаталогДокументов() + "\koder.by");
       
ФайлHTML = КаталогДокументов() + "\
koder.by\index.html";

       
HTMLТекст = Новый ЗаписьТекста(ФайлHTML, КодировкаТекста.UTF8);
       
HTMLТекст.Записать(Результат.ПолучитьТелоКакСтроку());
       
HTMLТекст.Закрыть();

       
// Вывод пользователю на экран
       
ЗапуститьПриложение(ФайлHTML);
    КонецЕсли;

КонецПроцедуры

Сохранение картинки с сайта через HTTP запроса в 1С 8.3:
&НаКлиенте
Процедура СохранениеКартинкиССайта()

   
// Пример: https://cdn.pixabay.com/photo/2020/03/28/11/55/easter-4976728_960_720.jpg
   
СоединениеHTTP = Новый HTTPСоединение("cdn.pixabay.com", 80);
   
ЗапросHTTP = Новый HTTPЗапрос("/photo/2020/03/28/11/55/easter-4976728_960_720.jpg");
   
РезультатЗапроса = СоединениеHTTP.Получить(ЗапросHTTP); // Get запрос

    // Запись файла easter_960_720.jpg на диск
   
СоздатьКаталог(КаталогДокументов() + "\koder.by");
   
ФайлКартинки = КаталогДокументов() + "\
koder.by\easter_960_720.jpg";
   
РезультатЗапроса.ПолучитьТелоКакДвоичныеДанные().Записать(ФайлКартинки);

   
// Показываем картинку пользователю
   
ЗапуститьПриложение(ФайлКартинки);

КонецПроцедуры

Установка заголовка HTTP запроса в 1С 8.3:
&НаКлиенте
Процедура УстановказЗаголовкаHTTPЗапроса()

   
ЗаголовкиЗапроса = Новый Соответствие;
   
ЗаголовкиЗапроса.Вставить("Data", "format=woff2");
   
ЗаголовкиЗапроса.Вставить("Base", "1C");
   
ЗаголовкиЗапроса.Вставить("Cookie", "session=701");

   
// Подключаемся к сайту.
   
СоединениеHTTP = Новый HTTPСоединение("koder.by");

   
// Получение текста страницы
   
ЗапросHTTP = Новый HTTPЗапрос("/", ЗаголовкиЗапроса); // Можно указать любую страницу например, "/services" или "/contacts"
   
РезультатЗапроса = СоединениеHTTP.Получить(ЗапросHTTP); // Get запрос

КонецПроцедуры

Установка прокси для HTTP запроса в 1С 8.3:
&НаКлиенте
Процедура УстановкаПроксиДляHTTPзапроса()

   
Proxy = Новый ИнтернетПрокси;

   
// Авторизация на сервере
   
Proxy.Пользователь = "Admin1C";
   
Proxy.Пароль = "8317";

   
// Прокси сервер прописывается для каждого протокола отдельно
   
Proxy.Установить("http", "192.168.100.2", "8080");
   
Proxy.Установить("https", "192.168.100.2", "3370");

   
СоединениеHTTP = Новый HTTPСоединение("koder.by",,,, Proxy);

КонецПроцедуры

Отправка защищенного запроса HTTPS в 1С 8.3:
&НаКлиенте
Процедура ОтправкаЗащищенногоЗапросаHTTPS()

   
// Подключение к сайту https://google.by
    // Параметры: адрес, порт (http:80, https:443), пользователь, пароль, прокси, таймаут в секундах, защищ.соединение (для https)
   
СоединениеHTTP = Новый HTTPСоединение("google.by", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());

   
// Получение текста страницы
   
ЗапросHTTP = Новый HTTPЗапрос("/");  // Можно указать любую страницу например, "/services" или "/contacts"

   
РезультатЗапроса = СоединениеHTTP.Получить(ЗапросHTTP); // Get запрос
    // Доступны РезультатЗапроса.КодСостояния или РезультатЗапроса.ПолучитьТелоКакСтроку()

КонецПроцедуры
Отправка POST запроса через HTTP в 1С 8.3:
&НаКлиенте
Процедура ОтправкаPOSTзапросаЧерезHTTP() // Отправка GET запроса к https://releases.1c.ru/total

   
СоединениеHTTP1 = Новый HTTPСоединение("releases.1c.ru",,,,,,Новый ЗащищенноеСоединениеOpenSSL());
   
ЗапросHTTP = Новый HTTPЗапрос("/total");
   
РезультатЗапроса1 = СоединениеHTTP1.Получить(ЗапросHTTP);

   
// В Cookies нам должны вернуть идентификатор сессии.
   
Cookie = РезультатЗапроса1.Заголовки.Получить("Set-Cookie");
   
Cookie = СтрЗаменить(Cookie, ";", Символы.ПС);
   
ИдентификаторСессии1 = СтрПолучитьСтроку(Cookie, 1);

   
// В результате первого GET запроса произошло перенаправление на др.страницу, перейдём на неё новым get-запросом.
   
СтраницаПеренаправление = РезультатЗапроса1.Заголовки.Получить("Location"); //РезультатЗапроса.КодСостояния

    // Разбор нового адреса по частям с помощью служебной функции СтруктураURI
   
СтрURI = СтруктураURI(СтраницаПеренаправление);
   
СоединениеHTTP2 = Новый HTTPСоединение(СтрURI.Хост, СтрURI.Порт , , , , , Новый ЗащищенноеСоединениеOpenSSL());
   
ЗапросHTTP = Новый HTTPЗапрос(СтрURI.ПутьНаСервере);
   
РезультатЗапроса2 СоединениеHTTP2.Получить(ЗапросHTTP);

   
// В cookie нам вернули второй идентификатор.
   
Cookie = РезультатЗапроса2.Заголовки.Получить("Set-Cookie");
   
Cookie = СтрЗаменить(Cookie, ";", Символы.ПС);
   
ИдентификаторСессии2 = СтрПолучитьСтроку(Cookie, 1);

   
// В результате второго Get-запроса возращена страница авторизации
    // Получаем из формы авторизации значения параметров name="lt", name="execution" и name="_eventId",
    // Чтобы сформировать код приглашения на сайт.
   
ltValue = ""; executionValue = ""; _eventIdValue = "";

   
Строки = Новый ТекстовыйДокумент;
   
Строки.УстановитьТекст(РезультатЗапроса2.ПолучитьТелоКакСтроку());
    Для
Индекс = 0 По Строки.КоличествоСтрок() Цикл
       
Строка = Строки.ПолучитьСТроку(Индекс);
        Если
Найти(Строка, "name=""lt""") > 0 Тогда
           
ltValue = ВытащитьЗначениеИзСтроки(Строка);
        ИначеЕсли
Найти(Строка, "name=""execution""") > 0 Тогда
           
executionValue = ВытащитьЗначениеИзСтроки(Строка);
        ИначеЕсли
Найти(Строка, "name=""_eventId""") > 0 Тогда
           
_eventIdValue = ВытащитьЗначениеИзСтроки(Строка);
        КонецЕсли;
    КонецЦикла;

   
// Для формирования кода приглашения нужен логин и пароль от сайта 1С:ИТС.
   
Логин1СИТС = "";
   
Пароль1СИТС = "";

    Если
Логин1СИТС = "" Или Пароль1СИТС = "" Тогда
       
Сообщить("Для продолжения укажите в коде логин и пароль от ИТС.");
        Возврат;
    КонецЕсли;

   
КодПриглашения = "inviteCode=" + "<=" + ltValue + "&execution=" + executionValue + "&_eventId=" + _eventIdValue +
   
"&username=" + Логин1СИТС + "&password=" + Пароль1СИТС;

   
// Отправка Post-запроса
   
Ресурс = "/login;" + ИдентификаторСессии2 +
   
"?service=https%3A%2F%2Fusers.v8.1c.ru%2Fdistribution%2Fpublic%2Fsecurity_check%3B" + ИдентификаторСессии1;

   
СоединениеHTTP3 = Новый HTTPСоединение("login.1c.ru", , , , , , Новый ЗащищенноеСоединениеOpenSSL());

   
ЗаголовкиЗапроса1 = Новый Соответствие;
   
ЗаголовкиЗапроса1.Вставить("Cookie", ИдентификаторСессии2);
   
ЗаголовкиЗапроса1.Вставить("Content-Type", "application/x-www-form-urlencoded;");

   
ЗапросHTTP = Новый HTTPЗапрос(Ресурс, ЗаголовкиЗапроса1);
   
ЗапросHTTP.УстановитьТелоИзСтроки(КодПриглашения);

   
РезультатЗапроса1 = СоединениеHTTP3.ОтправитьДляОбработки(ЗапросHTTP); // РезультатЗапроса.КодСостояния
   
СтраницаПеренаправление = РезультатЗапроса1.ЗаголовкиЗапроса1.Получить("Location");

   
// Для завершении авторизации переходим на следующую страницу, используя первый идентификатор сессии
   
СтрURI = СтруктураURI(СтраницаПеренаправление);

   
СоединениеHTTP4 = Новый HTTPСоединение(СтрURI.Хост, СтрURI.Порт,,,,,Новый ЗащищенноеСоединениеOpenSSL());

   
ЗаголовкиЗапроса2 = Новый Соответствие;
   
ЗаголовкиЗапроса2.Вставить("Cookie", ИдентификаторСессии1);

   
ЗапросHTTP = Новый HTTPЗапрос(СтрURI.ПутьНаСервере, ЗаголовкиЗапроса2);
   
РезультатЗапроса2 СоединениеHTTP4.Получить(ЗапросHTTP);//РезультатЗапроса.КодСостояния
   
СтраницаПеренаправление = РезультатЗапроса2.ЗаголовкиЗапроса2.Получить("Location");

КонецПроцедуры

&НаКлиенте
Функция СтруктураURI(Знач СтрокаURI) Экспорт

   
СтрокаURI = СокрЛП(СтрокаURI);

   
// Схема
   
Схема = "";
   
ТекущаяПозиция = Найти(СтрокаURI, "://");
    Если
ТекущаяПозиция > 0 Тогда
       
Схема = НРег(Лев(СтрокаURI, ТекущаяПозиция - 1));
       
СтрокаURI = Сред(СтрокаURI, ТекущаяПозиция + 3);
    КонецЕсли;

   
// Строка соединения и путь на сервере
   
СтрокаСоединения = СтрокаURI;
   
ПутьНаСервере = "";
   
ТекущаяПозиция = Найти(СтрокаСоединения, "/");
    Если
ТекущаяПозиция > 0 Тогда
       
ПутьНаСервере = Сред(СтрокаСоединения, ТекущаяПозиция + 1);
       
СтрокаСоединения = Лев(СтрокаСоединения, ТекущаяПозиция - 1);
    КонецЕсли;

   
// Авторизация и имя сервера
   
СтрокаАвторизации = "";
   
ИмяСервера = СтрокаСоединения;
   
ТекущаяПозиция = Найти(СтрокаСоединения, "@");
    Если
ТекущаяПозиция > 0 Тогда
       
СтрокаАвторизации = Лев(СтрокаСоединения, ТекущаяПозиция - 1);
       
ИмяСервера = Сред(СтрокаСоединения, ТекущаяПозиция + 1);
    КонецЕсли;

   
// Логин и пароль
   
Логин = СтрокаАвторизации;
   
Пароль = "";
   
ТекущаяПозиция = Найти(СтрокаАвторизации, ":");
    Если
ТекущаяПозиция > 0 Тогда
       
Логин = Лев(СтрокаАвторизации, ТекущаяПозиция - 1);
       
Пароль = Сред(СтрокаАвторизации, ТекущаяПозиция + 1);
    КонецЕсли;

   
// Host, port
   
Host = ИмяСервера;
   
Port = "";
   
ТекущаяПозиция = Найти(ИмяСервера, ":");
    Если
ТекущаяПозиция > 0 Тогда
       
Host = Лев(ИмяСервера, ТекущаяПозиция - 1);
       
Port = Сред(ИмяСервера, ТекущаяПозиция + 1);
    КонецЕсли;

   
РезультатЗапроса = Новый Структура;
   
РезультатЗапроса.Вставить("Схема", Схема);
   
РезультатЗапроса.Вставить("Логин", Логин);
   
РезультатЗапроса.Вставить("Пароль", Пароль);
   
РезультатЗапроса.Вставить("ИмяСервера", ИмяСервера);
   
РезультатЗапроса.Вставить("Хост", Host);
   
РезультатЗапроса.Вставить("Порт", ?(Port <> "", Число(Port), Неопределено));
   
РезультатЗапроса.Вставить("ПутьНаСервере", ПутьНаСервере);

    Возврат
РезультатЗапроса;

КонецФункции

&НаКлиенте
Функция ВытащитьЗначениеИзСтроки(ТекСтрока)

   
Положение2 = СтрДлина(ТекСтрока);
    Пока
Положение2 > 1 Цикл
        Если
Сред(ТекСтрока, Положение2, 1) = """" Тогда
            Прервать;
        КонецЕсли;
       
Положение2 = Положение2 - 1;
    КонецЦикла;

   
Положение1 = Положение2 - 1;
    Пока
Положение1 > 1 Цикл
        Если
Сред(ТекСтрока, Положение1, 1) = """" Тогда
            Прервать;
        КонецЕсли;
       
Положение1 = Положение1 - 1;
    КонецЦикла;

    Возврат
Сред(ТекСтрока, Положение1 + 1, Положение2 - Положение1 - 1);

КонецФункции
📰 Актуальные новости с тегом #Http:
  • В версии 8.3.27 реализована поддержка протокола WebSocket. Подробно.
  • В версии 8.3.26 добавлен режим обновления тонкого клиента по http без запросов пользователю (тихий режим обновления).
  • В версии 8.3.25 реализована возможность записи событий технологического журнала в формате JSON. Свойство события тех.журнала, содержащее момент возникновения события, расширяется до полного формата даты/времени, записываемом в XML формате: yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? Например: 2023-09-11T11:41:38.720014-974685.
  • В версии 8.3.23 добавлены новые методы:
    ЗаписатьЗначениеJSON(<Значение>) возвращает строку. Пример.
    ПрочитатьЗначениеJSON(<Строка>) возвращает Структура, Массив, Число, Строка, Булево, Неопределено.
    Старые методы ПрочитатьJSON и ЗаписатьJSON тоже можно продолжать использовать - они работают через объекты ЧтениеJSON и ЗаписьJSON соответственно.
  • В версии 8.3.21 реализована возможность использовать JWT-токен (стандарт RFC 7519) для авторизации в Интернет-сервисах платформы 1С:Предприятие. Также реализована возможность создания и проверки подписи JSON Web Signature (JWS).
  • Реализован объект ТокенДоступа.
    Для объекта HTTPЗапрос реализован метод ДобавитьТокенДоступа(). Для объекта ПользовательИнформационнойБазы реализовано свойство АутентифкацияТокеномДоступа.
    Для файла defaul.vrd реализован элемент <accessTokenAuthentication>.
    Для командной строки запуска тонкого клиента и веб-клиента реализованы команды /AccessToken.
  • В версии 8.3.21 в веб-клиенте реализована возможность работы с HTTP-запросами. Предоставляемые возможности ограничены возможностями веб-браузеров.
    В веб-клиенте реализована доступность объектов HTTPСоединение, HTTPЗапрос, HTTPОтвет и ЗащищенноеСоединениеOpenSSL. В веб-клиенте не поддерживаются синхронные методы объектов.
  • В версии 8.3.21 в клиентских приложениях (тонкий, мобильный, толстый и веб-клиенты) реализована возможность асинхронного использования HTTP-запросов.
    Для объекта HTTPСоединение реализованы методы ВызватьHTTPМетодАсинх(), ЗаписатьАсинх(), ИзменитьАсинх(), ОтправитьДляОбработкиАсинх(), ПолучитьАсинх(), ПолучитьЗаголовкиАсинх() и УдалитьАсинх().
    Методы ВызватьHTTPМетод(), Записать(), Изменить(), ОтправитьДляОбработки(), Получить(), ПолучитьЗаголовки() и Удалить() объекта HTTPСоединение объявлены устаревшими при работе на стороне клиентских приложений и их работа поддерживается для совместимости. Указанные методы доступны только на стороне серверных приложений.
1
комментарий
Latte
29 окт 2020
А с помощью json не напишите пример? Очень надо. В сети не могу найти
____________________
Copyright©, «Программист 1С в г.Минске», 03.05.2020
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Защищенное соединение ssl
visa
mastercard
Maestro
Яндекс деньги
Назад к содержимому