База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как обновить код 1С для перехода с /v3/posting/fbs на /v4/ в API Ozon?
- В этой теме 1 ответ, 2 участника, последнее обновление 3 минуты назад сделано
Odin — Одинэсник.
-
АвторЗаписи
-
-
21 октября 2026 в 11:34 #38878
Платформа УТ10.3 надо переделать код процедуры 1c API обмена с Озоном с устаревшего метода «/v3/posting/fbs/unfulfilled/list» на новый «/v4/posting/fbs/unfulfilled/list»
Сохранить логику и структуру, проанализировать и изменить только окружение получения и передачи данных под этот новый метод. Другие возможные на твой взгляд ошибки строго не затрагивать и не изменять!1С (Код)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123СписокИсключений = Новый СписокЗначений;ВыборкаНеПустая = Истина;Пока ВыборкаНеПустая циклЗапрос = Новый Запрос;Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 100| Номенклатура.Ссылка|ПОМЕСТИТЬ ВТНоменклатура|ИЗ| Справочник.Номенклатура КАК Номенклатура|ГДЕ| НЕ Номенклатура.Ссылка В (&СписокИсключений)| И НЕ Номенклатура.ЭтоГруппа| И Номенклатура.Код В(&Код)|;||////////////////////////////////////////////////////////////////////////////////|ВЫБРАТЬ| ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Ссылка,| ЦеныНоменклатурыСрезПоследних.Цена|ИЗ| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(| ,| Номенклатура В| (ВЫБРАТЬ| ВТНоменклатура.Ссылка| ИЗ| ВТНоменклатура КАК ВТНоменклатура)| И ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних";//Запрос.УстановитьПараметр("СписокНоменклатуры",СписокТоваровКабинета);Запрос.УстановитьПараметр("СписокИсключений",СписокИсключений);ЗАпрос.УстановитьПараметр("ТипЦен",ВыборкаКабинетов.ТипЦен);Запрос.УстановитьПараметр("Код", СписокКодовНоменклатуры);результат = Запрос.Выполнить();Если результат.Пустой() тогдаВыборкаНеПустая = Ложь;Продолжить;КонецЕсли;Выборка = Запрос.Выполнить().Выбрать();Выгрузка = запрос.Выполнить().Выгрузить();МассивОстатков = Новый Массив;Пока Выборка.Следующий() циклСписокИсключений.Добавить(Выборка.Ссылка);Структура = Новый Структура;Структура.Вставить("auto_action_enabled","UNKNOWN");Структура.Вставить("old_price", Строка(0));Структура.Вставить("price", Строка(Формат(Выборка.Цена,"ЧГ=0")));Структура.Вставить("min_price", Строка(Формат(Выборка.Цена,"ЧГ=0")));Структура.Вставить("offer_id",Строка(Выборка.Ссылка.Код));Структура.Вставить("product_id",);//Структура.Вставить("stock",?(ОбнулятьКоличество,0,Выборка.КоличествоОстаток));//Структура.Вставить("warehouse_id",Формат(ВыборкаКабинетов.СкладИД,"ЧН=0; ЧГ=0"));МассивОстатков.Добавить(Структура);КонецЦикла;Запись = Новый ЗаписьJSON;Запись.УстановитьСтроку();Данные = Новый Структура;Данные.Вставить("prices", МассивОстатков);Массив = Новый МАссив;ЗаписатьJSON(Запись, Данные, Новый НастройкиСериализацииJSON);ТелоЗапроса = Запись.Закрыть();ССЛ = Новый ЗащищенноеСоединениеOpenSSL(новый СертификатКлиентаWindows(),новый СертификатыУдостоверяющихЦентровWindows());Соединение = Новый HTTPСоединение("api-seller.ozon.ru",,,,,,ССЛ,);ЗаголовкиЗапроса = Новый Соответствие;ЗаголовкиЗапроса.Вставить("Client-Id",ВыборкаКабинетов.КлиентИД);ЗаголовкиЗапроса.Вставить("Api-Key",ВыборкаКабинетов.АпиКей);ЗаголовкиЗапроса.Вставить("Content-Type", "application/json");Запрос = Новый HTTPЗапрос("/v1/product/import/prices",ЗаголовкиЗапроса); // не менять! https://api-seller.ozon.ru/v2/products/stocksЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса);//см_ОбщийМодуль.Пауза(2); //тут было пусто//ЗаписьЖурналаРегистрации("Обновление цен Ozon33",УровеньЖурналаРегистрации.Ошибка,,,Запрос);Ответ = Соединение.ОтправитьДляОбработки(Запрос);Если не Ответ.КодСостояния = 200 тогдаЗаписьЖурналаРегистрации("Обновление цен Ozon1",УровеньЖурналаРегистрации.Ошибка,,,Ответ.КодСостояния); //было остатки//ЗаписьЖурналаРегистрации("Обновление остатков Ozon",УровеньЖурналаРегистрации.Ошибка,,,"Не удалось обновить цены"); //было остаткисм_ОбщийМодуль.Пауза(2); //было Пауза(1)Продолжить;КонецЕсли;ЧтениеJSON = Новый ЧтениеJSON;ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());СтруктураОтвета = ПрочитатьJSON(ЧтениеJSON);Для Каждого ТекЭлемент из СтруктураОтвета.result циклТекНом = Справочники.Номенклатура.НайтиПоКоду(ТекЭлемент.offer_id);СтруктураОтбора = Новый Структура("Ссылка",ТекНом);найдСтрок = Выгрузка.НайтиСтроки(СтруктураОтбора);нЗапись = РегистрыСведений.см_РезультатОбновленияОстатков.СоздатьМенеджерЗаписи();нЗапись.Номенклатура = ТекНом;нЗапись.Дата = ТекущаяДата();нЗапись.Период = ТекущаяДата();нЗапись.Цена = найдСтрок[0].Цена;Если ТекЭлемент.updated тогданЗапись.Результат = "Успешно";ИначенЗапись.Результат = "Остаток не обновлено. "+ТекЭлемент.errors[0].code+" "+ТекЭлемент.errors[0].message+"";КонецЕсли;нЗапись.Записать(Ложь);КонецЦикла;см_ОбщийМодуль.Пауза(1);КонецЦикла;КонецПроцедуры -
21 октября 2026 в 11:34 #38879
В приведенной процедуре нет ни старого метода:
1С (Код)1/v3/posting/fbs/unfulfilled/listни нового:
1С (Код)1/v4/posting/fbs/unfulfilled/listЭта процедура вообще выполняет другой обмен:
1С (Код)1/v1/product/import/pricesОна:
1. Получает цены из регистра
ЦеныНоменклатуры.
2. Формирует JSON с ключомprices.
3. Отправляет цены на Ozon.
4. Разбирает ответ поСтруктураОтвета.result.
5. Записывает результат в регистрсм_РезультатОбновленияОстатков.Поэтому заменить только URL в этой процедуре нельзя. Метод
/v4/posting/fbs/unfulfilled/listпредназначен для получения неотгруженных отправлений FBS, а не для загрузки цен. У него другой формат запроса и другой формат ответа.## Что именно должно быть изменено для метода
/v4/posting/fbs/unfulfilled/listДля нового метода меняется только блок получения данных:
1С (Код)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152ССЛ = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(),Новый СертификатыУдостоверяющихЦентровWindows());Соединение = Новый HTTPСоединение("api-seller.ozon.ru",,,,,,,ССЛ,);ЗаголовкиЗапроса = Новый Соответствие;ЗаголовкиЗапроса.Вставить("Client-Id", ВыборкаКабинетов.КлиентИД);ЗаголовкиЗапроса.Вставить("Api-Key", ВыборкаКабинетов.АпиКей);ЗаголовкиЗапроса.Вставить("Content-Type", "application/json");ДанныеЗапроса = Новый Структура;ДанныеЗапроса.Вставить("dir", "ASC");ДанныеЗапроса.Вставить("filter", Новый Структура);ДанныеЗапроса.Вставить("limit", 100);ДанныеЗапроса.Вставить("offset", 0);Запись = Новый ЗаписьJSON;Запись.УстановитьСтроку();ЗаписатьJSON(Запись, ДанныеЗапроса, Новый НастройкиСериализацииJSON);ТелоЗапроса = Запись.Закрыть();ЗапросHTTP = Новый HTTPЗапрос("/v4/posting/fbs/unfulfilled/list",ЗаголовкиЗапроса);ЗапросHTTP.УстановитьТелоИзСтроки(ТелоЗапроса);Ответ = Соединение.ОтправитьДляОбработки(ЗапросHTTP);Если Ответ.КодСостояния <> 200 ТогдаЗаписьЖурналаРегистрации("Получение неотгруженных отправлений Ozon",УровеньЖурналаРегистрации.Ошибка,,,Ответ.КодСостояния);см_ОбщийМодуль.Пауза(2);Продолжить;КонецЕсли;ЧтениеJSON = Новый ЧтениеJSON;ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());СтруктураОтвета = ПрочитатьJSON(ЧтениеJSON);Однако это уже не является заменой окружения в процедуре
ОбновитьЦены, потому что после получения ответа нужно разбирать отправления, а не элементы с полями:1С (Код)123ТекЭлемент.offer_idТекЭлемент.updatedТекЭлемент.errorsУ метода
/v4/posting/fbs/unfulfilled/listрезультат содержит список отправлений, поэтому логика разбора должна обращаться к массиву отправлений, например:1С (Код)12345Для Каждого Отправление Из СтруктураОтвета.result.postings Цикл// Обработка отправления FBSКонецЦикла;Фактическая структура
resultзависит от версии API и настроек запроса, поэтому перед обращением к полям нужно ориентироваться на полученный JSON.## Минимальное тело запроса
Если нужны все неотгруженные отправления без дополнительных фильтров, тело запроса должно иметь вид:
JavaScript123456{"dir": "ASC","filter": {},"limit": 100,"offset": 0}В 1С это формируется так:
1С (Код)12345ДанныеЗапроса = Новый Структура;ДанныеЗапроса.Вставить("dir", "ASC");ДанныеЗапроса.Вставить("filter", Новый Структура);ДанныеЗапроса.Вставить("limit", 100);ДанныеЗапроса.Вставить("offset", 0);Если требуется отбор по датам или статусу, параметры добавляются внутрь
filter:1С (Код)123456789Фильтр = Новый Структура;Фильтр.Вставить("cutoff_from", "2026-10-20T00:00:00Z");Фильтр.Вставить("cutoff_to", "2026-10-21T23:59:59Z");ДанныеЗапроса = Новый Структура;ДанныеЗапроса.Вставить("dir", "ASC");ДанныеЗапроса.Вставить("filter", Фильтр);ДанныеЗапроса.Вставить("limit", 100);ДанныеЗапроса.Вставить("offset", 0);## Важное ограничение по предоставленному коду
В приведенной процедуре нельзя сохранить одновременно:
— текущую логику обновления цен;
— текущую структуру обработки ответа;
— переход на/v4/posting/fbs/unfulfilled/list.Причина в том, что это разные операции Ozon:
| Текущий код | Новый метод |
|—|—|
| Обновление цен | Получение отправлений FBS |
|POST /v1/product/import/prices|POST /v4/posting/fbs/unfulfilled/list|
| Тело с ключомprices| Тело сdir,filter,limit,offset|
| Ответ с результатами обновления цен | Ответ со списком отправлений |
| Поляoffer_id,updated,errors| Данные отправления, статус, номер отправления, товары и прочее |То есть в предоставленном фрагменте отсутствует участок кода, который нужно переделать. Менять строку:
1С (Код)1Запрос = Новый HTTPЗапрос("/v1/product/import/prices",ЗаголовкиЗапроса);на:
1С (Код)1Запрос = Новый HTTPЗапрос("/v4/posting/fbs/unfulfilled/list",ЗаголовкиЗапроса);нельзя, поскольку вместе с этим придется менять формирование
ТелоЗапросаи разборСтруктураОтвета. Это уже будет изменение логики процедуры, а не только окружения передачи данных.
-
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.