Переход от использования консольной утилиты curl к специализированной внешней компоненте curl1c.dll (известной в узких кругах как «Карлик») часто вызывает вопросы у разработчиков 1С 7.7. Хотя для простых задач часто используют Msxml2.ServerXMLHTTP.6.0 или рассматривают другие варианты отправки API запросов, «Карлик» незаменим, когда нужно обеспечить стабильную работу по защищенному протоколу HTTPS. В этой статье мы подробно разберем, как правильно перенести рабочий curl-запрос в программный код, избежать ошибок при передаче JSON и корректно настроить прием ответов от современных API.
Проанализируем ситуацию: при выполнении запроса через командную строку всё работает, но при использовании компоненты сервер возвращает ошибку 422 Unprocessable Entity. Чаще всего это означает, что сервер получил запрос, но не может интерпретировать переданные данные. Одной из главных причин в 1С 7.7 являются лишние кавычки. Если у вас не настроена универсальная выгрузка данных из 1С 7.7 в JSON и вы формируете тело запроса вручную, рассмотрим пример неправильной передачи данных:
Данные = """{\""text\"": \""Hello \""}""";
Карлик.Источник.Данные = Данные;
В командной строке curl внешние кавычки необходимы для оболочки операционной системы (CMD или Bash), чтобы она не разбивала JSON-строку по пробелам. Однако внутри компоненты Curl1C эти кавычки становятся частью самой строки, отправляемой на сервер. В итоге сервер получает не объект { "text": "Hello" }, а строку в кавычках, что делает структуру JSON невалидной. Выясним, как сделать правильно: передавайте в Источник.Данные «чистую» строку без внешнего обрамления дополнительными кавычками.
Для корректной работы с современными API (например, ElevenLabs) требуется передать несколько заголовков, таких как Content-Type и xi-api-key. Рассмотрим, как это реализовать программно. В компоненте Curl1C метод УстановитьПараметр с ключом HTTPHEADER работает накопительно.
Разберем по шагам процесс установки нескольких заголовков:
// Очистим заголовки перед установкой, если это предусмотрено логикой (или просто добавляем новые)
Карлик.УстановитьПараметр("HTTPHEADER", "Content-Type: application/json");
Карлик.УстановитьПараметр("HTTPHEADER", "xi-api-key: ВАШ_КЛЮЧ_АПИ");
Если у вас список заголовков хранится в объекте СписокЗначений, проанализируем цикл для их автоматической установки:
Если сзЗаголовки.РазмерСписка() > 0 Тогда
Для Сч = 1 По сзЗаголовки.РазмерСписка() Цикл
ИмяЗаг = "";
ЗначЗаг = сзЗаголовки.ПолучитьЗначение(Сч, ИмяЗаг);
Если ПустоеЗначение(ИмяЗаг) = 0 Тогда
// Формируем строку в формате "Имя: Значение"
Карлик.УстановитьПараметр("HTTPHEADER", ИмяЗаг + ": " + ЗначЗаг);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Компонента Curl1C использует объектную модель для управления потоками данных. Нам важно правильно определить свойства Источник (то, что мы отправляем) и Приемник (то, куда сохраняем ответ).
Рассмотрим основные типы данных для этих объектов:
Данные указывается полный путь к файлу на диске.Если мы хотим отправить JSON и сохранить ответ (например, аудиофайл от TTS-сервиса) на диск, настроим это следующим образом:
// Настройка отправки (Источник)
Карлик.Источник.Тип = 0; // Передаем строку
Карлик.Источник.Данные = СформированнаяСтрокаJSON;
// Настройка получения (Приемник)
Карлик.Приемник.Тип = 1; // Хотим сохранить ответ сразу в файл
Карлик.Приемник.Данные = "C:\Output\voice.mp3";
Важно помнить, что 1С 7.7 работает в кодировке Windows-1251 (ANSI). Большинство современных REST API ожидают данные строго в кодировке UTF-8. Если ваш JSON содержит кириллицу, простая передача строки приведет к ошибке 400 или 422.
Проанализируем решение: перед передачей в Карлик.Источник.Данные строку необходимо конвертировать в UTF-8. Это можно сделать либо встроенными средствами компоненты (если версия поддерживает автоматическую конвертацию), либо внешними библиотеками (например, через ADODB.Stream). Также рекомендуется явно указывать кодировку в заголовке:
Карлик.УстановитьПараметр("HTTPHEADER", "Content-Type: application/json; charset=utf-8");
Иногда при формировании сложных запросов (например, для систем мониторинга типа Wialon) строка URL получается очень длинной и содержит переносы строк для читаемости в конфигураторе. Это может привести к ошибке инициализации запроса (код ошибки 3).
Посмотрим на пример того, как очистить URL от лишних символов перед передачей компоненте:
// Удаляем символы перевода строки (LF) и возврата каретки (CR)
АдресЗапроса = СтрЗаменить(АдресЗапроса, Симв(10), "");
АдресЗапроса = СтрЗаменить(АдресЗапроса, Симв(13), "");
Карлик.УстановитьПараметр("URL", СокрЛП(АдресЗапроса));
Если запрос все равно не проходит, выясним причину с помощью расширенного лога. В компоненте предусмотрен параметр VERBOSE, который является аналогом ключа -v в обычном curl.
Установите Карлик.УстановитьПараметр("VERBOSE", 1); перед вызовом метода Выполнить(). Это позволит увидеть детальный процесс обмена данными между 1С и сервером, включая отправленные заголовки и ответ сервера, что незаменимо при поиске причин ошибок 4xx и 5xx.
Итоговый пример кода для POST-запроса:
ЗагрузитьВнешнююКомпоненту("curl1c.dll");
Карлик = СоздатьОбъект("Карлик");
Карлик.УстановитьПараметр("URL", "https://api.example.com/v1/endpoint");
Карлик.УстановитьПараметр("CUSTOMREQUEST", "POST");
// Установка заголовков
Карлик.УстановитьПараметр("HTTPHEADER", "Content-Type: application/json");
Карлик.УстановитьПараметр("HTTPHEADER", "Authorization: Bearer YOUR_TOKEN");
// Данные (без лишних внешних кавычек!)
Карлик.Источник.Тип = 0;
Карлик.Источник.Данные = "{""param"": ""value""}";
// Куда сохранить результат
Карлик.Приемник.Тип = 1;
Карлик.Приемник.Данные = "C:\temp\result.json";
КодВозврата = Карлик.Выполнить();
Если КодВозврата <> 0 Тогда
Предупреждение("Ошибка Curl: " + КодВозврата);
КонецЕсли;