Integracja WMS z ERP - zakres i kierunki wymiany

Integracja systemów magazynowych łączy WMS z programami używanymi w firmie. Chodzi o ERP i sklep internetowy oraz o systemy transportowe i przewoźników. Bez połączenia te same dane trzeba wpisywać do kilku programów osobno, co wydłuża pracę i zwiększa ryzyko pomyłek. Dane wprowadzone raz w jednym systemie powinny trafić tam, gdzie są potrzebne, bez udziału człowieka. Ogólny zakres omawia artykuł o integracji programu WMS z innymi systemami firmy.

Połączenie z ERP zwykle jest pierwsze. ERP prowadzi zamówienia i faktury, a WMS odpowiada za fizyczny ruch towaru. Gdy systemy wymieniają dane automatycznie, dokumenty magazynowe z przyjęcia i wydania trafiają do księgowości bez przepisywania, a dział zakupów widzi aktualny stan zamiast czekać na raport miesięczny.

KierunekDaneWyzwalacz
ERP do WMSKartoteki towarów i kontrahentówZmiana w ERP lub harmonogram nocny
ERP do WMSZamówienia sprzedaży i zakupuZatwierdzenie dokumentu w ERP
WMS do ERPPotwierdzenia przyjęć (PZ) i wydań (WZ)Zamknięcie dokumentu w magazynie
WMS do ERPPrzesunięcia i korekty stanuOperacja magazynowa lub okresowy zrzut

Wokół WMS działają jeszcze inne systemy, a każdy z nich wymaga własnego mapowania danych:

  • Platformy sprzedażowe - każda zmiana dostępności po przyjęciu lub rezerwacji aktualizuje ofertę w sklepie, co opisuje strona o systemie WMS dla sklepu internetowego.
  • Systemy transportowe i kurierzy - generowanie etykiet przewozowych oraz odbiór numerów śledzenia, a do systemu przewoźnika trafiają waga i wymiary; szczegóły w artykule o firmach kurierskich.
  • Kolektory i drukarki - zeskanowana etykieta GS1 identyfikuje produkt i partię bez wpisywania numerów.
  • Automatyka magazynowa - przenośniki i sortery komunikują się z WMS w czasie rzeczywistym.
Wózek z paletami zafoliowanego towaru oraz dłoń trzymająca smartfon z aplikacją magazynową na tle regałów
Potwierdzenie operacji z urządzenia mobilnego jest źródłem zdarzenia, które integracja przekazuje do ERP

Wybór kanału wymiany

Kanał zależy od wieku systemów i częstotliwości wymiany oraz od tego, co się dzieje, gdy druga strona jest chwilowo niedostępna. Metody można łączyć w jednym wdrożeniu: kartoteki mogą płynąć plikiem raz na dobę, a potwierdzenia wydań przez kolejkę na bieżąco.

KanałJak działaZachowanie przy awarii drugiej stronyKiedy się sprawdza
REST (JSON przez HTTP)Żądanie i odpowiedź w czasie rzeczywistymNadawca dostaje błąd i sam powtarza próbęSklepy internetowe i zapytania wymagające odpowiedzi
Pliki (CSV, XML)Eksport i import w ustalonych odstępachPlik czeka w katalogu do następnego przebieguIntegracje z niższą częstotliwością i mniejszym budżetem
EDI (na przykład EANCOM)Ustandaryzowane komunikaty między firmamiZależy od operatora sieci lub kanału transmisjiDuże sieci handlowe i partnerzy B2B
Kolejka komunikatówAsynchroniczna wymiana przez brokeraKomunikat czeka w kolejce do odbioruWiele systemów i duża liczba zdarzeń
Middleware lub ESBWarstwa pośrednia tłumacząca formatyZależy od konfiguracji warstwyFirmy z kilkoma równoległymi systemami

Z czasem firmy zwykle przechodzą z wymiany plików na REST albo kolejki, bo pliki przestają nadążać za tempem magazynu. Warstwę pośrednią opisuje artykuł o Linkway.BRIDGE i integracji systemów w logistyce, a same zasady komunikacji WMS z innymi programami - strona o komunikacji systemu WMS z innymi systemami.

Reguła: dokument, który zmienia stan magazynu lub księgi, wysyła się kanałem z potwierdzeniem odbioru i śladem, a nie żądaniem bez odpowiedzi.

REST między WMS a ERP

REST dobrze pasuje do zdarzeń pojedynczych dokumentów. WMS po zamknięciu wydania wysyła do ERP potwierdzenie w formacie JSON, a ERP odpowiada kodem statusu. Metoda POST nie jest z natury idempotentna, więc powtórzone żądanie może utworzyć drugi dokument. Definicje metod idempotentnych zawiera specyfikacja RFC 9110. Praktycznym obejściem jest klucz idempotentności, czyli identyfikator komunikatu, który nadawca generuje raz i przesyła w nagłówku przy każdej próbie.

{
  "messageId": "6f1c0d52-3b1a-4c1e-9d55-1b7d8a0c9e11",
  "type": "IssueConfirmed",
  "documentNo": "WZ/2026/09/00123",
  "orderRef": "ZS/2026/09/00456",
  "lines": [ { "sku": "A100", "qty": 12, "batch": "L2609A" } ]
}

Po stronie nadawcy powtórzenia obejmują tylko błędy przejściowe: przekroczenie czasu, kody 5xx i przeciążenie serwera. Błąd 4xx oznacza wadliwe dane, więc kolejna próba niczego nie zmieni. Odstęp między próbami rośnie wykładniczo, żeby nie dobijać niedostępnego ERP.

Kontrakt interfejsu obejmuje też wersję adresu, na przykład /v1/, sposób uwierzytelnienia tokenem oraz limity rozmiaru odpowiedzi. Dane o stanach zwracane są stronami, bo jedno zapytanie o cały magazyn przeciąża obie strony. Transmisję zabezpiecza TLS.

public async Task<bool> SendIssueAsync(IssueConfirmation dto, CancellationToken ct)
{
    var json = JsonSerializer.Serialize(dto);
    for (int attempt = 1; attempt <= 4; attempt++)
    {
        using var req = new HttpRequestMessage(HttpMethod.Post, "/api/warehouse/issues");
        req.Headers.Add("Idempotency-Key", dto.MessageId.ToString());
        req.Content = new StringContent(json, Encoding.UTF8, "application/json");
        try
        {
            using var res = await _http.SendAsync(req, ct);
            if (res.IsSuccessStatusCode) return true;
            if ((int)res.StatusCode < 500
                && res.StatusCode != HttpStatusCode.RequestTimeout
                && res.StatusCode != HttpStatusCode.TooManyRequests) return false;
        }
        catch (HttpRequestException) { }
        await Task.Delay(TimeSpan.FromSeconds(Math.Pow(2, attempt)), ct);
    }
    return false;
}

Pliki wymiany i EDI

Wymiana plikowa jest najprostsza technicznie: jedna strona zapisuje plik do katalogu lub na serwer SFTP, druga go odbiera w harmonogramie. Wymaga jednak trzech zasad, których pominięcie kończy się połowicznymi plikami. Plik zapisuje się pod nazwą tymczasową i zmienia nazwę dopiero po zakończeniu zapisu. Nazwa zawiera numer kolejny lub znacznik czasu. Odbiorca po przetworzeniu przenosi plik do archiwum, a błędny do katalogu wyjątków.

W wymianie między firmami standardem jest EDI. Komunikaty EANCOM opisują przebieg zamówienia: ORDERS jest zamówieniem, DESADV awizem wysyłki, a RECADV potwierdzeniem przyjęcia. Awizo wysyłki z numerami SSCC pozwala utworzyć przyjęcie bez przepisywania, co omawia artykuł o awizacji ładunków. Plik EDI jest tylko formatem, więc te same problemy z duplikatami i kolejnością trzeba rozwiązać po stronie przetwarzania.

Przy plikach CSV i XML większość awarii wynika ze szczegółów formatu. Kodowanie ustala się jawnie na UTF-8, żeby polskie znaki nie zamieniły się w krzaki. Separator dziesiętny musi być taki sam po obu stronach, a daty zapisuje się w formacie ISO 8601, na przykład 2026-09-30T14:05:00. Liczba pól w wierszu i kolejność kolumn są częścią kontraktu, więc zmiana wersji pliku wymaga uzgodnienia z odbiorcą.

Przemysłowa drukarka etykiet z kolorowym wyświetlaczem stojąca na stole
Drukarka etykiet jako punkt końcowy integracji - dane z dokumentu ERP kończą jako etykieta na jednostce logistycznej

Kolejki komunikatów i wzorzec outbox

Największy problem integracji dotyczy chwili między zapisem w bazie a wysłaniem komunikatu. Jeśli WMS zapisze wydanie, a proces padnie przed wysyłką, ERP nigdy się o nim nie dowie. Odwrotna kolejność jest gorsza: komunikat wychodzi, a zapis w bazie się wycofuje. Wzorzec outbox rozwiązuje to jedną transakcją, w której zmiana biznesowa i wiadomość do wysłania trafiają do bazy razem.

BEGIN TRAN;
    UPDATE dbo.IssueDocuments SET Status = 'CLOSED' WHERE DocumentId = @DocumentId;
    INSERT INTO dbo.Outbox (MessageId, MessageType, Payload, CreatedAt, Status)
    VALUES (NEWID(), 'IssueConfirmed', @PayloadJson, SYSUTCDATETIME(), 'NEW');
COMMIT;

Osobny proces, na przykład zadanie SQL Agent lub usługa w C#, czyta wiersze o statusie NEW i publikuje je do brokera albo wywołuje REST. Po potwierdzeniu odbioru zmienia status na SENT. Awaria między publikacją a zmianą statusu powoduje ponowną wysyłkę tej samej wiadomości, więc odbiorca musi ją rozpoznać. Gwarancja dostarczenia co najmniej raz jest prostsza do zapewnienia niż dokładnie raz, a brakujące ogniwo dopowiada idempotentny odbiór.

Kolejność też ma znaczenie. Korekta dokumentu nie może wyprzedzić jego utworzenia, dlatego komunikaty jednego dokumentu numeruje się wersją i przetwarza po kolei. Komunikaty różnych dokumentów mogą płynąć równolegle.

Powtórzenia bez dublowania dokumentów

Odbiorca chroni się przed duplikatami tabelą przyjętych komunikatów z unikalnym indeksem na MessageId. Wstawienie identyfikatora i przetworzenie dokumentu następuje w jednej transakcji. Drugie doręczenie tego samego komunikatu narusza indeks, transakcja się wycofuje, a odbiorca odpowiada sukcesem, bo praca została już wykonana. Składnię indeksów unikalnych opisuje dokumentacja tworzenia indeksów unikalnych w SQL Server.

CREATE UNIQUE INDEX UX_Inbox_MessageId ON dbo.Inbox (MessageId);

BEGIN TRY
    BEGIN TRAN;
        INSERT INTO dbo.Inbox (MessageId, ReceivedAt)
        VALUES (@MessageId, SYSUTCDATETIME());
        INSERT INTO dbo.ReceiptDocuments (ExternalRef, SupplierId, CreatedAt)
        VALUES (@ExternalRef, @SupplierId, SYSUTCDATETIME());
    COMMIT;
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0 ROLLBACK;
    IF ERROR_NUMBER() IN (2601, 2627) RETURN 0;   -- duplikat: komunikat już przetworzony
    THROW;
END CATCH;

Reguła: identyfikator komunikatu powstaje raz, razem z dokumentem, i nie zmienia się przy żadnym powtórzeniu.

Częsty błąd polega na generowaniu nowego identyfikatora przy każdej próbie. Wtedy odbiorca nie ma czym rozpoznać powtórki, a indeks unikalny nie chroni niczego. Drugi błąd to klucz oparty na numerze dokumentu w ERP, który pojawia się dopiero po jego utworzeniu i przy pierwszej wysyłce jest pusty.

Obsługa błędów i monitorowanie

Integracja bez obsługi wyjątków ukrywa problemy: rozbieżność danych wychodzi po kilku tygodniach. Błędy dzieli się według tego, kto może je naprawić, a każda klasa ma inną ścieżkę.

Klasa błęduPrzykładReakcja systemuKto naprawia
TechnicznyPrzekroczenie czasu, kod 503, brak sieciPowtórzenie z rosnącym odstępemNikt, gdy próba się powiedzie; administrator po wyczerpaniu prób
DanychNieznany SKU, brak jednostki miary, zły format datyOdrzucenie i wpis do kolejki wyjątkówOsoba prowadząca kartoteki
BiznesowyZamówienie zamknięte w ERP lub nadwyżka wydaniaStatus Odrzucone z przyczyną i alertDyspozytor lub dział sprzedaży

Monitoring opiera się na kilku prostych zapytaniach: liczba wiadomości w Outbox starszych niż zadany czas, wiek najstarszego wyjątku i liczba odrzuceń w ostatniej dobie. Alert o zablokowanej kolejce trafia do administratora zanim magazyn zauważy brak dokumentów w ERP. Stan zapasów pokazany w obu systemach powinien się zgadzać, a różnice wykrywa porównanie okresowe, co dotyczy każdej ewidencji ilościowej.

Poza obsługą pojedynczych błędów potrzebne jest okresowe uzgadnianie. Nocne zadanie porównuje sumy ilości na SKU w WMS i w ERP, a różnice zapisuje do osobnej tabeli. Rozbieżność, która rośnie z dnia na dzień, wskazuje zgubioną albo zdublowaną wiadomość jeszcze zanim zauważy ją księgowość lub magazyn.

Wskazówka: przed uruchomieniem produkcyjnym trzeba przeprowadzić test na ograniczonej próbce i porównać wynik ręcznie, pole po polu. Błąd mapowania wykryty na dziesięciu rekordach kosztuje kilka minut, a wykryty po tygodniu oznacza prostowanie stanów i dokumentów księgowych.

Kartony z etykietami ostrzegawczymi w wysokiej hali z regałami
Towar oznaczony i zeskanowany w hali - rozbieżność danych między systemami zaczyna się zwykle od jednego błędnie zmapowanego pola

Kolejność wdrożenia integracji

Poniższa kolejność sprawdza się przy jednym systemie i przy kilku jednocześnie. Pominięcie któregoś etapu odbija się później na jakości danych.

  1. Inwentaryzacja systemów i danych - spis programów wymieniających dane oraz dokładnego zakresu informacji w każdą stronę.
  2. Mapowanie pól i formatów - ustalenie, które pole odpowiada któremu w drugim systemie, wraz z ujednoliceniem jednostek miary i formatów dat.
  3. Wybór kanału i test na środowisku testowym - dopasowanie kanału do możliwości obu stron oraz sprawdzenie wymiany na próbce transakcji.
  4. Uruchomienie i monitoring - praca równoległa ze starym procesem w pierwszym okresie, ustalenie osoby reagującej na wyjątki i uruchomienie alertów.

Uruchomienie integracji zwykle idzie razem z wdrożeniem systemu WMS. Operator obsługujący wielu klientów utrzymuje osobny profil integracji dla każdego z nich, tak jak w opisie WMS dla operatora 3PL.

Integracja z SAP i innymi ERP

SAP jest jednym z najczęściej spotkanych ERP w średnich i dużych firmach, dlatego integracja WMS z SAP należy do częstych zadań. Oznacza zwykle dwukierunkową wymianę zleceń magazynowych oraz potwierdzeń ich realizacji, a także stanów zapasów między modułem magazynowym SAP a WMS obsługującym halę. Integracja nie wymusza rezygnacji z dedykowanego WMS: SAP zostaje źródłem danych finansowych i zamówień, a WMS optymalizuje pracę magazynu, której ogólny moduł ERP zwykle nie obsługuje tak precyzyjnie.

Podobnie wygląda współpraca z innymi ERP. Zakres wymiany warto ustalać etapami: najpierw dokumenty przyjęcia i wydania, potem stany zapasów, a na końcu zestawienia kosztowe. Taki układ pozwala wychwycić błędy mapowania na małej liczbie transakcji. Integrację konkretnego systemu opisuje artykuł o integracji Comarch WMS z systemami ERP.

Integracja w Studio WMS.net

Studio WMS.net firmy SoftwareStudio udostępnia mechanizmy integracji z ERP oraz platformami e-commerce, a także z oprogramowaniem firm kurierskich, więc połączenia nie trzeba budować od podstaw. Konfiguracja obejmuje mapowanie dokumentów oraz harmonogram wymiany danych, a osobno reguły obsługi wyjątków, ustalane z zespołem wdrożeniowym na etapie analizy przedwdrożeniowej. Informacje o produkcie zawiera serwis Studio WMS.net, a o usługach integracyjnych - strona integracji systemów informatycznych.