Как правильно настроить HTTPСоединение в 1С при наличии префикса в адресе сервера

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

При интеграции 1С с внешними веб-сервисами разработчики часто сталкиваются с ситуацией, когда в документации к API указан так называемый "Базовый URL" (Base URL), содержащий не только доменное имя, но и дополнительный путь. Например, https://api.aqsi.ru/pub. Попытка указать такую строку целиком в конструкторе HTTPСоединение приводит к ошибкам, так как платформа 1С ожидает там только адрес хоста. В этой статье мы подробно разберем, как правильно разделять компоненты URL, настраивать заголовки и обрабатывать ответы от современных API на примере интеграции с сервисами ККТ (на примере aQsi).

Разбор архитектуры URL и объектов 1С

Для начала проанализируем ситуацию, с которой столкнулся автор темы. Изначально работа велась с сервером blabla.ru, и путь к ресурсу был /v2/Shops/list. После обновления API адрес изменился на blabla.ru/pub. Основная ошибка заключалась в попытке создать соединение следующим образом:

Соединение = Новый HTTPСоединение("blabla.ru/pub", ...);

Давайте выясним причину, почему это не работает. Объект HTTPСоединение в 1С предназначен для установления низкоуровневого канала связи с сервером по протоколу HTTP или HTTPS. Согласно стандартам сетевого взаимодействия, соединение устанавливается с хостом (IP-адресом или доменным именем) на определенный порт. Все, что идет после первого одиночного слеша в URL, не является адресом сервера — это путь к конкретному ресурсу или скрипту внутри этого сервера.

Когда мы передаем в конструктор строку со слешем, платформа 1С автоматически "обрезает" всё лишнее, оставляя только blabla.ru. В результате запрос уходит по неверному адресу, так как префикс /pub теряется. Правильный подход заключается в разделении URL на две части:

  1. Адрес сервера: указывается в HTTPСоединение (например, api.aqsi.ru).
  2. Путь к ресурсу: указывается в HTTPЗапрос (например, /pub/v2/Shops/list).

Пошаговая настройка GET-запроса

Рассмотрим подробнее, как реализовать правильное подключение. Разберем ситуацию по шагам, используя исправленный код.

Во-первых, создадим защищенное соединение. Большинство современных сервисов (включая aQsi) работают только через протокол HTTPS. Для этого в 1С используется объект ЗащищенноеСоединениеOpenSSL.


// 1. Настройка защищенного соединения
Защита = Новый ЗащищенноеСоединениеOpenSSL();

// 2. Указываем ТОЛЬКО хост сервера
Сервер = "api.aqsi.ru"; 
Соединение = Новый HTTPСоединение(Сервер, , , , , 30, Защита);

Обратите внимание на параметр 30 в конструкторе — это таймаут соединения в секундах. Рекомендуется всегда указывать его явно, так как облачные сервисы могут отвечать с задержкой, и без таймаута сеанс 1С может "зависнуть" в ожидании ответа.

Во-вторых, подготовим объект запроса. Именно здесь мы должны объединить базовый путь API и конкретный метод.


// 3. Формируем полный путь к ресурсу, включая префикс /pub
БазовыйПуть = "/pub";
МетодAPI = "/v2/Shops/list";
ПолныйПуть = БазовыйПуть + МетодAPI;

Заголовки = Новый Соответствие;
Заголовки.Вставить("x-client-key", "Application " + APIкеу);
// Рекомендуется также указывать формат данных
Заголовки.Вставить("Accept", "application/json");

Запрос = Новый HTTPЗапрос(ПолныйПуть, Заголовки);

Нюансы авторизации и передачи заголовков

Проанализируем работу с заголовками. В API сервиса aQsi (который упоминался в поиске) авторизация происходит через заголовок x-client-key. Важно строго соблюдать формат значения: префикс Application, затем пробел, а затем сам ключ. Любая опечатка или лишний пробел в конце строки приведет к ошибке 401 Unauthorized.

Также стоит рассмотреть использование метода GET. Если нам нужно передать параметры фильтрации (например, номер страницы или ID конкретного магазина), они добавляются в строку запроса после знака вопроса. В 1С это будет выглядеть так:


ПараметрыЗапроса = "shopId=12345&status=active";
Запрос = Новый HTTPЗапрос(ПолныйПуть + "?" + ПараметрыЗапроса, Заголовки);

Обработка ответа сервера

После отправки запроса методом ВызватьHTTPМетод или Получить, мы получаем объект HTTPОтвет. Важно не просто получить строку, но и проверить статус ответа. Рассмотрим пример надежной обработки:


Попытка
    Ответ = Соединение.ВызватьHTTPМетод("GET", Запрос);
    СтатусКод = Ответ.КодСостояния;
    
    Если СтатусКод = 200 Тогда
        // Читаем тело ответа. Для корректной работы с кириллицей используем UTF-8
        ТекстОтвета = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
        
        // Разбор JSON
        Чтение = Новый ЧтениеJSON;
        Чтение.УстановитьСтроку(ТекстОтвета);
        Данные = ПрочитатьJSON(Чтение);
        Чтение.Закрыть();
        
        // Дальнейшая логика обработки данных
    Иначе
        Сообщить("Ошибка сервера: " + СтатусКод + ". Текст: " + Ответ.ПолучитьТелоКакСтроку());
    КонецЕсли;
Исключение
    Сообщить("Не удалось установить соединение с сервером. Проверьте настройки сети.");
КонецПопытки;

Важные технические замечания

При работе с защищенными соединениями (HTTPS) в 1С следует учитывать несколько критически важных моментов:

  1. Протоколы TLS: Сервисы уровня api.aqsi.ru требуют использования протоколов TLS 1.2 или выше. Если ваша 1С работает на старой операционной системе (например, Windows Server 2008 без обновлений), системные библиотеки могут не поддерживать нужный протокол шифрования, и соединение будет разорвано еще на этапе рукопожатия (handshake).
  2. Версионность API: В примере используется версия v2. Помните, что при переходе с версии v1 на v2 часто меняется не только адрес ресурса, но и структура JSON-ответа. Всегда проверяйте возвращаемые поля, так как они могут быть упакованы в дополнительные объекты метаданных (например, "data": [...]).
  3. Лимиты (Rate Limits): Публичные API часто ограничивают количество запросов в секунду. Если вы планируете получать список магазинов или чеков в цикле, добавьте небольшую паузу между запросами, используя Приостановить(1) (если это фоновое задание), чтобы избежать блокировки по IP с кодом 429 Too Many Requests.

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

← На главную