Интеграция 1С с маркетплейсами, такими как Ozon, требует строгого соблюдения формата передаваемых данных. Одной из наиболее частых проблем является некорректное формирование JSON-пакета или пропуск обязательных параметров, что приводит к ошибкам типа BAD_REQUEST или Invalid request payload. В этой статье мы подробно разберем, как уйти от «извращенных» способов формирования строки вручную и прийти к чистому, надежному коду.
Рассмотрим ситуацию, когда разработчик пытается сформировать JSON-строку последовательной записью свойств через объект ЗаписьJSON. В коде это выглядит так:
json = Новый ЗаписьJSON;
json.УстановитьСтроку;
json.ЗаписатьНачалоОбъекта;
Json.ЗаписатьИмяСвойства("page");
json.ЗаписатьЗначение(1);
// ... и так далее для каждого вложенного объекта
json.ЗаписатьКонецОбъекта;
Результат = json.Закрыть();
Проанализируем этот подход. Во-первых, легко ошибиться в количестве вызовов ЗаписатьКонецОбъекта(), что приведет к невалидному JSON. Во-вторых, такой код крайне сложно читать и поддерживать. В-третьих, малейшее изменение в структуре фильтра Ozon потребует переписывания всей цепочки команд. Выясним причину ошибки: даже если JSON валиден по структуре, Ozon может вернуть ошибку, если пропущен хотя бы один обязательный параметр, например transaction_type.
Наиболее правильным и современным методом в 1С (начиная с платформы 8.3.6) является использование структур и массивов с последующей сериализацией. Разберем по шагам, как это реализовать:
ЗаписатьJSON.Посмотрим на пример функции, которая преобразует структуру в готовую JSON-строку:
Функция СформироватьПараметрыJSON(Параметры)
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
// Сериализуем структуру 1С в формат JSON
ЗаписатьJSON(ЗаписьJSON, Параметры);
Возврат ЗаписьJSON.Закрыть();
КонецФункции
Теперь подготовим сами данные. Это выглядит гораздо нагляднее и исключает синтаксические ошибки:
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("page", 1);
ПараметрыЗапроса.Вставить("page_size", 100);
Фильтр = Новый Структура;
Фильтр.Вставить("transaction_type", "all"); // Обязательный параметр!
Даты = Новый Структура;
Даты.Вставить("from", "2023-01-01T00:00:00.000Z");
Даты.Вставить("to", "2023-01-31T23:59:59.999Z");
Фильтр.Вставить("date", Даты);
ПараметрыЗапроса.Вставить("filter", Фильтр);
ТекстJSON = СформироватьПараметрыJSON(ПараметрыЗапроса);
Одной из самых коварных задач является приведение даты 1С к формату ISO8601, который ожидает Ozon (например, 2020-08-19T23:59:59.897Z). Стандартная функция XMLString(ТекущаяДата()) выдает формат без миллисекунд и суффикса Z, что может не подойти.
Рассмотрим несколько вариантов решения проблемы:
Вариант 1. Использование функции Формат. Это самый простой способ быстро получить строку нужного вида:
СтрДата = Формат(ТекущаяДата(), "ДФ=yyyy-MM-ddThh:mm:ss") + ".000Z";
Вариант 2. Комбинирование с XMLString. Если вам нужна большая точность или вы привыкли к XML-сериализации:
СтрДата = XMLString(ТекущаяДата()) + ".878Z";
Вариант 3. Профессиональный подход (UTC). Помните, что Ozon ожидает время в формате UTC. Если ваша база работает по местному времени (например, МСК+2), просто добавить "Z" в конце будет логической ошибкой. Необходимо сначала пересчитать время в UTC.
Проанализируем типичную ошибку Invalid request payload. В контексте Ozon Seller API для метода списка транзакций параметр transaction_type является строго обязательным. Допустимые значения:
all — все операции;trade — продажи;service — услуги;rent — аренда.Кроме того, убедитесь, что ваши HTTP-заголовки настроены корректно. Даже идеальный JSON не будет принят без следующих параметров в HTTPЗапрос:
Content-Type: application/jsonClient-Id: [Ваш_ID]Api-Key: [Ваш_Ключ]Подведем итог нашего анализа. Чтобы ваша интеграция работала стабильно:
Структура и Массив для подготовки данных. Это защитит вас от ошибок в иерархии JSON.data в ответе с ошибкой часто подсказывает, какого именно ключа не хватает).Применяя эти подходы, мы делаем код 1С чистым, а процесс обмена данными с маркетплейсом — предсказуемым и надежным.