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Запрос()
// Подключение к сайту 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Запросе()
Соединение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";
РезультатЗапроса.ПолучитьТелоКакДвоичныеДанные().Записать(ФайлКартинки);
// Показываем картинку пользователю
ЗапуститьПриложение(ФайлКартинки);
КонецПроцедуры
Процедура СохранениеКартинкиССайта()
// Пример: 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Запроса()
ЗаголовкиЗапроса = Новый Соответствие;
ЗаголовкиЗапроса.Вставить("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);
КонецПроцедуры
Процедура УстановкаПроксиДля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 запрос
// Доступны РезультатЗапроса.КодСостояния или РезультатЗапроса.ПолучитьТелоКакСтроку()
КонецПроцедуры
Процедура ОтправкаЗащищенногоЗапроса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);
КонецФункции
Процедура Отправка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);
КонецФункции
💡 Шаблоны (готовые модели) кода 1С 8.3 с тегом #HTTP:
📰 Актуальные новости с тегом #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 не напишите пример? Очень надо. В сети не могу найти
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник