Заказы Ozon в 4С:УТ 11 через Seller API за 6 шагов
Автор: Михаил С., Архитектор 1С · Опубликовано: 14.09.2026

📅 Опубликовано 14 сентября 2026 г.
Коротко: заказы Ozon попадают в 1С:УТ 11 через Seller API по адресу api-seller.ozon.ru с заголовками Client-Id и Api-Key. Схема рабочая: регулярный опрос метода списка отправлений регламентным заданием плюс HTTP-сервис 1С для push-уведомлений Ozon. Основная трудоёмкость — не запросы, а маппинг: связка offer_id и sku с номенклатурой и характеристиками УТ 11.
- Точка входа одна —
https://api-seller.ozon.ru, авторизация двумя заголовками, без OAuth и без токенов с истечением. - FBS и FBO читаются разными методами: отправления FBS —
/v3/posting/fbs/list, заказы со склада Ozon —/v2/posting/fbo/list. Один универсальный код на оба не напишешь. - Ключ идемпотентности —
posting_number(номер отправления), а неorder_id: одна покупка клиента разъезжается на несколько отправлений. - Push без опроса не работает: HTTP-сервис ловит событие, но состав данных всё равно дочитывается запросом по номеру отправления.
- Ориентир по стоимости: «1С» рекомендует ставки 4 000 ₽ и 5 500 ₽ за час работ (в зависимости от категории) — это единственный публичный ориентир, среднерыночных ставок вендор не публикует.
Чем FBS отличается от FBO и что из этого грузить в УТ 11?
Прежде чем писать хоть строку кода, определитесь со схемой торговли. От неё зависит и набор методов API, и то, какой документ вы создаёте в учёте. Ошибка на этом шаге стоит дороже всего: переписывать придётся не парсер, а логику документооборота.
| Параметр | FBS / realFBS (со своего склада) | FBO (со склада Ozon) |
|---|---|---|
| Метод списка | /v3/posting/fbs/list | /v2/posting/fbo/list |
| Детали одного отправления | /v3/posting/fbs/get | /v2/posting/fbo/get |
| Что нужно бизнесу | Собрать, упаковать, отгрузить в срок | Товар уже на складе Ozon |
| Документ в УТ 11 | «Заказ клиента» → «Реализация товаров и услуг» | Чаще сразу реализация или отчёт комиссионера |
| Критичность задержки обмена | Высокая: есть дедлайн сборки | Низкая: факт продажи уже состоялся |
| Нужны ли push-уведомления | Да, новое отправление важно увидеть быстро | Нет, хватает опроса раз в час |
Практический вывод: заказ клиента как документ имеет смысл только для FBS. Для FBO вы фактически подтягиваете уже совершённые продажи, и заказ там — лишний передаточный объект, который потом придётся закрывать вручную.
Перед разработкой откройте раздел «Продажи» в своём релизе УТ 11.5 — типовой обмен с маркетплейсами в конфигурации развивается, и часть задач может закрываться штатно. Писать свой коннектор имеет смысл, когда типовой не покрывает вашу схему: сложные характеристики, несколько организаций, нестандартные статусы.
Шаг 1. Как получить Client-Id и Api-Key и проверить связь?
Ключ выпускается в личном кабинете продавца Ozon: раздел «Настройки» → «Seller API». Вы получаете пару значений — числовой Client-Id и строковый Api-Key. Ключ показывается один раз, поэтому сразу положите его в безопасное хранилище 1С, а не в константу с типом «Строка», куда его заглядывает любой пользователь с правом чтения.
Проверять связь лучше на «дешёвом» методе, который не зависит от наличия заказов. Подойдёт запрос списка товаров с лимитом 1: если вернулся HTTP 200 — пара ключей валидна и сетевой доступ с сервера 1С есть. Ответ 401 или 403 означает, что ключ неверен, отозван или у него нет прав на метод; 404 — вы ошиблись в версии метода (Ozon регулярно переводит методы с v2 на v3 и v4, версию сверяйте с актуальной документацией).
Отдельно проверьте сеть: сервер 1С часто стоит за корпоративным прокси, где исходящий HTTPS наружу закрыт. Тест из браузера администратора ничего не доказывает — запрос будет уходить с машины сервера 1С, а не с рабочего места.
Шаг 2. Как написать универсальный вызов Seller API в 1С?
Все методы Seller API — это POST с телом JSON. Значит, нужна одна функция-обёртка, которая собирает соединение, заголовки, сериализует тело и разбирает ответ. Дальше весь остальной код будет вызывать только её.
// Общий модуль ИнтеграцияOzon, установлен флаг "Сервер"
// Возвращает подготовленное соединение с API продавца Ozon.
Функция НовоеСоединениеOzon()
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Таймаут = 60; // секунд: список отправлений отвечает не мгновенно
Возврат Новый HTTPСоединение("api-seller.ozon.ru", 443, , , , Таймаут, ЗащищенноеСоединение);
КонецФункции
// Выполняет POST-запрос к Seller API и возвращает разобранный ответ.
//
// Параметры:
// ОтносительныйURL - Строка - например "/v3/posting/fbs/list"
// ТелоЗапроса - Структура - параметры метода
// Настройка - СправочникСсылка.НастройкиОбменаOzon - владелец ключа
//
// Возвращаемое значение:
// Структура - Успех, КодСостояния, Данные, Описание
Функция ВыполнитьМетодOzon(ОтносительныйURL, ТелоЗапроса, Настройка) Экспорт
Результат = Новый Структура("Успех, КодСостояния, Данные, Описание", Ложь, 0, Неопределено, "");
Заголовки = Новый Соответствие();
Заголовки.Вставить("Client-Id", Строка(Настройка.ИдентификаторКлиента));
Заголовки.Вставить("Api-Key", ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(Настройка, "ApiKey"));
Заголовки.Вставить("Content-Type", "application/json");
// Сериализуем тело запроса в строку JSON
ЗаписьJSON = Новый ЗаписьJSON();
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ТелоЗапроса);
СтрокаТела = ЗаписьJSON.Закрыть();
Запрос = Новый HTTPЗапрос(ОтносительныйURL, Заголовки);
Запрос.УстановитьТелоИзСтроки(СтрокаТела, КодировкаТекста.UTF8);
Попытка
Ответ = НовоеСоединениеOzon().ОтправитьДляОбработки(Запрос);
Исключение
Результат.Описание = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации("Обмен с Ozon.Запрос", УровеньЖурналаРегистрации.Ошибка,
, , ОтносительныйURL + Символы.ПС + Результат.Описание);
Возврат Результат;
КонецПопытки;
Результат.КодСостояния = Ответ.КодСостояния;
ТелоОтвета = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
Если ЗначениеЗаполнено(ТелоОтвета) Тогда
ЧтениеJSON = Новый ЧтениеJSON();
ЧтениеJSON.УстановитьСтроку(ТелоОтвета);
Результат.Данные = ПрочитатьJSON(ЧтениеJSON, Истина); // Истина - читать в соответствие
ЧтениеJSON.Закрыть();
КонецЕсли;
Если Ответ.КодСостояния = 200 Тогда
Результат.Успех = Истина;
Иначе
Результат.Описание = "HTTP " + Ответ.КодСостояния + ": " + Лев(ТелоОтвета, 500);
ЗаписьЖурналаРегистрации("Обмен с Ozon.Ответ", УровеньЖурналаРегистрации.Ошибка,
, , ОтносительныйURL + Символы.ПС + Результат.Описание);
КонецЕсли;
Возврат Результат;
КонецФункции
Три детали, на которых спотыкаются чаще всего. Первая: ПрочитатьJSON с параметром Истина возвращает Соответствие, и обращаться к полям нужно через Получить("posting_number"), а не через точку. Вторая: тело ошибки Ozon — тоже JSON, в нём есть текст причины, и его обязательно надо писать в журнал регистрации целиком, иначе разбор инцидента превращается в гадание. Третья: таймаут соединения указывайте явно — без него зависший запрос может держать сеанс фонового задания дольше, чем вы ожидаете, и это одна из типовых причин, по которым сервер 1С перестаёт отвечать в срок.
Как забрать список отправлений за период
Метод списка принимает окно дат и работает со смещением. Перебирать страницы нужно обязательно: единовременно отдаётся ограниченное количество записей, и «недочитанные» страницы — самая частая причина пропавших заказов.
// Возвращает массив отправлений FBS за период.
Функция ОтправленияFBS(ДатаНачала, ДатаОкончания, Настройка) Экспорт
Отправления = Новый Массив();
Смещение = 0;
РазмерСтраницы = РазмерСтраницыИзНастроек(Настройка); // в пределах лимита метода
Пока Истина Цикл
Фильтр = Новый Структура();
Фильтр.Вставить("since", ДатаВФорматеISO(ДатаНачала));
Фильтр.Вставить("to", ДатаВФорматеISO(ДатаОкончания));
Фильтр.Вставить("status", ""); // пустая строка - все статусы
Дополнительно = Новый Структура();
Дополнительно.Вставить("financial_data", Истина);
Дополнительно.Вставить("analytics_data", Истина);
Тело = Новый Структура();
Тело.Вставить("dir", "ASC");
Тело.Вставить("filter", Фильтр);
Тело.Вставить("limit", РазмерСтраницы);
Тело.Вставить("offset", Смещение);
Тело.Вставить("with", Дополнительно);
Ответ = ВыполнитьМетодOzon("/v3/posting/fbs/list", Тело, Настройка);
Если НЕ Ответ.Успех Тогда
ВызватьИсключение "Не удалось получить отправления Ozon. " + Ответ.Описание;
КонецЕсли;
Данные = Ответ.Данные.Получить("result");
Страница = ?(Данные = Неопределено, Неопределено, Данные.Получить("postings"));
Если Страница = Неопределено ИЛИ Страница.Количество() = 0 Тогда
Прервать;
КонецЕсли;
Для Каждого Отправление Из Страница Цикл
Отправления.Добавить(Отправление);
КонецЦикла;
Если Страница.Количество() < РазмерСтраницы Тогда
Прервать; // последняя страница
КонецЕсли;
Смещение = Смещение + РазмерСтраницы;
КонецЦикла;
Возврат Отправления;
КонецФункции
// Приводит дату к виду, который ожидает Seller API.
Функция ДатаВФорматеISO(Дата)
Возврат Формат(Дата, "ДФ=""yyyy-MM-ddTHH:mm:ss""") + ".000Z";
КонецФункции
Важный нюанс с датами: API работает в UTC, а ТекущаяДатаСеанса() отдаёт время сервера. Если не сместить границы окна на разницу часовых поясов, при каждом обмене будет теряться несколько часов заказов — и вы обнаружите это не сразу, а когда покупатель позвонит.
Шаг 3. Как связать offer_id и SKU с номенклатурой УТ 11?
Это тот шаг, где интеграции обычно и умирают. В отправлении каждая строка товара содержит два идентификатора: offer_id — ваш артикул, который вы сами указали при заведении карточки, и sku — внутренний числовой идентификатор товара в системе Ozon. Ни один из них по умолчанию в УТ 11 не хранится.
Соблазн «искать по артикулу на лету» надо задавить сразу. Артикул в справочнике «Номенклатура» УТ 11 не уникален, его меняют менеджеры, а в характеристиках (размер, цвет) артикул вообще один на всю номенклатуру. Правильный способ — отдельный регистр сведений в расширении:
- Измерение
SKU(строка 20) — первичный ключ связи, он стабилен; - Измерение
OfferId(строка 50) — резервный ключ и человекочитаемая подсказка; - Ресурсы:
Номенклатура,Характеристика,Упаковка; - Реквизит
ДатаСопоставления— чтобы видеть, когда связь заводили руками.
Первичное заполнение регистра делается один раз: выгружаете список товаров методом каталога Ozon, сопоставляете по артикулу в обработке с ручной корректировкой — и дальше живёте на регистре. Все несопоставленные позиции обмен должен не «проглатывать», а складывать в отдельный список с задачей менеджеру. Заказ с неопознанным товаром создавать нельзя: строка без номенклатуры сломает и резервирование, и себестоимость.
Найдите специалиста для решения этой задачи на koderion.ru