Как перенести выполнение HTTP-запроса из Postman в код 1С?

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

Часто при интеграции 1С с внешними системами разработчики получают готовую коллекцию в Postman, которая успешно выполняет запросы к серверу. Однако перенос этих настроек в программный код 1С может вызвать затруднения, особенно в части работы с заголовками авторизации, передачи тела запроса в формате XML и обработки полученных ответов. В этой статье мы подробно разберем, как трансформировать данные из Postman в полноценный программный механизм на стороне 1С.

Анализируем исходные данные из Postman

Для начала проанализируем структуру типичного JSON-файла запроса из Postman. В нашем распоряжении есть метод POST, адрес сервера api.mychtoto.ru, путь к ресурсу /api/v1/1c/counterparties и специфический заголовок x-auth-token-1c. Также указано, что тело запроса передается в формате raw с типом контента xml. Наша задача — последовательно воспроизвести эти параметры с помощью объектов платформы 1С.

Шаг 1. Создание защищенного соединения

Поскольку в URL запроса указан протокол https, нам необходимо инициализировать защищенное соединение. Без этого попытка обращения к серверу завершится ошибкой. Проанализируем, как создать объект HTTPСоединение правильно. Мы будем использовать объект ЗащищенноеСоединениеOpenSSL, который позволяет 1С корректно работать с SSL-сертификатами сервера.

Рассмотрим пример инициализации соединения:


// Определяем адрес сервера и создаем защищенное соединение
Сервер = "api.mychtoto.ru";
Защита = Новый ЗащищенноеСоединениеOpenSSL();

// Создаем объект соединения. 
// Параметр Тайм-аут (например, 30 секунд) крайне важен для предотвращения зависания сеанса.
HTTPСоединение = Новый HTTPСоединение(Сервер, 443, , , , 30, Защита);

Шаг 2. Формирование HTTP-запроса и заголовков

Теперь перейдем к созданию самого объекта HTTPЗапрос. Одной из ключевых задач здесь является установка заголовка авторизации. В Postman это поле header. В 1С мы используем объект Соответствие для хранения всех необходимых метаданных запроса.

Важный нюанс: если сервер ожидает XML, мы обязательно должны сообщить ему об этом через заголовок Content-Type. В противном случае сервер может вернуть ошибку 400 (Bad Request). Выясним, как это реализовать в коде:


// Подготавливаем ресурс (путь к методу API)
Ресурс = "/api/v1/1c/counterparties";

// Формируем заголовки
Заголовки = Новый Соответствие;
Заголовки.Вставить("x-auth-token-1c", "9865985nhnk76n87o987b876b868b68"); // Токен из Postman. В сложных случаях может потребоваться получение токена авторизации RuStore с использованием RSA-подписи.
Заголовки.Вставить("Content-Type", "application/xml; charset=utf-8");    // Указываем тип контента

// Инициализируем запрос
HTTPЗапрос = Новый HTTPЗапрос(Ресурс, Заголовки);

Шаг 3. Подготовка и отправка тела запроса

В Postman мы вставляем XML-текст в раздел body. В 1С для этих целей используется метод УстановитьТелоИзСтроки(). Проанализируем ситуацию, когда нам нужно отправить список контрагентов. Сначала мы формируем XML-строку (например, с помощью ЗаписьXML), а затем передаем ее в запрос. Если же требуется передать данные документов, можно использовать механизмы для экспорта любых документов базы в JSON.

Обратите внимание на кодировку: использование КодировкаТекста.UTF8 является стандартом для веб-сервисов.


// Предположим, переменная ТекстXML содержит сформированный список контрагентов
ТекстXML = "<Counterparties>...</Counterparties>";

// Устанавливаем тело запроса
HTTPЗапрос.УстановитьТелоИзСтроки(ТекстXML, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

// Выполняем POST-запрос
Попытка
    Ответ = HTTPСоединение.ВызватьHTTPМетод("POST", HTTPЗапрос);
Исключение
    Сообщить("Ошибка при выполнении запроса: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

Шаг 4. Обработка ответа сервера

После выполнения запроса сервер возвращает объект HTTPОтвет. Нам нужно проверить код состояния (в идеале это 200 OK или 201 Created) и прочитать тело ответа. Зачастую современные сервисы возвращают ответ в формате JSON, даже если на вход принимали XML.

Посмотрим на пример обработки ответа, чтобы получить структуру данных, аналогичную той, что мы видели в нижней части окна Postman:


Если Ответ.КодСостояния = 200 Тогда
    // Получаем ответ в виде строки
    СтрокаОтвета = Ответ.ПолучитьТелоКакСтроку();
    
    // Если ответ в формате JSON, преобразуем его в структуру 1С или используем JSON -> Дерево значений
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(СтрокаОтвета);
    Результат = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
    
    // Теперь мы можем обращаться к полям ответа
    Если Результат.success Тогда
        Сообщить("Данные успешно переданы! Создано клиентов: " + Результат.newClient);
    КонецЕсли;
Иначе
    Сообщить("Сервер вернул ошибку. Код состояния: " + Ответ.КодСостояния);
    Сообщить("Тело ответа: " + Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;

Шаг 5. Реализация проверки токена на стороне приемника (HTTP-сервис 1С)

Если вы сами разрабатываете принимающую сторону в 1С (создаете объект HTTPСервис), вам потребуется механизм проверки того самого токена x-auth-token-1c. Разберем, как извлечь этот заголовок из входящего запроса внутри метода-обработчика.

Для этого используется свойство Заголовки объекта HTTPСервисЗапрос:


Функция counterpartiesPOST(Запрос)
    
    // Извлекаем токен из заголовков
    ТокенКлиента = Запрос.Заголовки.Получить("x-auth-token-1c");
    ЭталонныйТокен = "9865985nhnk76n87o987b876b868b68"; // Значение, которое мы ожидаем
    
    Если ТокенКлиента <> ЭталонныйТокен Тогда
        // Если токены не совпадают, возвращаем ошибку 401
        Ответ = Новый HTTPСервисОтвет(401);
        Ответ.УстановитьТелоИзСтроки("Ошибка авторизации: неверный токен.");
        Возврат Ответ;
    КонецЕсли;
    
    // Далее следует логика обработки XML из тела запроса...
    ТелоXML = Запрос.ПолучитьТелоКакСтроку();
    
    // Формируем успешный ответ
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-Type", "application/json");
    Ответ.УстановитьТелоИзСтроки("{ ""success"": true }");
    Возврат Ответ;
    
КонецФункции

Полезные советы по отладке

При работе с HTTP-запросами в 1С рекомендуем обратить внимание на следующие моменты:

  1. Использование сниппетов Postman: В правой панели Postman есть кнопка </> (Code). Выберите вариант cURL. Это позволит вам увидеть «чистый» вид запроса, включая все скрытые заголовки, которые Postman добавляет автоматически.
  2. Сервисы-ловушки: Если запрос из 1С не проходит, а из Postman работает, попробуйте отправить запрос из 1С на любой сервис логирования HTTP-трафика (например, webhook.site). Так вы сможете визуально сравнить заголовки и тело запроса, уходящие из 1С, с теми, что отправляет Postman.
  3. Тайм-ауты: Всегда устанавливайте время ожидания в HTTPСоединение. Сетевые задержки не должны приводить к критической остановке работы пользователя.
  4. Обработка исключений: Обязательно оборачивайте вызов HTTPСоединение.ВызватьHTTPМетод в блок Попытка ... Исключение, так как сетевые ошибки (отсутствие связи, DNS-проблемы) неизбежны.

Таким образом, имея на руках рабочую конфигурацию в Postman, мы можем быстро и эффективно перенести ее в среду 1С, используя стандартные объекты платформы для работы с протоколом HTTP.

← На главную