Как правильно настроить HTTP-запрос в 1С: работа с портами, авторизация и просмотр полного URL для отладки?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Работа с HTTP-сервисами и внешними API — неотъемлемая часть задач современного разработчика 1С. Однако, несмотря на кажущуюся простоту объектов платформы, при их использовании часто возникают архитектурные ошибки. В этой статье мы подробно разберем вопросы, возникшие у автора: как правильно разделять адрес сервера и ресурс, куда прописывать нестандартные порты, как упростить код авторизации и, самое главное, как увидеть, какой именно URL платформа отправляет "наружу". Для тех, кто хочет закрепить базу, рекомендуем пройти интерактивный обучающий курс HTTP-QUEST, который охватывает основы работы с методами и заголовками.

Давайте проанализируем ситуацию шаг за шагом и создадим корректный, профессиональный код. Если же ваша задача — не только отправлять запросы, но и проектировать собственные API, обратите внимание на опыт быстрой организации HTTP-сервисов с помощью универсальных модулей.

Архитектура HTTP-взаимодействие в 1С: Соединение и Запрос

Первая и самая грубая ошибка, которую мы часто наблюдаем (и которая была допущена в примере автора), связана с непониманием того, как платформа разделяет ответственность между объектами.

В платформе 1С существует два ключевых объекта для выполнения запросов:

  1. HTTPСоединение — отвечает за установку транспортного канала (TCP/IP туннеля) до конкретного сервера.
  2. HTTPЗапрос — описывает, что именно мы хотим получить внутри этого канала (какой ресурс, с какими параметрами).

Рассмотрим ошибку из вопроса. Автор пытался указать порт непосредственно в строке адреса ресурса:


// ОШИБКА: Порт указан не там, где нужно
Запрос = Новый HTTPЗапрос(":666/query-create-referral?format=json", Заголовки);

Почему это неправильно? Потому что протокол HTTP подразумевает, что соединение устанавливается с хостом на определенный порт. А строка запроса (Request URI) отправляется уже внутри установленного соединения. Если вы укажете порт в HTTPЗапрос, сервер, скорее всего, воспримет :666 как часть имени папки или файла, что приведет к ошибке 404 (Resource Not Found) или 400 (Bad Request).

Правильное решение:

Порт является свойством соединения. Мы должен указать его в конструкторе HTTPСоединение третьим параметром. Давайте исправим код:


// Правильная инициализация соединения
Сервер = "kudamnenado.ru";
Порт = 666; // Порт указываем здесь!
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();

Соединение = Новый HTTPСоединение(Сервер, Порт, , , , , ЗащищенноеСоединение);

// В запросе оставляем только путь к ресурсу
АдресРесурса = "/query-create-referral?format=json";
Запрос = Новый HTTPЗапрос(АдресРесурса);

Теперь платформа знает, что нужно постучаться на kudamnenado.ru по порту 666, и после установки связи попросить ресурс /query-create-referral....

Упрощение авторизации (Basic Auth)

Во втором вопросе автор привел пример ручного формирования заголовка авторизации. Давайте посмотрим на этот код:


// Избыточный код автора
Логин="login";
Пароль="pass";
Basic = Логин + ":" + Пароль;
Basic = Base64Строка(ПолучитьДвоичныеДанныеИзСтроки(Basic));
Заголовки.Вставить("Authorization", "Basic " + Basic);

Этот подход работает, но он избыточен. Платформа 1С умеет самостоятельно работать с базовой аутентификацией (Basic Authentication). Мы можем передать логин и пароль прямо в конструктор HTTPСоединение (параметры 5 и 6).

Давайте оптимизируем код. Платформа сама сформирует нужный заголовок, закодирует его в Base64 и отправит серверу:


Сервер = "kudamnenado.ru";
Порт = 666;
Пользователь = "login";
Пароль = "pass";
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();

// Передаем пользователя и пароль в конструктор
Соединение = Новый HTTPСоединение(
    Сервер, 
    Порт, 
    Пользователь, 
    Пароль, 
    , 
    , 
    ЗащищенноеСоединение
);

Запрос = Новый HTTPЗапрос("/query-create-referral?format=json");
// Заголовки авторизации добавятся автоматически при отправке

Исключение составляют случаи, когда API требует сложных механизмов, например, если вам необходимо реализовать Google OAuth 2.0 на обычных формах или использовать Bearer-токены. Но для классического Basic лучше использовать штатные средства.

Как посмотреть полный URL запроса?

Теперь перейдем к самому интересному вопросу: "Как посмотреть всю URL запроса?".

В объекте HTTPЗапрос нет метода вроде .ПолучитьПолныйURL(). Это связано с тем, что сам по себе объект запроса ничего не знает о сервере, к которому он будет отправлен. Один и тот же HTTPЗапрос можно отправить через разные объекты HTTPСоединение на разные серверы.

Мы разберем три способа узнать полный адрес, от простого к профессиональному.

Способ 1: Программная "склейка" (для логов внутри 1С)

Если вам нужно просто вывести строку в Журнал регистрации для отладки, нам придется собрать её вручную, используя данные, которые у нас есть при создании объектов.


ПолныйURL = "https://" + Сервер + ":" + Формат(Порт, "ЧГ=") + АдресРесурса;
ЗаписьЖурналаРегистрации("ОтладкаHTTP", , , , "Отправляем запрос на: " + ПолныйURL);

Это самый простой метод, но он не показывает, что реально уходит в сеть. Если вы ошиблись в коде, строка может быть правильной, а запрос не уйдет.

Способ 2: Использование прокси-сниффера (Fiddler / Charles)

Это наиболее профессиональный способ отладки. Чтобы увидеть реальный трафик (заголовки, тело, полные URL, ответы сервера), мы можем завернуть трафик 1С через отладочный прокси-сервер.

Для перехвата установите программу (например, Fiddler Classic) и настройте HTTPСоединение на работу через неё. Обычно Fiddler слушает порт 8888 на localhost.


// Настройка прокси для перехвата трафика
Прокси = Новый ИнтернетПрокси;
Прокси.Установить("https", "127.0.0.1", 8888); 
// Для http используйте Прокси.Установить("http", "127.0.0.1", 8888);

Соединение = Новый HTTPСоединение(
    Сервер, 
    Порт, 
    Пользователь, 
    Пароль, 
    Прокси, // Передаем прокси пятым параметром
    , 
    ЗащищенноеСоединение
);

Важно: При работе с HTTPS через Fiddler вам потребуется установить корневой сертификат Fiddler в доверенные сертификаты ОС или настроить ЗащищенноеСоединениеOpenSSL так, чтобы оно игнорировало ошибки сертификатов (для среды разработки).

Способ 3: Технологический журнал

Если нет возможности менять код или ставить сторонний софт (например, на рабочем сервере), можно включить Технологический журнал (ТЖ) платформы. Нам нужно настроить сбор событий SCALL со свойством Network. Чтобы анализ логов был более комфортным, рекомендуем использовать методику, позволяющую убрать лишние переносы строк в событиях технологического журнала.

В логах ТЖ вы увидите подобные записи, где будет виден и хост, и URI:

p:target='kudamnenado.ru:666',p:processName='query-create-referral?format=json'

Работа с SSL (HTTPS) и самоподписанными сертификатами

В примере используется Новый ЗащищенноеСоединениеOpenSSL(). Обратите внимание, что конструктор без параметров будет использовать системное хранилище сертификатов Windows (или Linux).

Если вы обращаетесь к тестовому стенду с самоподписанным сертификатом, запрос может завершиться ошибкой. Чтобы это обойти, можно использовать сертификаты из файла:


// Пример использования конкретного файла сертификата
СертификатКлиента = Новый СертификатКлиентаWindows(); 
СертификатыУдостоверяющихЦентров = Новый СертификатыУдостоверяющихЦентровФайл("C:\Cert\my_root_ca.cer");

ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(
    СертификатКлиента, 
    СертификатыУдостоверяющихЦентров
);

Итоговый пример кода

Соберем все рекомендации воедино. Вот как должен выглядеть надежный код для отправки запроса:


Процедура ВыполнитьЗапросКСерверу()
    
    // 1. Параметры подключения
    Сервер = "kudamnenado.ru";
    Порт = 666;
    Ресурс = "/query-create-referral?format=json";
    Логин = "User";
    Пасс = "P@ssword";
    
    // 2. Настройка SSL
    SSL = Новый ЗащищенноеСоединениеOpenSSL();
    
    // 3. Создание соединения (Порт и Auth здесь!)
    Попытка
        Соединение = Новый HTTPСоединение(
            Сервер, 
            Порт, 
            Логин, 
            Пасс, 
            , // Прокси, если нужно
            10, // Таймаут
            SSL
        );
        
        // 4. Создание запроса (Только ресурс!)
        Запрос = Новый HTTPЗапрос(Ресурс);
        
        // Доп. заголовки, если нужны
        Запрос.Заголовки.Вставить("Content-Type", "application/json");
        
        // 5. Выполнение
        Ответ = Соединение.Получить(Запрос);
        
        Сообщить("Код ответа: " + Ответ.КодСостояния);
        Сообщить("Тело ответа: " + Ответ.ПолучитьТелоКакСтроку());
        
    Исключение
        Сообщить("Не удалось выполнить запрос: " + ОписаниеОшибки());
    КонецПопытки;

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

Используя такой подход, вы избежите путаницы с URL, обеспечите правильную авторизацию и сможете легко поддерживать код в будущем.

← На главную