Заказы Ozon в 4С:УТ 11 через Seller API за 6 шагов

Автор: Михаил С., Архитектор 1С · Опубликовано: 14.09.2026

Заказы Ozon в 4С:УТ 11 через Seller API за 6 шагов

📅 Опубликовано 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

Читайте также