Как получить или сформировать полный URL из HTTP-соединения и HTTP-запроса в 1С

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

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

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

Почему в 1С нет готового метода для получения полного URL

Рассмотрим архитектуру объектов работы с HTTP в 1С. Объект HTTPСоединение отвечает за установку канала связи с конкретным сервером (хостом), определяя протокол (через использование защищенного соединения), имя сервера и порт. Объект HTTPЗапрос, в свою очередь, инкапсулирует только относительный путь к ресурсу (URL-path) и заголовки. Платформа выполняет «склейку» этих данных непосредственно в момент вызова методов ОтправитьДляОбработки() или Получить(). До этого момента итоговая строка нигде в явном виде не хранится, поэтому нам необходимо научиться собирать её самостоятельно.

Вариант 1: Ручная сборка строки URL

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

Для начала проанализируем структуру типичного URL: Протокол://Сервер:Порт/ПутьКРесурсу?Параметры. Нам нужно извлечь данные из имеющихся объектов и соединить их. Проанализируем следующий пример кода:


// Исходные данные
Сервер = "api.myservice.com";
Порт = 443;
Ресурс = "v1/orders/get";
ИспользоватьSSL = Истина; // ЗащищенноеСоединениеOpenSSL

// Формируем протокол
Протокол = ?(ИспользоватьSSL, "https://", "http://");

// Формируем порт (указываем, только если он не стандартный)
СтрокаПорта = "";
Если (ИспользоватьSSL И Порт <> 443) ИЛИ (НЕ ИспользоватьSSL И Порт <> 80) Тогда
    СтрокаПорта = ":" + Формат(Порт, "ЧГ=0");
КонецЕсли;

// Убираем возможный лидирующий слеш в ресурсе, чтобы не получить двойной слеш при склейке
Если Лев(Ресурс, 1) = "/" Тогда
    Ресурс = Сред(Ресурс, 2);
КонецЕсли;

ПолныйURL = Протокол + Сервер + СтрокаПорта + "/" + Ресурс;

Важный момент: если ваш сервер при проверке подписи ожидает порт всегда (даже 443 или 80), его следует включать в строку в любом случае. Рекомендуем уточнить этот момент в документации к API или проверить через аналог Postman на платформе 1С.

Вариант 2: Использование функций БСП (Библиотека стандартных подсистем)

Если в вашей конфигурации установлена БСП, мы настоятельно рекомендуем использовать возможности общего модуля ОбщегоНазначенияКлиентСервер. Это позволит избежать ошибок при обработке спецсимволов и разделителей. Рассмотрим функции, которые помогут нам решить задачу.

Функция ОбщегоНазначенияКлиентСервер.СтрокаURL() является наиболее надежным инструментом. Она автоматически обрабатывает протоколы, порты и слеши между компонентами адреса.


// Пример использования функций БСП
Протокол = "https";
Сервер = "api.test-server.ru";
Порт = 8080;
Ресурс = "api/v2/calculate";

ПолныйURL = ОбщегоНазначенияКлиентСервер.СтрокаURL(Протокол, Сервер, Порт, Ресурс);
// Результат: https://api.test-server.ru:8080/api/v2/calculate

Если у вас уже есть частичная строка URL, и вы хотите убедиться в её корректности, можно воспользоваться разбором в структуру URI и обратной сборкой:


СтруктураURI = ОбщегоНазначенияКлиентСервер.СтруктураURI(ИсходнаяСтрока);
// Можно программно изменить части URI
СтруктураURI.Порт = 443;
ИтоговыйURL = ОбщегоНазначенияКлиентСервер.URIИзСтруктуры(СтруктураURI);

Обработка параметров запроса (GET-параметры)

Выясним еще одну важную деталь: часто параметры запроса (идущие после знака вопроса) также должны входить в состав URL для формирования хэша. В 1С они обычно добавляются в строку ресурса при создании объекта HTTPЗапрос. Посмотрим на пример формирования ресурса с параметрами:


ПараметрыЗапроса = Новый Соответствие;
ПараметрыЗапроса.Вставить("user_id", "12345");
ПараметрыЗапроса.Вставить("format", "json");

СтрокаПараметров = "";
Для Каждого ТекПараметр Из ПараметрыЗапроса Цикл
    СтрокаПараметров = СтрокаПараметров + ?(ПустаяСтрока(СтрокаПараметров), "", "&") 
        + ТекПараметр.Ключ + "=" + ТекПараметр.Значение;
КонецЦикла;

ОтносительныйРесурс = "/api/method?" + СтрокаПараметров;
Запрос = Новый HTTPЗапрос(ОтносительныйРесурс);

// Теперь этот же ОтносительныйРесурс используем для сборки полного URL для токена
ПолныйURLДляХэша = "https://" + Сервер + ОтносительныйРесурс;

Обратите внимание: если значения параметров содержат кириллицу или пробелы, их необходимо предварительно закодировать с помощью функции КодироватьСтроку() с типом СпособКодированияСтроки.КодировкаURL.

Формирование хэша SHA-256 на основе полученного URL

Разберем завершающий этап — создание токена Z из условий задачи. Нам потребуется объект ХешированиеДанных. Проанализируем пример функции, которая принимает строку S и возвращает результат хэширования в формате Hex (шестнадцатеричном представлении).


// Предположим, строка S уже собрана как C + "." + Y + "." + D + "." + ПолныйURL
ХешОбъект = Новый ХешированиеДанных(ХешФункция.SHA256);
ХешОбъект.Добавить(СтрокаS);

// Получаем хэш-сумму
ХешСумма = ХешОбъект.ХешСумма; // Это двоичные данные

// Преобразуем в строку и удаляем пробелы
ЗначениеZ = СтрЗаменить(Строка(ХешСумма), " ", "");
ЗначениеZ = НРег(ЗначениеZ); // Обычно требуется нижний регистр

Критически важно: Перед хэшированием убедитесь в кодировке строки. Большинство внешних API ожидают строку в кодировке UTF-8. Платформа 1С при работе со строками внутри себя использует Unicode, но объект ХешированиеДанных корректно обрабатывает текстовые данные. Однако, если вы передаете в Добавить() не строку, а двоичные данные, убедитесь, что они получены из строки именно в кодировке UTF-8.

Резюме и практические советы

Подведем итоги нашего анализа и выделим основные правила формирования полного URL для систем авторизации:

  1. Соблюдайте регистр: URL-адреса часто чувствительны к регистру. Если вы выполняете запросы 1С через REST API и используете /API/Get, то и в строке для хэша должно быть /API/Get.
  2. Следите за слешами: Между доменом и путем должен быть ровно один слеш. Используйте функции СтрНачинаетсяС() или СтрЗаканчиваетсяНа() для проверки наличия разделителей.
  3. Учитывайте порт: Если ваше соединение использует нестандартный порт, он обязан присутствовать в итоговом URL.
  4. Используйте БСП: Если есть возможность, переложите сборку URI на плечи стандартных модулей — это сэкономит время на отладку «глупых» ошибок форматирования.
  5. Формат даты: При добавлении даты (параметр D в вашей задаче) используйте явное форматирование Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd"), чтобы избежать влияния региональных настроек сервера 1С.

Применяя эти шаги, вы сможете корректно реализовать взаимодействие с любым современным API, требующим подписи запросов на основе их полного адреса.

← На главную