При интеграции 1С с внешними веб-сервисами разработчики часто сталкиваются с ситуацией, когда в документации к API указан так называемый "Базовый URL" (Base URL), содержащий не только доменное имя, но и дополнительный путь. Например, https://api.aqsi.ru/pub. Попытка указать такую строку целиком в конструкторе HTTPСоединение приводит к ошибкам, так как платформа 1С ожидает там только адрес хоста. В этой статье мы подробно разберем, как правильно разделять компоненты URL, настраивать заголовки и обрабатывать ответы от современных API на примере интеграции с сервисами ККТ (на примере aQsi).
Для начала проанализируем ситуацию, с которой столкнулся автор темы. Изначально работа велась с сервером blabla.ru, и путь к ресурсу был /v2/Shops/list. После обновления API адрес изменился на blabla.ru/pub. Основная ошибка заключалась в попытке создать соединение следующим образом:
Соединение = Новый HTTPСоединение("blabla.ru/pub", ...);
Давайте выясним причину, почему это не работает. Объект HTTPСоединение в 1С предназначен для установления низкоуровневого канала связи с сервером по протоколу HTTP или HTTPS. Согласно стандартам сетевого взаимодействия, соединение устанавливается с хостом (IP-адресом или доменным именем) на определенный порт. Все, что идет после первого одиночного слеша в URL, не является адресом сервера — это путь к конкретному ресурсу или скрипту внутри этого сервера.
Когда мы передаем в конструктор строку со слешем, платформа 1С автоматически "обрезает" всё лишнее, оставляя только blabla.ru. В результате запрос уходит по неверному адресу, так как префикс /pub теряется. Правильный подход заключается в разделении URL на две части:
HTTPСоединение (например, api.aqsi.ru).HTTPЗапрос (например, /pub/v2/Shops/list).Рассмотрим подробнее, как реализовать правильное подключение. Разберем ситуацию по шагам, используя исправленный код.
Во-первых, создадим защищенное соединение. Большинство современных сервисов (включая 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С следует учитывать несколько критически важных моментов:
api.aqsi.ru требуют использования протоколов TLS 1.2 или выше. Если ваша 1С работает на старой операционной системе (например, Windows Server 2008 без обновлений), системные библиотеки могут не поддерживать нужный протокол шифрования, и соединение будет разорвано еще на этапе рукопожатия (handshake).v2. Помните, что при переходе с версии v1 на v2 часто меняется не только адрес ресурса, но и структура JSON-ответа. Всегда проверяйте возвращаемые поля, так как они могут быть упакованы в дополнительные объекты метаданных (например, "data": [...]).Приостановить(1) (если это фоновое задание), чтобы избежать блокировки по IP с кодом 429 Too Many Requests.Подводя итог, мы видим, что корень проблемы лежал в смешении понятий "адрес сервера" и "путь к ресурсу". Разделение этих сущностей и правильное использование объектов HTTPСоединение и HTTPЗапрос позволяет гибко настраивать интеграцию с любыми современными веб-сервисами, поддерживающими базовые префиксы в URL.