При интеграции 1С:Предприятия 7.7 с интернет-магазинами на базе WordPress и плагина WooCommerce разработчики нередко сталкиваются с ситуацией, когда текстовые реквизиты карточки товара (наименование, артикул, цена, описание) выгружаются успешно, а изображения или связанные массивы данных сервер отклоняет либо вовсе игнорирует. Разберем по шагам, почему возникает эта ошибка и как синтаксически корректно описать структуру данных в коде 1С 7.7 при отправке запросов через объект WinHttp.WinHttpRequest.5.1.
Проанализируем исходную попытку формирования строки, которая часто приводит к ошибкам со стороны API:
// Ошибочный вариант:
ImagesData = "{" + Симв(39) +"id" + Симв(39) + ":" + Симв(39) + "1" + Симв(39) + "," + Симв(39) + "src" + Симв(39) + ":" + Симв(39) + Ссылка + Симв(39) +"}";
Запрос = "{images:" + ImagesData + "}&";
В этом фрагменте допущены сразу три критические ошибки, из-за которых веб-сервер не может распарсить переданные данные:
Симв(39) возвращает символ одинарной кавычки (апостроф '). Стандарт спецификации JSON категорически запрещает использование одинарных кавычек для ключей и строковых значений. В JSON допускаются исключительно двойные кавычки ("). В 1С 7.7 код двойной кавычки задается функцией Симв(34) либо двойным экранированием """".[...], а объекты — фигурными скобками {...}. Структура images в WooCommerce REST API ожидает именно массив объектов изображений, даже если передается всего одна картинка.& на конце строки характерно для передачи параметров формы (application/x-www-form-urlencoded). Если запрос отправляется в формате JSON (application/json), тело запроса должно представлять собой целостный, валидный JSON-документ без посторонних разделителей полей.Выясним причину, по которой 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 невозможно.
Посмотрим на пример правильной сборки строки в 1С 7.7 с использованием экранирования кавычек через Симв(34):
Кав = Симв(34); // Двойная кавычка
// Формируем внутренний объект изображения
ИзображениеОбъект = "{" + Кав + "src" + Кав + ":" + Кав + СокрЛП(СсылкаНаКартинку) + Кав + "}";
// Оборачиваем в массив и добавляем к общему JSON-пакету карточки товара
ТелоJSON = "{" +
Кав + "name" + Кав + ":" + Кав + СокрЛП(НаименованиеТовара) + Кав + "," +
Кав + "regular_price" + Кав + ":" + Кав + СокрЛП(ЦенаТовара) + Кав + "," +
Кав + "images" + Кав + ": [" + ИзображениеОбъект + "]" +
"}";
Если изображений несколько, соберем их в цикле:
Кав = Симв(34);
СтрокаМассиваКартинок = "";
СписокКартинок.ВыбратьСтроки();
Пока СписокКартинок.ПолучитьСтроку() = 1 Цикл
Если ПустаяСтрока(СтрокаМассиваКартинок) = 0 Тогда
СтрокаМассиваКартинок = СтрокаМассиваКартинок + ",";
КонецЕсли;
СтрокаМассиваКартинок = СтрокаМассиваКартинок + "{" + Кав + "src" + Кав + ":" + Кав + СокрЛП(СписокКартинок.URL) + Кав + "}";
КонецЦикла;
ТелоJSON = "{" + Кав + "images" + Кав + ": [" + СтрокаМассиваКартинок + "]}";
Рассмотрим подробнее важную особенность платформы 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. В этом случае задача решается в два этапа:
/wp-json/wp/v2/media, куда передается бинарное содержимое файла с заголовком Content-Disposition: attachment; filename="image.jpg". В ответ сервер возвращает JSON с присвоенным числовым идентификатором (id). Поскольку работа с бинарными потоками в 1С 7.7 требует сложного кода, для выгрузки файлов часто используют внешнюю консольную утилиту cURL через команду КомандаСистемы(...).id картинки мы формируем массив изображений по идентификаторам:
Кав = Симв(34);
ТелоJSON = "{" + Кав + "images" + Кав + ": [{" + Кав + "id" + Кав + ":" + ИдентификаторМедиа + "}]}";
Таким образом, строгое соблюдение двойных кавычек Симв(34), оборачивание списка в квадратные скобки [...] и предварительное перекодирование тела запроса в UTF-8 полностью устраняют проблемы с выгрузкой массивов изображений из 1С 7.7.