Как правильно реализовать запрос curl --data-binary в 1С для интеграции с CS-Cart API

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

Интеграция 1С с интернет-магазинами на базе CS-Cart часто требует использования их REST API. Одной из распространенных трудностей является перенос готовых команд curl, успешно работающих в Linux, в программный код 1С. Особенно много вопросов вызывает параметр --data-binary, который отвечает за передачу данных в "сыром" виде без какой-либо дополнительной обработки.

В этой статье мы подробно разберем, как правильно сформировать HTTP-запрос в 1С, чтобы он полностью соответствовал поведению curl, и разберем типичные ошибки, связанные с кодировками, заголовками и особенностями операционной системы Windows.

Анализ исходной проблемы

Рассмотрим исходную команду curl, которую необходимо перенести в 1С:

curl --header "Authorization: Basic API_TOKEN" --header 'Content-Type: application/json' -X POST --data-binary '{"stocks": {"product_code": "1", "amount": "10"}}'

Проанализируем ситуацию: в среде Linux этот запрос выполняется корректно, но при попытке запустить его через КомандаСистемы в Windows или реализовать через объекты 1С возникают ошибки. Основные причины здесь кроются в следующем:

  1. Экранирование кавычек в Windows: Командная строка Windows (CMD) не понимает одинарные кавычки для обрамления тела запроса. В Windows тело должно быть в двойных кавычках, а внутренние кавычки JSON — экранированы.
  2. Метод передачи данных: Параметр --data-binary в curl отправляет данные ровно в том виде, в котором они представлены, не удаляя символы переноса строк и не обрабатывая спецсимволы.
  3. Авторизация: CS-Cart требует специфический формат Basic авторизации, где токен — это не просто строка, а закодированная пара логина и API-ключа.

Шаг 1: Формирование заголовков и авторизации

Для начала нам необходимо подготовить объект HTTPЗапрос. Важно помнить, что для CS-Cart стандартная Basic авторизация строится по принципу: логин_администратора:api_ключ. Эту строку нужно перевести в формат Base64.

Рассмотрим, как это реализовать в коде 1С:


// Логин и ключ можно получить в панели администратора CS-Cart
Логин = "admin@example.com";
APIКлюч = "ваш_ключ_api";

// Формируем строку авторизации
СтрокаАвторизации = Логин + ":" + APIКлюч;
ДанныеАвторизации = Base64Строка(ДвоичныеДанныеИзСтроки(СтрокаАвторизации, КодировкаТекста.UTF8));

Запрос = Новый HTTPЗапрос;
Запрос.Заголовки.Вставить("Authorization", "Basic " + ДанныеАвторизации);
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Запрос.Заголовки.Вставить("Accept", "application/json"); // Рекомендуется для получения ответов в JSON

Шаг 2: Подготовка тела запроса (Аналог --data-binary)

Основная сложность у автора вопроса возникла с передачей данных. В 1С наиболее надежным способом имитации --data-binary является использование метода УстановитьТелоИзСтроки с обязательным указанием кодировки и отключением BOM (Byte Order Mark).

Выясним причину: веб-серверы на PHP (на которых работает CS-Cart) крайне чувствительны к невидимым символам в начале JSON-пакета. Если 1С добавит BOM-символы при сохранении в UTF-8, сервер вернет ошибку "неправильный формат медиа" или 400 Bad Request.

Разберем правильный подход:


// Формируем структуру данных
ДанныеОстатков = Новый Структура;
ДанныеОстатков.Вставить("product_code", "1");
ДанныеОстатков.Вставить("amount", "10");

ТелоЗапроса = Новый Структура;
ТелоЗапроса.Вставить("stocks", ДанныеОстатков);

// Преобразуем в JSON строку
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ТелоЗапроса);
СтрокаJSON = ЗаписьJSON.Закрыть();

// Устанавливаем тело запроса ПРАВИЛЬНО (аналог --data-binary)
// Используем КодировкаТекста.UTF8 и ИспользованиеByteOrderMark.НеИспользовать
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Шаг 3: Выполнение запроса

Теперь проанализируем ситуацию с методом запроса. В примере автора используется POST. Однако стоит учитывать, что для обновления существующих данных (например, остатков) API CS-Cart часто ожидает метод PUT. Если POST возвращает ошибку, попробуйте сменить метод.


// Настройка соединения
Сервер = "ваш-сайт.рф";
НТТРСоединение = Новый HTTPСоединение(Сервер, 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());

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

Альтернативный метод через двоичные данные

Если вы все же хотите пойти по пути формирования "чистых" двоичных данных (как предлагалось в сообщении №7 форума), это можно сделать без сохранения в промежуточный файл. Рассмотрим этот вариант:


// Получаем строку JSON
СтрокаJSON = "{""stocks"": {""product_code"": ""1"", ""amount"": ""10""}}";

// Преобразуем строку в двоичные данные UTF-8 без BOM
ДвоичныеДанныеТела = ДвоичныеДанныеИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, Ложь); 

// Передаем как бинарные данные
Запрос.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанныеТела);

Этот способ является максимально близким к логике --data-binary, так как вы полностью контролируете каждый байт, отправляемый в сокет.

Использование Postman для проверки

Как правильно посоветовали в сообщении №9, если запрос не проходит из 1С, используйте Postman. Это позволит вам изолировать проблему:

  1. Импортируйте вашу команду curl в Postman через кнопку Import -> Raw text.
  2. Убедитесь, что запрос проходит успешно.
  3. Перейдите во вкладку Code Snippet (иконка справа) и выберите "HTTP".
  4. Сравните полученный HTTP-заголовок и структуру тела с тем, что формирует ваша 1С.

Важный момент: Обратите внимание на заголовки Content-Length. 1С вычисляет их автоматически при использовании УстановитьТелоИзСтроки, но если вы вручную манипулируете заголовками, убедитесь, что длина указана верно (в байтах, а не в символах).

Резюме

Для успешной замены curl --data-binary в 1С при работе с CS-Cart API придерживайтесь следующих правил:

Соблюдение этих технических нюансов позволит вам построить надежную интеграцию без использования сторонних скриптов на Python или внешних компонент.

← На главную