Повна ресинхронізація
Стрічка змін приносить лише зміни. Щоб завантажити все, що вже є у WMS, — під час підключення нової системи або щоб відновитися, коли ваші дані розійшлися, — прочитайте повний знімок через сесію ресинхронізації, а далі продовжуйте читати стрічку змін від моменту, коли знімок було зроблено.
Ресинхронізація потребує можливості Читання change feed. Ресинхронізувати можна не кожен тип даних; див. рядок Читання кожного типу в Типах даних інтеграції.
Кроки
-
Розпочніть сесію для потрібних типів даних:
POST /api/v1/integrations/resync-sessions{"externalSystemCode": "ERP_MAIN", "entityTypes": ["PARTY", "PRODUCT"], "warehouseScope": []}warehouseScopeобмежує дані, прив'язані до складів, переліченими складами (ідентифікатори WMS); порожній список означає склади, з якими може працювати ваша зовнішня система. Відповідь:{"sessionId": 1, "status": "CREATED", "snapshotWatermarkEventId": 5, "expiresAt": "2026-10-28T09:54:29.190Z"} -
Читайте сторінки, доки
hasMoreне станеfalse:GET /api/v1/integrations/resync-sessions/1/page?limit=100&cursor=<nextCursor попередньої сторінки>limitобов'язковий, від 1 до 500. Для першої сторінкиcursorне передавайте. Кожен елемент містить повний поточний стан одного запису з ідентифікаторами у вигляді пар{int, ext}(див. Формування payload):{"sessionId": 1,"status": "IN_PROGRESS","items": [{"entityType": "PARTY","scopeType": "GLOBAL","internalEntityId": "01a16373-d1c6-77c5-8fe9-71c359d09e0e","payload": {"id": {"int": "01a16373-d1c6-77c5-8fe9-71c359d09e0e", "ext": null},"name": "Contoso Foods","supplier": true,"deleted": false}}],"nextCursor": "eyJ2ZXJzaW9uIjoxLCJlbnRpdHlUeXBlIjoiUEFSVFkiLCJ…","hasMore": true} -
Завершіть сесію після останньої сторінки:
POST /api/v1/integrations/resync-sessions/1/complete{"expectedStatus": "SNAPSHOT_COMPLETED"} -
Продовжуйте читати стрічку змін після
snapshotWatermarkEventIdсесії. Завершення сесії не переносить вашу контрольну точку, тож підтвердіть цю подію самі, якщо контрольна точка відстає від неї (POST /api/v1/integrations/checkpoints/acknowledge, див. Стрічку змін); тоді цикл читання почнеться одразу після знімка. Усе, що змінилося після знімка, прийде через стрічку; між ними нічого не загубиться.Контрольна точка у вашої системи одна для всіх типів даних. Переносьте її на знімок лише тоді, коли ресинхронізація охопила всі типи, які ваша система читає зі стрічки; інакше зміни інших типів до знімка буде пропущено.
Сесію треба завершити протягом 24 годин від початку. GET /api/v1/integrations/resync-sessions/{sessionId} показує її поточний стан; статуси перелічено в Статусах сесії ресинхронізації.
Код
Функція проводить усю сесію й повертає ідентифікатор події, від якого продовжувати стрічку змін; передайте його функції startChangeFeedAt зі Стрічки змін. Вона використовує клієнт з Основ API.
- JavaScript
- Python
- 1C
// Reads a full snapshot of the given data types page by page and hands every
// record to `handleItem`. Returns the event id to continue the change feed from.
async function runResync(entityTypes, handleItem, {warehouseScope = [], pageSize = 100} = {}) {
const base = '/api/v1/integrations/resync-sessions';
const {body: session} = await wmsRequest('POST', base, {
body: {externalSystemCode: config.externalSystem, entityTypes, warehouseScope},
});
let cursor;
for (;;) {
const query = {limit: pageSize};
if (cursor) query.cursor = cursor;
const {body: page} = await wmsRequest('GET', `${base}/${session.sessionId}/page`, {query});
for (const item of page.items) await handleItem(item); // {entityType, internalEntityId, payload}
if (!page.hasMore) break;
cursor = page.nextCursor;
}
const {body: done} = await wmsRequest('POST', `${base}/${session.sessionId}/complete`, {
body: {expectedStatus: 'SNAPSHOT_COMPLETED'},
});
// Read the change feed with fromEventId = this value: nothing before it is missed.
return done.snapshotWatermarkEventId;
}
def run_resync(entity_types, handle_item, *, warehouse_scope=(), page_size=100):
"""Reads a full snapshot of the given data types page by page and hands every
record to `handle_item`. Returns the event id to continue the change feed from."""
base = "/api/v1/integrations/resync-sessions"
session = wms_request("POST", base, body={
"externalSystemCode": CONFIG["external_system"],
"entityTypes": list(entity_types),
"warehouseScope": list(warehouse_scope),
}).json()
cursor = None
while True:
query = {"limit": page_size}
if cursor:
query["cursor"] = cursor
page = wms_request("GET", f"{base}/{session['sessionId']}/page", query=query).json()
for item in page["items"]: # {entityType, internalEntityId, payload}
handle_item(item)
if not page["hasMore"]:
break
cursor = page["nextCursor"]
done = wms_request("POST", f"{base}/{session['sessionId']}/complete",
body={"expectedStatus": "SNAPSHOT_COMPLETED"}).json()
# Read the change feed with fromEventId = this value: nothing before it is missed.
return done["snapshotWatermarkEventId"]
// Reads a full snapshot of the given data types page by page and passes every
// record to ОбработатьЗаписьСнимка. Returns the event id to continue the change feed from.
Функция ВыполнитьРесинхронизацию(Подключение, ТипыДанных, ОбластьСкладов = Неопределено, РазмерСтраницы = 100) Экспорт
Путь = "/api/v1/integrations/resync-sessions";
Запрос = Новый Структура;
Запрос.Вставить("externalSystemCode", Подключение.КодВнешнейСистемы);
Запрос.Вставить("entityTypes", ТипыДанных); // Массив of codes, e.g. "PRODUCT"
Запрос.Вставить("warehouseScope", ?(ОбластьСкладов = Неопределено, Новый Массив, ОбластьСкладов));
Сессия = ВыполнитьЗапросWMS(Подключение, "POST", Путь, , Запрос).Тело;
ПутьСессии = Путь + "/" + Формат(Сессия["sessionId"], "ЧГ=0");
Курсор = Неопределено;
Пока Истина Цикл
Параметры = Новый Соответствие;
Параметры.Вставить("limit", РазмерСтраницы);
Если Курсор <> Неопределено Тогда
Параметры.Вставить("cursor", Курсор);
КонецЕсли;
Страница = ВыполнитьЗапросWMS(Подключение, "GET", ПутьСессии + "/page", Параметры).Тело;
Для Каждого Запись Из Страница["items"] Цикл
ОбработатьЗаписьСнимка(Запись["entityType"], Запись["payload"]);
КонецЦикла;
Если Не Страница["hasMore"] Тогда
Прервать;
КонецЕсли;
Курсор = Страница["nextCursor"];
КонецЦикла;
Завершение = Новый Структура("expectedStatus", "SNAPSHOT_COMPLETED");
Итог = ВыполнитьЗапросWMS(Подключение, "POST", ПутьСессии + "/complete", , Завершение).Тело;
// Read the change feed with fromEventId = this value: nothing before it is missed.
Возврат Итог["snapshotWatermarkEventId"];
КонецФункции
Процедура ОбработатьЗаписьСнимка(ТипДанных, Данные)
// Your code: create or update your record; Данные["id"]["ext"] is your identifier, if any.
КонецПроцедуры