Часто при интеграции 1С с внешними системами разработчики получают готовую коллекцию в Postman, которая успешно выполняет запросы к серверу. Однако перенос этих настроек в программный код 1С может вызвать затруднения, особенно в части работы с заголовками авторизации, передачи тела запроса в формате XML и обработки полученных ответов. В этой статье мы подробно разберем, как трансформировать данные из Postman в полноценный программный механизм на стороне 1С.
Для начала проанализируем структуру типичного JSON-файла запроса из Postman. В нашем распоряжении есть метод POST, адрес сервера api.mychtoto.ru, путь к ресурсу /api/v1/1c/counterparties и специфический заголовок x-auth-token-1c. Также указано, что тело запроса передается в формате raw с типом контента xml. Наша задача — последовательно воспроизвести эти параметры с помощью объектов платформы 1С.
Поскольку в URL запроса указан протокол https, нам необходимо инициализировать защищенное соединение. Без этого попытка обращения к серверу завершится ошибкой. Проанализируем, как создать объект HTTPСоединение правильно. Мы будем использовать объект ЗащищенноеСоединениеOpenSSL, который позволяет 1С корректно работать с SSL-сертификатами сервера.
Рассмотрим пример инициализации соединения:
// Определяем адрес сервера и создаем защищенное соединение
Сервер = "api.mychtoto.ru";
Защита = Новый ЗащищенноеСоединениеOpenSSL();
// Создаем объект соединения.
// Параметр Тайм-аут (например, 30 секунд) крайне важен для предотвращения зависания сеанса.
HTTPСоединение = Новый HTTPСоединение(Сервер, 443, , , , 30, Защита);
Теперь перейдем к созданию самого объекта 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Запрос(Ресурс, Заголовки);
В Postman мы вставляем XML-текст в раздел body. В 1С для этих целей используется метод УстановитьТелоИзСтроки(). Проанализируем ситуацию, когда нам нужно отправить список контрагентов. Сначала мы формируем XML-строку (например, с помощью ЗаписьXML), а затем передаем ее в запрос. Если же требуется передать данные документов, можно использовать механизмы для экспорта любых документов базы в JSON.
Обратите внимание на кодировку: использование КодировкаТекста.UTF8 является стандартом для веб-сервисов.
// Предположим, переменная ТекстXML содержит сформированный список контрагентов
ТекстXML = "<Counterparties>...</Counterparties>";
// Устанавливаем тело запроса
HTTPЗапрос.УстановитьТелоИзСтроки(ТекстXML, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
// Выполняем POST-запрос
Попытка
Ответ = HTTPСоединение.ВызватьHTTPМетод("POST", HTTPЗапрос);
Исключение
Сообщить("Ошибка при выполнении запроса: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
После выполнения запроса сервер возвращает объект HTTPОтвет. Нам нужно проверить код состояния (в идеале это 200 OK или 201 Created) и прочитать тело ответа. Зачастую современные сервисы возвращают ответ в формате JSON, даже если на вход принимали XML.
Посмотрим на пример обработки ответа, чтобы получить структуру данных, аналогичную той, что мы видели в нижней части окна Postman:
Если Ответ.КодСостояния = 200 Тогда
// Получаем ответ в виде строки
СтрокаОтвета = Ответ.ПолучитьТелоКакСтроку();
// Если ответ в формате JSON, преобразуем его в структуру 1С или используем JSON -> Дерево значений
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаОтвета);
Результат = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Теперь мы можем обращаться к полям ответа
Если Результат.success Тогда
Сообщить("Данные успешно переданы! Создано клиентов: " + Результат.newClient);
КонецЕсли;
Иначе
Сообщить("Сервер вернул ошибку. Код состояния: " + Ответ.КодСостояния);
Сообщить("Тело ответа: " + Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Если вы сами разрабатываете принимающую сторону в 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С рекомендуем обратить внимание на следующие моменты:
</> (Code). Выберите вариант cURL. Это позволит вам увидеть «чистый» вид запроса, включая все скрытые заголовки, которые Postman добавляет автоматически.webhook.site). Так вы сможете визуально сравнить заголовки и тело запроса, уходящие из 1С, с теми, что отправляет Postman.HTTPСоединение. Сетевые задержки не должны приводить к критической остановке работы пользователя.HTTPСоединение.ВызватьHTTPМетод в блок Попытка ... Исключение, так как сетевые ошибки (отсутствие связи, DNS-проблемы) неизбежны.Таким образом, имея на руках рабочую конфигурацию в Postman, мы можем быстро и эффективно перенести ее в среду 1С, используя стандартные объекты платформы для работы с протоколом HTTP.