Как обновить статус заказа на Ozon (FBS) из 1С с помощью API?

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

В современном мире электронной коммерции эффективное управление заказами на маркетплейсах является ключевым фактором успеха. Многие продавцы, использующие систему 1С для учета, сталкиваются с необходимостью автоматизировать процесс обновления статусов заказов на Ozon, особенно для схемы FBS (Fulfillment by Seller). В этой статье мы подробно рассмотрим, как осуществить интеграцию 1С с Ozon Seller API для обновления статуса заказа, используя метод /v3/posting/fbs/ship, а также обсудим общие принципы и альтернативные подходы.

Ручное обновление статусов может занимать много времени и приводить к ошибкам, особенно при большом объеме заказов. Автоматизация этого процесса через API позволяет значительно ускорить обработку, снизить нагрузку на персонал и улучшить качество обслуживания клиентов. Мы выясним, как сформировать необходимые запросы, обработать ответы и какие подводные камни могут встретиться на этом пути.

Обзор процесса обновления статусов заказа на Ozon для FBS

Для схемы FBS процесс обработки заказа включает несколько ключевых этапов, каждому из которых соответствует определенный статус и набор API-методов для работы с ним. Давайте разберем основные шаги и статусы, с которыми мы будем взаимодействовать:

  1. Начальный статус заказа: Заказы, полученные через API, изначально могут иметь статус awaiting_packaging (ожидает упаковки). Иногда может встречаться статус awaiting_verification, означающий, что заказ создан, но еще не готов к обработке продавцом, например, ожидает оплаты покупателем. Наша задача — перейти от статуса awaiting_packaging к готовности к отгрузке.
  2. Сборка заказа и переход в "Ожидает отгрузки": После получения заказа в статусе awaiting_packaging, продавец должен его упаковать и подтвердить сборку. Передача списка отправлений для упаковки через соответствующий метод переводит их в статус awaiting_deliver (готов к отгрузке). Именно этот этап мы будем автоматизировать с помощью метода /v3/posting/fbs/ship.
  3. Процесс отгрузки (FBS):
    • Генерация отгрузки: Для создания первой отгрузки необходимо использовать метод /v1/carriage/create, передав delivery_method_id и departure_date. В эту отгрузку попадут все отправления в статусе "Готов к отгрузке", а сама отгрузка будет создана в статусе "new".
    • Подтверждение отгрузки: После генерации отгрузки ее необходимо подтвердить методом /v1/carriage/approve, после чего она перейдет в статус "Сформирована".
    • Получение документов: Для отгрузки в статусе "Сформирована" можно получить лист отгрузки методом /v2/posting/fbs/digital/act/get-pdf и штрихкод отгрузки методом /v2/posting/fbs/act/get-barcode.
    • Отмена отгрузки: Отгрузку можно отменить методом /v1/carriage/cancel, если в ответе метода /v1/carriage/get параметр is_cancel_available имеет значение true.
  4. Дальнейшие статусы:
    • delivering (доставляется): Для интегрированных служб доставки статус отслеживается автоматически, для других служб или самостоятельной доставки статус необходимо обновлять через метод /v2/fbs/posting/delivering.
    • delivered (доставлено): Аналогично, для интегрированных служб автоматически, для прочих — через /v2/fbs/posting/delivered.
    • cancelled (отменено): Отменить отправление можно методом /v2/posting/fbs/cancel.
  5. Отмена части товаров: Если требуется отменить часть товаров из отправления, которые невозможно доставить, используется метод /v2/posting/fbs/product/cancel.
  6. Причины отмены: Метод /v1/cancel-reason/list позволяет получить список доступных причин отмены, который рекомендуется обновлять раз в неделю для поддержания актуальности.
  7. Актуальная информация по отправлениям: Получить актуальную информацию об отправлениях FBS можно методами /v3/posting/fbs/list (возвращает список отправлений за указанный период) и /v3/posting/fbs/get (возвращает подробную информацию по одному отправлению).

Нас интересует, прежде всего, переход заказа из статуса awaiting_packaging в awaiting_deliver.

Подготовка к работе с Ozon Seller API в 1С

Для начала работы с Ozon Seller API нам потребуется несколько ключевых элементов:

  1. API-ключ: Первым шагом является генерация уникального API-ключа в личном кабинете продавца Ozon. При его создании необходимо указать название, цель использования и роль (уровень доступа). Крайне важно не передавать API-ключ посторонним лицам, поскольку он предоставляет доступ к вашим данным и функциям в личном кабинете.
  2. Идентификатор клиента (Client-Id): Помимо API-ключа, каждый запрос к Ozon API должен содержать ваш Client-Id, который также находится в личном кабинете.
  3. Инструменты 1С для HTTP-запросов: В 1С для отправки запросов к внешним API используются объекты HTTPСоединение и HTTPЗапрос. Мы будем формировать тело запроса в формате JSON и отправлять его по протоколу HTTP (или HTTPS).
  4. Формат данных: Все запросы к Ozon API, как правило, ожидают данные в формате JSON (JavaScript Object Notation). Ответы также приходят в JSON. Для работы с JSON в 1С используются объекты ЗаписьJSON, ЗаписатьJSON, ЧтениеJSON и ПрочитатьJSON.
  5. Кодировка: Запросы и ответы обычно используют кодировку UTF-8.

Прежде чем отправлять запрос, мы должны создать коллекцию заголовков, которая будет включать Client-Id и Api-Key. Эти данные должны быть получены из вашего личного кабинета Ozon. Для тестирования и отладки таких запросов прямо в базе можно использовать инструмент для тестирования REST API на платформе 1С.

Пример кода 1С: Перевод заказа в статус "Ожидает отгрузки" (awaiting_deliver)

Рассмотрим конкретный пример кода 1С, который демонстрирует, как подтвердить сборку заказа и перевести его в статус awaiting_deliver с использованием метода /v3/posting/fbs/ship. Этот метод делит заказ на отправления и переводит их в указанный статус. Код приведен из реальной дискуссии и адаптирован для лучшего понимания.

Предположим, у нас есть текущий заказ (ЗаказТекущий) со статусом awaiting_packaging, и нам нужно его упаковать и подготовить к отгрузке.


ИначеЕсли ЗаказТекущий.status = "awaiting_packaging" Тогда
    Попытка
        СтруктураФильтр = Новый Структура;
        Пакеты = Новый Массив;
        Продукты = Новый Массив;
        Для Каждого Товара Из ЗаказТекущий.products Цикл
            // Ozon ожидает product_id (идентификатор товара на Ozon),
            // но в ЗаказТекущий.products может быть offer_id.
            // Убедитесь, что вы передаете корректный ID.
            // Если в Товара.offer_id хранится product_id, то оставляем так.
            Продукт = Новый Структура("product_id,quantity", Товара.offer_id, Товара.quantity);
            Продукты.Вставить(Продукт);
        КонецЦикла;
        Пакет = Новый Структура("products", Продукты);
        Пакеты.Вставить(Пакет); // Добавляем пакет с продуктами в массив Пакетов
        
        СтруктураФильтр.Вставить("packages", Пакеты); // Массив пакетов
        СтруктураФильтр.Вставить("posting_number", НомерТекущего); // Номер отправления
        // СтруктураФильтр.Вставить("with", Новый Массив); // Эта строка была в примере, но
                                                        // в /v3/posting/fbs/ship она не нужна
                                                        // и может привести к ошибкам.
                                                        // Важно формировать JSON строго по документации API.
        
        ИмяВремФайла = ПолучитьИмяВременногоФайла();
        ЗаписьДжейсон = Новый ЗаписьJSON;
        ЗаписьДжейсон.УстановитьСтроку(Новый ПараметрыЗаписиJSON(,));
        ЗаписатьJSON(ЗаписьДжейсон, СтруктураФильтр, НастройкиДат);
        СтрокаЗапроса = ЗаписьДжейсон.Закрыть();
        
        ИмяФайлаОтвет = ПолучитьИмяВременногоФайла("json");
        ЧтениеОтвета = Новый ЧтениеJSON;
        Сообщить("Сформированный JSON запрос: " + СтрокаЗапроса); // Используем СтрокаЗапроса напрямую
        
        // Заголовки должны быть сформированы заранее и содержать Client-Id и Api-Key
        // Например:
        // Заголовки = Новый Соответствие;
        // Заголовки.Вставить("Client-Id", "ВАШ_CLIENT_ID");
        // Заголовки.Вставить("Api-Key", "ВАШ_API_KEY");
        // Заголовки.Вставить("Content-Type", "application/json");
        
        HTTPЗапрос = Новый HTTPЗапрос("/v3/posting/fbs/ship", Заголовки);
        HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
        
        // Соединение должно быть установлено заранее, например:
        // Соединение = Новый HTTPСоединение("api-seller.ozon.ru",,,,,,Новый ЗащищенноеСоединениеOpenSSL());
        Ответ = Соединение.ОтправитьДляОбработки(HTTPЗапрос, ИмяФайлаОтвет);
        ОтветТело = Ответ.ПолучитьТелоКакСтроку();
        Сообщить("Ответ от Ozon: " + ОтветТело);
        
        ЧтениеОтвета.ОткрытьФайл(ИмяФайлаОтвет);
        // Обработка ответа. Параметры "shipment_date,created_at,in_process_at" могут
        // быть неактуальными или требовать уточнения по текущей документации Ozon.
        // Обычно Ozon возвращает поле "result" с булевым значением или объект с информацией.
        СтруктураОтветПодтверждения = ПрочитатьJSON(ЧтениеОтвета,,,"shipment_date,created_at,in_process_at",ФорматДатыJSON.ISO);
        ЧтениеОтвета.Закрыть();
        
        // Здесь можно добавить логику обработки успешного ответа,
        // например, обновить статус заказа в 1С.
        Если СтруктураОтветПодтверждения.Свойство("result") И СтруктураОтветПодтверждения.result Тогда
            Сообщить("Статус заказа успешно обновлен на Ozon.");
            // ЗаказТекущий.Статус = "awaiting_deliver";
            // ЗаказТекущий.Записать();
        Иначе
            Сообщить("Ошибка при обновлении статуса: " + ОтветТело);
        КонецЕсли;
        
    Исключение
        Описание = ОписаниеОшибки();
        Сообщить("Неуспех: " + Описание);
        ПапкаДляЛогов = "D:\Log\ozon"; // Путь для сохранения логов ошибок
        Если ПапкаДляЛогов <> "" Тогда
            КопироватьФайл(ИмяФайлаОтвет, ПапкаДляЛогов + "\" + Формат(ТекущаяДата(),"ДФ=""ддММгг_ЧЧ-мм-сс""") + ".json");
        КонецЕсли;
        УдалитьФайлы(ИмяФайлаОтвет);
    КонецПопытки;
КонецЕсли;

Пояснения к коду 1С

Давайте подробно разберем, что делает каждая часть представленного кода:

  1. Проверка статуса: ИначеЕсли ЗаказТекущий.status = "awaiting_packaging" Тогда

    Этот блок кода срабатывает только в том случае, если текущий статус заказа в вашей учетной системе 1С соответствует статусу "ожидает упаковки" на Ozon. Это позволяет избежать повторных запросов или некорректных переходов статусов.

  2. Формирование структуры данных для запроса:
    
    СтруктураФильтр = Новый Структура;
    Пакеты = Новый Массив;
    Продукты = Новый Массив;
    Для Каждого Товара Из ЗаказТекущий.products Цикл
        Продукт = Новый Структура("product_id,quantity", Товара.offer_id, Товара.quantity);
        Продукты.Вставить(Продукт);
    КонецЦикла;
    Пакет = Новый Структура("products", Продукты);
    Пакеты.Вставить(Пакет);
            
    СтруктураФильтр.Вставить("packages", Пакеты);
    СтруктураФильтр.Вставить("posting_number", НомерТекущего);
    

    Здесь мы создаем и заполняем иерархическую структуру 1С, которая затем будет преобразована в JSON. Для метода /v3/posting/fbs/ship Ozon ожидает JSON с полями posting_number и packages. Поле packages должно быть массивом, каждый элемент которого представляет собой отдельный пакет и содержит массив products с полями product_id (идентификатор товара на Ozon) и quantity (количество).

    Важное замечание: В примере кода используется Товара.offer_id в качестве product_id. Убедитесь, что Товара.offer_id из вашей структуры ЗаказТекущий.products действительно содержит Ozon Product ID, а не внутренний идентификатор товара или SKU продавца. В противном случае запрос будет некорректным. Документация Ozon API четко указывает, что ожидается product_id.

    Строка //СтруктураФильтр.Вставить("with",Новый Массив); была закомментирована, так как поле "with" не является частью тела запроса для метода /v3/posting/fbs/ship и может привести к ошибке. Всегда строго следуйте документации API при формировании JSON-тела.

  3. Формирование тела JSON-запроса:
    
    ЗаписьДжейсон = Новый ЗаписьJSON;
    ЗаписьДжейсон.УстановитьСтроку(Новый ПараметрыЗаписиJSON(,));
    ЗаписатьJSON(ЗаписьДжейсон, СтруктураФильтр, НастройкиДат);
    СтрокаЗапроса = ЗаписьДжейсон.Закрыть();
    Сообщить("Сформированный JSON запрос: " + СтрокаЗапроса);
    

    Объекты ЗаписьJSON и ЗаписатьJSON используются для сериализации нашей структуры 1С в строку JSON. Результат сохраняется в переменной СтрокаЗапроса, которая затем будет передана в тело HTTP-запроса. Вывод этой строки в сообщение помогает отлаживать запрос и проверять его структуру.

  4. Отправка HTTP-запроса:
    
    HTTPЗапрос = Новый HTTPЗапрос("/v3/posting/fbs/ship", Заголовки);
    HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    Ответ = Соединение.ОтправитьДляОбработки(HTTPЗапрос, ИмяФайлаОтвет);
    

    Здесь мы создаем объект HTTPЗапрос, указывая относительный путь к методу API (/v3/posting/fbs/ship) и коллекцию заголовков. Коллекция Заголовки должна быть сформирована ранее и содержать обязательные заголовки Client-Id, Api-Key и Content-Type: application/json.

    Метод УстановитьТелоИзСтроки помещает JSON-строку в тело запроса с указанием кодировки UTF-8. Затем объект HTTPСоединение (который должен быть инициализирован ранее с базовым URL api-seller.ozon.ru и параметрами защищенного соединения) используется для отправки запроса и сохранения ответа во временный файл.

  5. Обработка ответа:
    
    ОтветТело = Ответ.ПолучитьТелоКакСтроку();
    Сообщить("Ответ от Ozon: " + ОтветТело);
    ЧтениеОтвета.ОткрытьФайл(ИмяФайлаОтвет);
    СтруктураОтветПодтверждения = ПрочитатьJSON(ЧтениеОтвета,,,"shipment_date,created_at,in_process_at",ФорматДатыJSON.ISO);
    ЧтениеОтвета.Закрыть();
    

    После получения ответа, мы читаем его тело как строку для логирования и анализа. Затем используем ЧтениеJSON и ПрочитатьJSON для парсинга JSON-ответа от Ozon в структуру 1С. Параметры "shipment_date,created_at,in_process_at" для ПрочитатьJSON специфичны для обработки дат и могут потребовать корректировки в зависимости от реальной структуры ответа Ozon API. Рекомендуется сначала изучить структуру успешного ответа, чтобы правильно обрабатывать его.

    В случае успешного выполнения, Ozon обычно возвращает поле "result": true или объект с данными об обновленном отправлении.

  6. Обработка ошибок:
    
    Исключение
        Описание = ОписаниеОшибки();
        Сообщить("Неуспех: " + Описание);
        // ... логирование и удаление временных файлов ...
    КонецПопытки;
    

    Блок Попытка...Исключение используется для перехвата возможных ошибок, возникающих в процессе выполнения кода. При возникновении ошибки выводится ее описание, а также может быть реализовано логирование ответа в файл для дальнейшего анализа. Это помогает быстро определить причину проблемы.

Важные моменты и возможные проблемы при формировании запроса

Интеграция с внешними API требует внимательности к деталям. Вот несколько ключевых моментов, которые помогут избежать распространенных ошибок:

  1. Строгая структура JSON: Как показано в коде, критически важно формировать JSON-структуру запроса точно в соответствии с официальной документацией Ozon API. Любые лишние или отсутствующие поля, а также некорректные типы данных, приведут к ошибкам. Пример из сообщения 8, где в запросе присутствует "with": {}, является классическим примером неверной структуры. Для метода /v3/posting/fbs/ship такого поля нет.
  2. Корректный product_id: Убедитесь, что в поле product_id вы передаете именно идентификатор товара на Ozon, а не внутренний ID из вашей 1С или SKU продавца, если они отличаются.
  3. Заголовки запроса: Не забывайте про обязательные заголовки Client-Id и Api-Key, а также Content-Type: application/json. Они должны быть переданы в коллекцию Заголовки при создании объекта HTTPЗапрос. Отсутствие или неверное значение этих заголовков приведет к ошибкам аутентификации.
  4. Обработка ответов API: Всегда проверяйте коды состояния HTTP-ответа (например, 200 OK для успеха) и анализируйте тело ответа. Ozon API обычно предоставляет подробные сообщения об ошибках в JSON-формате, которые могут помочь в отладке.
  5. Актуальность документации: Ozon постоянно развивает свои API. Регулярно сверяйтесь с официальной документацией Ozon Seller API, чтобы быть в курсе последних изменений в методах, структурах запросов и ответов. Это поможет избежать проблем после обновлений на стороне Ozon.

Альтернативные подходы и готовые решения

Для тех, кто не готов самостоятельно разрабатывать интеграцию с нуля, или кто ищет более быстрое решение, существуют альтернативные подходы:

  1. Использование готовых модулей: На рынке 1С представлено множество готовых модулей и обработок для интеграции с Ozon. Одним из таких решений, упомянутых в дискуссии, является "Синхрозон". Такие модули обычно уже поддерживают различные схемы работы (FBO, FBS, realFBS) и предоставляют широкий функционал: управление заказами, товарами, ценами, остатками, печать этикеток, работа с маркировкой и так далее. В случае использования 1С:УТ 11, КА 2 или ERP 2 для централизованной работы с площадками настраивается интеграция 1С с маркетплейсами Ozon, Wildberries и Яндекс.Маркет.
  2. Изучение готовых решений в отладчике: Если у вас есть доступ к готовому решению (например, "Синхрозон") и опыт работы с 1С, вы можете использовать стратегию, предложенную в обсуждении:
    • Установите чистую типовую конфигурацию 1С (например, 1С:Управление торговлей).
    • Интегрируйте на нее выбранный модуль синхронизации (например, "Синхрозон").
    • Используйте отладчик 1С, чтобы пошагово изучить, как формируются запросы к Ozon API: какие заголовки отправляются, какое JSON-тело создается, как обрабатываются ответы.
    • Адаптируйте полученные знания и фрагменты кода для своей конфигурации (в данном случае, для доработанной "Альфа Авто"). Этот метод позволяет увидеть "живую" работу с API и понять нюансы, которые иногда сложно уловить по документации.

Преимущества готовых решений: Готовые модули часто учитывают множество нюансов работы API, предоставляют удобный интерфейс, автоматизируют рутинные операции и регулярно обновляются разработчиками в соответствии с изменениями на стороне маркетплейса. Это может существенно сократить время и ресурсы, необходимые для внедрения и поддержки интеграции.

Получение актуальной информации по отправлениям FBS

Помимо обновления статусов, важно иметь возможность получать актуальную информацию о состоянии ваших отправлений. Для этого Ozon Seller API предоставляет следующие методы:

Используя эти методы, вы можете поддерживать актуальность данных о заказах в вашей учетной системе 1С, автоматизировать отслеживание и реагировать на изменения статусов без необходимости вручную проверять личный кабинет Ozon.

В заключение, успешная интеграция 1С с Ozon Seller API для обновления статусов заказов требует внимательности к деталям документации API, корректного формирования JSON-запросов и тщательной обработки ответов. Независимо от того, разрабатываете ли вы решение с нуля или адаптируете готовые модули, понимание основного принципа взаимодействия с API позволит вам создать надежную и эффективную систему автоматизации управления заказами на Ozon. Регулярно сверяйтесь с документацией Ozon и не стесняйтесь использовать отладчик для изучения работы существующих решений – это ваш лучший помощник в мире интеграций. Для проверки структур и формирования кода работы с JSON можно использовать утилиту для валидации и генерации кода 1С для работы с JSON.

← На главную