Как правильно сформировать массив изображений в формате JSON при выгрузке из 1С 7.7 на сайт WordPress через WinHttp?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При интеграции 1С:Предприятия 7.7 с интернет-магазинами на базе WordPress и плагина WooCommerce разработчики нередко сталкиваются с ситуацией, когда текстовые реквизиты карточки товара (наименование, артикул, цена, описание) выгружаются успешно, а изображения или связанные массивы данных сервер отклоняет либо вовсе игнорирует. Разберем по шагам, почему возникает эта ошибка и как синтаксически корректно описать структуру данных в коде 1С 7.7 при отправке запросов через объект WinHttp.WinHttpRequest.5.1.

Анализ синтаксических ошибок при формировании JSON

Проанализируем исходную попытку формирования строки, которая часто приводит к ошибкам со стороны API:


// Ошибочный вариант:
ImagesData = "{" + Симв(39) +"id" + Симв(39) + ":" + Симв(39) + "1" + Симв(39) + "," + Симв(39) + "src" + Симв(39) + ":" + Симв(39) + Ссылка + Симв(39) +"}";
Запрос = "{images:" + ImagesData + "}&";

В этом фрагменте допущены сразу три критические ошибки, из-за которых веб-сервер не может распарсить переданные данные:

  1. Использование одинарных кавычек вместо двойных. Код Симв(39) возвращает символ одинарной кавычки (апостроф '). Стандарт спецификации JSON категорически запрещает использование одинарных кавычек для ключей и строковых значений. В JSON допускаются исключительно двойные кавычки ("). В 1С 7.7 код двойной кавычки задается функцией Симв(34) либо двойным экранированием """".
  2. Отсутствие квадратных скобок массива. В нотации JSON массивы всегда обрамляются квадратными скобками [...], а объекты — фигурными скобками {...}. Структура images в WooCommerce REST API ожидает именно массив объектов изображений, даже если передается всего одна картинка.
  3. Смешение формата JSON и Form-Urlencoded. Добавление символа & на конце строки характерно для передачи параметров формы (application/x-www-form-urlencoded). Если запрос отправляется в формате JSON (application/json), тело запроса должно представлять собой целостный, валидный JSON-документ без посторонних разделителей полей.

Правильный синтаксис структуры данных для REST API

Выясним причину, по которой REST API ожидает конкретный вид структуры. Каждое изображение в WooCommerce описывается объектом с определенными свойствами. Наиболее распространенный вариант — передача публичной ссылки на изображение через поле src либо указание идентификатора ранее загруженного в медиатеку файла через id.

Корректный JSON для одного изображения должен выглядеть следующим образом:


{
  "images": [
    {
      "src": "https://example.com/images/item1.jpg"
    }
  ]
}

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


{
  "images": [
    {
      "src": "https://example.com/images/item1.jpg"
    },
    {
      "src": "https://example.com/images/item2.jpg"
    }
  ]
}

Обратите внимание: поле src принимает только публичный URL-адрес из сети Интернет, по которому сервер WordPress сможет самостоятельно скачать картинку. Передать локальный путь к файлу на жестком диске (например, C:\images\photo.jpg) в параметре src невозможно.

Формирование валидной строки JSON средствами 1С 7.7

Посмотрим на пример правильной сборки строки в 1С 7.7 с использованием экранирования кавычек через Симв(34):


Кав = Симв(34); // Двойная кавычка

// Формируем внутренний объект изображения
ИзображениеОбъект = "{" + Кав + "src" + Кав + ":" + Кав + СокрЛП(СсылкаНаКартинку) + Кав + "}";

// Оборачиваем в массив и добавляем к общему JSON-пакету карточки товара
ТелоJSON = "{" +
    Кав + "name" + Кав + ":" + Кав + СокрЛП(НаименованиеТовара) + Кав + "," +
    Кав + "regular_price" + Кав + ":" + Кав + СокрЛП(ЦенаТовара) + Кав + "," +
    Кав + "images" + Кав + ": [" + ИзображениеОбъект + "]" +
"}";

Если изображений несколько, соберем их в цикле:


Кав = Симв(34);
СтрокаМассиваКартинок = "";

СписокКартинок.ВыбратьСтроки();
Пока СписокКартинок.ПолучитьСтроку() = 1 Цикл
    Если ПустаяСтрока(СтрокаМассиваКартинок) = 0 Тогда
        СтрокаМассиваКартинок = СтрокаМассиваКартинок + ",";
    КонецЕсли;
    СтрокаМассиваКартинок = СтрокаМассиваКартинок + "{" + Кав + "src" + Кав + ":" + Кав + СокрЛП(СписокКартинок.URL) + Кав + "}";
КонецЦикла;

ТелоJSON = "{" + Кав + "images" + Кав + ": [" + СтрокаМассиваКартинок + "]}";

Настройка заголовков WinHttp и кодировки UTF-8

Рассмотрим подробнее важную особенность платформы 1С 7.7: платформа работает в кодовой странице Windows-1251 (ANSI), тогда как веб-серверы и спецификация JSON требуют строгой кодировки UTF-8. Если отправить строку напрямую через метод Send(), кириллические символы повредятся, а сервер вернет ошибку парсинга.

Для корректной отправки данных воспользуемся COM-объектом ADODB.Stream для перекодирования строки в UTF-8 и правильно настроим заголовки HTTP-запроса:


// 1. Перекодирование текста JSON в UTF-8 без BOM
Stream = СоздатьОбъект("ADODB.Stream");
Stream.Type = 2; // adTypeText
Stream.Charset = "windows-1251";
Stream.Open();
Stream.WriteText(ТелоJSON);

Stream.Position = 0;
Stream.Charset = "utf-8";
ТекстВUTF8 = Stream.ReadText();
Stream.Close();

// 2. Отправка запроса через WinHttp
HTTP = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
HTTP.Open("POST", URLСервера, 0);

// Обязательно указываем Content-Type для JSON
HTTP.SetRequestHeader("Content-Type", "application/json; charset=utf-8");
HTTP.SetRequestHeader("Accept", "application/json");

// Передаем авторизацию (Basic Auth или по токену)
HTTP.SetRequestHeader("Authorization", "Basic " + СтрокаАвторизации);

HTTP.Send(ТекстВUTF8);

Статус = HTTP.Status;
Ответ = HTTP.ResponseText;

Если Статус = 200 Или Статус = 201 Тогда
    Сообщить("Товар и изображения успешно выгружены!");
Иначе
    Сообщить("Ошибка выгрузки: " + Статус + " " + Ответ);
КонецЕсли;

Выгрузка локальных файлов с диска

Если изображения хранятся на локальном компьютере, их нельзя передать прямой ссылкой в параметре src. В этом случае задача решается в два этапа:

  1. Загрузка файла в медиабиблиотеку WordPress. Выполняется отдельный POST-запрос к конечной точке /wp-json/wp/v2/media, куда передается бинарное содержимое файла с заголовком Content-Disposition: attachment; filename="image.jpg". В ответ сервер возвращает JSON с присвоенным числовым идентификатором (id). Поскольку работа с бинарными потоками в 1С 7.7 требует сложного кода, для выгрузки файлов часто используют внешнюю консольную утилиту cURL через команду КомандаСистемы(...).
  2. Привязка медиафайла к товару. После получения id картинки мы формируем массив изображений по идентификаторам:
    
    Кав = Симв(34);
    ТелоJSON = "{" + Кав + "images" + Кав + ": [{" + Кав + "id" + Кав + ":" + ИдентификаторМедиа + "}]}";
    

Таким образом, строгое соблюдение двойных кавычек Симв(34), оборачивание списка в квадратные скобки [...] и предварительное перекодирование тела запроса в UTF-8 полностью устраняют проблемы с выгрузкой массивов изображений из 1С 7.7.

← На главную