При интеграции 1С с внешними веб-сервисами программисты часто сталкиваются с требованиями безопасности, когда для каждого запроса необходимо формировать уникальный токен авторизации. Одной из составляющих такого токена нередко является полный URL запроса, который должен быть хэширован вместе с солью и секретным ключом. Однако стандартные объекты платформы 1С:Предприятие HTTPСоединение и HTTPЗапрос разделяют адрес сервера и путь к ресурсу, не предоставляя готового метода для получения итоговой строки.
В этой статье мы подробно разберем, как правильно сконструировать полный URL, какие нюансы следует учитывать при работе с портами и параметрами, а также рассмотрим использование стандартных библиотек для автоматизации этого процесса.
Рассмотрим архитектуру объектов работы с HTTP в 1С. Объект HTTPСоединение отвечает за установку канала связи с конкретным сервером (хостом), определяя протокол (через использование защищенного соединения), имя сервера и порт. Объект HTTPЗапрос, в свою очередь, инкапсулирует только относительный путь к ресурсу (URL-path) и заголовки. Платформа выполняет «склейку» этих данных непосредственно в момент вызова методов ОтправитьДляОбработки() или Получить(). До этого момента итоговая строка нигде в явном виде не хранится, поэтому нам необходимо научиться собирать её самостоятельно.
Самый простой и очевидный путь — это конкатенация строк. Однако здесь кроется множество «подводных камней», таких как лишние слеши или неправильное указание порта. Разберем правильный алгоритм сборки.
Для начала проанализируем структуру типичного 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С.
Если в вашей конфигурации установлена БСП, мы настоятельно рекомендуем использовать возможности общего модуля ОбщегоНазначенияКлиентСервер. Это позволит избежать ошибок при обработке спецсимволов и разделителей. Рассмотрим функции, которые помогут нам решить задачу.
Функция ОбщегоНазначенияКлиентСервер.Строка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);
Выясним еще одну важную деталь: часто параметры запроса (идущие после знака вопроса) также должны входить в состав URL для формирования хэша. В 1С они обычно добавляются в строку ресурса при создании объекта HTTPЗапрос. Посмотрим на пример формирования ресурса с параметрами:
ПараметрыЗапроса = Новый Соответствие;
ПараметрыЗапроса.Вставить("user_id", "12345");
ПараметрыЗапроса.Вставить("format", "json");
СтрокаПараметров = "";
Для Каждого ТекПараметр Из ПараметрыЗапроса Цикл
СтрокаПараметров = СтрокаПараметров + ?(ПустаяСтрока(СтрокаПараметров), "", "&")
+ ТекПараметр.Ключ + "=" + ТекПараметр.Значение;
КонецЦикла;
ОтносительныйРесурс = "/api/method?" + СтрокаПараметров;
Запрос = Новый HTTPЗапрос(ОтносительныйРесурс);
// Теперь этот же ОтносительныйРесурс используем для сборки полного URL для токена
ПолныйURLДляХэша = "https://" + Сервер + ОтносительныйРесурс;
Обратите внимание: если значения параметров содержат кириллицу или пробелы, их необходимо предварительно закодировать с помощью функции КодироватьСтроку() с типом СпособКодированияСтроки.КодировкаURL.
Разберем завершающий этап — создание токена Z из условий задачи. Нам потребуется объект ХешированиеДанных. Проанализируем пример функции, которая принимает строку S и возвращает результат хэширования в формате Hex (шестнадцатеричном представлении).
// Предположим, строка S уже собрана как C + "." + Y + "." + D + "." + ПолныйURL
ХешОбъект = Новый ХешированиеДанных(ХешФункция.SHA256);
ХешОбъект.Добавить(СтрокаS);
// Получаем хэш-сумму
ХешСумма = ХешОбъект.ХешСумма; // Это двоичные данные
// Преобразуем в строку и удаляем пробелы
ЗначениеZ = СтрЗаменить(Строка(ХешСумма), " ", "");
ЗначениеZ = НРег(ЗначениеZ); // Обычно требуется нижний регистр
Критически важно: Перед хэшированием убедитесь в кодировке строки. Большинство внешних API ожидают строку в кодировке UTF-8. Платформа 1С при работе со строками внутри себя использует Unicode, но объект ХешированиеДанных корректно обрабатывает текстовые данные. Однако, если вы передаете в Добавить() не строку, а двоичные данные, убедитесь, что они получены из строки именно в кодировке UTF-8.
Подведем итоги нашего анализа и выделим основные правила формирования полного URL для систем авторизации:
/API/Get, то и в строке для хэша должно быть /API/Get.СтрНачинаетсяС() или СтрЗаканчиваетсяНа() для проверки наличия разделителей.D в вашей задаче) используйте явное форматирование Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd"), чтобы избежать влияния региональных настроек сервера 1С.Применяя эти шаги, вы сможете корректно реализовать взаимодействие с любым современным API, требующим подписи запросов на основе их полного адреса.