Stan magazynowy nie jest pojedynczą liczbą przy nazwie towaru. Tworzy go zestaw powiązanych wartości: ile sztuk leży fizycznie na regale, ile wykazuje system, ile zarezerwowano pod złożone zamówienia i ile można jeszcze wydać. Rozróżnienie tych wartości decyduje o tym, czy dział handlowy obieca klientowi towar, który naprawdę istnieje.
Artykuł porządkuje logikę śledzenia i raportowania stanów w programie magazynowym klasy WMS. Obejmuje stan bieżący, stan na wskazany dzień, rozbieżności, alerty o brakach i wycenę zapasu.
Składniki stanu magazynowego
Stan magazynowy opisuje ilość konkretnego towaru w danym miejscu i czasie, z dokładnością do lokalizacji, numeru partii albo numeru seryjnego oraz daty przydatności. W systemie WMS każda zmiana wynika z zatwierdzonego dokumentu, na przykład przyjęcia albo wydania. Dzięki temu liczbę widoczną w kartotece magazynowej da się zawsze prześledzić wstecz do operacji, która ją zmieniła.
| Typ stanu | Co oznacza |
|---|---|
| Stan fizyczny | Ilość towaru realnie znajdująca się na regale lub w innej lokalizacji, niezależnie od zapisów systemowych. |
| Stan systemowy | Ilość wynikająca z sumy zatwierdzonych dokumentów, czyli punkt odniesienia przy wykrywaniu rozbieżności. |
| Stan zarezerwowany | Ilość przypisana do przyjętych zamówień, które czekają na kompletację lub wysyłkę. |
| Stan dostępny | Stan systemowy pomniejszony o rezerwacje, czyli ilość do zaoferowania na kolejne zamówienie. |
| Stan historyczny | Stan odtworzony dla wybranego dnia lub momentu z przeszłości na podstawie dokumentów z tego okresu. |
Liczba sztuk na regale rzadko odpowiada liczbie, którą można swobodnie zadysponować. Różnicę tworzą rezerwacje, czyli ilości przypisane do zamówień jeszcze niezrealizowanych. Stan można też prezentować w kilku układach: jako sumę dla całego przedsiębiorstwa albo w rozbiciu na magazyny, a także dla wybranej grupy towarowej. Ta elastyczność ma znaczenie tam, gdzie odpowiedź na pytanie o dostępność zależy od tego, kto pyta: centrala czy operator jednego z oddziałów.

-- przykład: stan systemowy oraz dostępność po rezerwacjach (przykładowe nazwy)
SELECT s.TowarId,
SUM(s.Ilosc) AS Systemowy,
ISNULL(MAX(r.Zarezerwowano), 0) AS Zarezerwowano,
SUM(s.Ilosc) - ISNULL(MAX(r.Zarezerwowano), 0) AS Dostepny
FROM dbo.Stan AS s
LEFT JOIN (SELECT TowarId, SUM(Ilosc) AS Zarezerwowano
FROM dbo.Rezerwacja
GROUP BY TowarId) AS r ON r.TowarId = s.TowarId
GROUP BY s.TowarId;
Sprzedaż lub wydanie w ilości większej niż stan dostępny kończy się przyjęciem zamówienia, którego nie ma z czego skompletować. Program blokuje więc rezerwację ponad stan dostępny albo wyraźnie sygnalizuje taki przypadek operatorowi, zanim dokument zostanie zatwierdzony.
Stan bieżący i sposób jego naliczania
W trybie bieżącym każda operacja magazynowa zmienia stan natychmiast po zatwierdzeniu dokumentu. Dostęp do tych danych przez Internet, a nie wyłącznie z aplikacji zainstalowanej lokalnie, ma znaczenie tam, gdzie z informacją o zapasie pracuje więcej niż jeden zespół. Rozwiązaniem ułatwiającym taki dostęp jest model magazynu w chmurze, w którym stan sprawdza się przez przeglądarkę bez względu na lokalizację użytkownika.
Po stronie bazy danych ważne jest rozdzielenie czytelników i piszących. Raport stanów uruchomiony w godzinach szczytu nie powinien blokować magazynierów potwierdzających operacje. Poziom izolacji READ COMMITTED domyślnie zatrzymuje odczyt wierszy zmienianych w niezatwierdzonych transakcjach. Opcja READ_COMMITTED_SNAPSHOT każe silnikowi czytać ostatnią zatwierdzoną wersję wiersza z magazynu wersji, więc odczyt nie czeka na zapis. Kosztem jest dodatkowe miejsce i obciążenie tempdb.
-- przykład: włączenie odczytu na wersjach wierszy (wymaga chwilowej wyłączności)
ALTER DATABASE MagazynPrzyklad
SET READ_COMMITTED_SNAPSHOT ON
WITH ROLLBACK IMMEDIATE;
Reguła: raport stanów czyta dane zatwierdzone i nie może blokować potwierdzeń na terminalach magazynowych.
Szczegóły poziomów izolacji, w tym SNAPSHOT, opisuje dokumentacja Microsoft Learn dla SET TRANSACTION ISOLATION LEVEL. Wybór poziomu warto sprawdzić testem obciążeniowym na kopii produkcyjnej bazy, bo skutki zależą od liczby jednoczesnych operacji.
Stan w rozbiciu na lokalizacje i partie
Suma dla towaru rzadko wystarcza do pracy na hali. Magazynier potrzebuje wiedzieć, w której lokalizacji leży towar i z której partii go pobrać, a przy towarach z terminem ważności także która partia wygasa najwcześniej. Stan przechowuje się więc w rozbiciu na lokalizacje i partie towaru, a suma dla całego towaru jest wynikiem agregacji. Dla towarów z numerem seryjnym wiersz stanu opisuje pojedynczą sztukę.
-- przykład: jeden wiersz stanu na kombinację towar, lokalizacja, partia
CREATE UNIQUE CLUSTERED INDEX CX_Stan
ON dbo.Stan (TowarId, LokalizacjaId, PartiaId);
Unikalny indeks klastrowy pilnuje, żeby dla jednej kombinacji istniał jeden wiersz, więc równoległe operacje aktualizują ten sam rekord, a nie tworzą duplikatów. Rozbicie na partie umożliwia też wydawanie według zasady FEFO, w której pierwsza schodzi partia o najkrótszym terminie ważności.
Stan na wskazany dzień
Oprócz stanu bieżącego program przelicza dynamicznie stan historyczny, czyli zapas, jaki obowiązywał na koniec dowolnego dnia z przeszłości. Standardowo dokładność ustala się do końca dnia, ale w razie potrzeby można ją zawęzić do konkretnej godziny i minuty. Dane odtwarza się w układzie ogólnym albo szczegółowym, z podziałem na numery partii obecne w magazynie tego dnia, wraz z wyceną na podstawie dokumentów przyjęć z danego okresu. Funkcja przydaje się przy rozliczeniach miesięcznych, reklamacjach dotyczących konkretnej dostawy i wyjaśnianiu rozbieżności wykrytych po czasie. Zapytanie o stan na koniec zamkniętego miesiąca daje zawsze ten sam wynik, o ile korekty wystawia się datą bieżącą, a nie wsteczną.
Sposoby odtworzenia stanu z przeszłości
| Sposób | Dokładność | Koszt zapytania | Wymagania |
|---|---|---|---|
| Przeliczenie z dokumentów | Do momentu zatwierdzenia dokumentu | Rośnie z liczbą dokumentów | Znak ruchu zapisany dla każdego typu dokumentu |
| Migawka nocna | Do dnia wykonania migawki | Niski | Zadanie SQL Agent i miejsce na dane |
| Tabela temporalna | Do dowolnej chwili | Średni, dodatkowa tabela historii | SQL Server 2016 lub nowszy |
Przeliczenie z dokumentów jest najdokładniejsze, bo korzysta z tego samego źródła prawdy co stan bieżący. Wymaga jednak słownika typów dokumentów ze znakiem ruchu: plus dla PZ i PW, minus dla WZ i RW. Przesunięcia MM w rozbiciu na magazyny potrzebują dodatkowej kolumny magazynu w pozycji dokumentu.
-- przykład: stan na koniec wskazanego dnia (przykładowe nazwy)
DECLARE @Na DATETIME2(0) = '2026-08-31T23:59:59';
SELECT p.TowarId, p.PartiaId,
SUM(p.Ilosc * t.Znak) AS StanNaDzien
FROM dbo.DokumentPozycja AS p
JOIN dbo.DokumentNaglowek AS d ON d.DokumentId = p.DokumentId
JOIN dbo.TypDokumentu AS t ON t.Typ = d.Typ
WHERE d.Status = 1
AND d.DataZatwierdzenia <= @Na
GROUP BY p.TowarId, p.PartiaId
HAVING SUM(p.Ilosc * t.Znak) <> 0;
Tabele temporalne, dostępne od SQL Server 2016, przechowują historię wierszy automatycznie i pozwalają zapytać o stan sprzed dowolnej chwili klauzulą FOR SYSTEM_TIME AS OF. Czas w kolumnach okresu jest zapisywany w UTC, więc granicę dnia trzeba przeliczyć ze strefy czasowej firmy. Mechanizm opisuje dokumentacja Microsoft Learn o tabelach temporalnych.
Rozbieżności między stanem systemowym a fizycznym
Stan systemowy i fizyczny powinny być równe, ale w magazynach o dużej rotacji z czasem się rozjeżdżają. Rozbieżność inwentaryzacyjna to różnica między tym, co wykazuje system, a tym, co leży na regale, wykrywana najczęściej podczas spisu z natury. Powtarzają się cztery przyczyny.
- Pominięty dokument - operacja wykonana poza standardową procedurą nie zostawiła zapisu w systemie.
- Ręczne wpisanie ilości - pomyłka przy wpisywaniu zamiast skanowania kodu kreskowego.
- Uszkodzenie lub ubytek - towar zniknął z półki bez osobnego dokumentu korygującego.
- Zła lokalizacja - towar przypisano do niewłaściwego miejsca, więc system wskazuje puste miejsce.
Im więcej operacji odbywa się poza systemem, tym większe ryzyko, że stan systemowy przestanie odzwierciedlać rzeczywistość. Ograniczenie rozbieżności zaczyna się od zapisu każdej operacji, zanim towar fizycznie zmieni miejsce, oraz od skanowania zamiast ręcznego wpisywania.
Wykryta różnica wymaga rozliczenia właściwym dokumentem. Nadwyżkę inwentaryzacyjną przyjmuje się zwykle dokumentem przychodu wewnętrznego, a niedobór dokumentem rozchodu, z opisem przyczyny i decyzją osoby upoważnionej. Dopiero po zatwierdzeniu takiego dokumentu stan systemowy zrównuje się z fizycznym, a cały zapis pozostaje w historii jako ślad kontroli.

Pomaga cykliczna inwentaryzacja wybranych lokalizacji lub grup towarowych, prowadzona częściej niż jeden spis roczny, oraz regularne porównywanie stanów z dokumentami ERP. Do rejestrowania wyników służy program do inwentaryzacji, który zestawia stan systemowy z wynikiem liczenia i od razu generuje dokument korygujący dla wykrytej różnicy. Opis modułu producenta znajduje się na stronie o programie do inwentaryzacji.
Alerty o niskich stanach i brakach towaru
Program pozwala ustawić dla każdego indeksu próg alarmowy, poniżej którego stan dostępny jest sygnalizowany jako niski. Powiadomienie trafia do osoby odpowiedzialnej za zamówienia u dostawcy, zanim towar faktycznie się skończy, co ogranicza liczbę zamówień niemożliwych do zrealizowania. Alert może też dotyczyć nadmiaru, czyli stanu powyżej progu maksymalnego, który sygnalizuje zamrożony kapitał i brak miejsca na regałach.
Próg lepiej wiązać ze średnią rotacją niż z arbitralną liczbą sztuk. Klasyczny wzór punktu ponownego zamówienia to średnie dzienne wydanie pomnożone przez czas dostawy w dniach, powiększone o zapas bezpieczeństwa. Wtedy alert reaguje proporcjonalnie zarówno przy towarach wolno rotujących, jak i przy sprzedawanych w dużych ilościach. Dane o średnich wydaniach pochodzą z rejestru opisanego w artykule o ewidencji wydań z magazynu.
Alert generuje się raz po przekroczeniu progu, a zamyka po uzupełnieniu zapasu. Gdyby system powtarzał powiadomienie przy każdej kolejnej operacji, odbiorcy szybko nauczyliby się je ignorować i realne braki zginęłyby w szumie.
Reguła: alert liczony od stanu dostępnego, a nie fizycznego, ostrzega wcześniej, bo uwzględnia towar zarezerwowany pod inne zamówienia.
Dokumenty, które zmieniają stan
Każda zmiana stanu wynika z zatwierdzonego dokumentu magazynowego, a nie z ręcznej edycji liczby w kartotece. Cztery grupy dokumentów odpowiadają za zdecydowaną większość operacji.
- PZ i PW - zwiększają stan po dostawie od dostawcy zewnętrznego albo po zakończonym procesie wewnętrznym.
- WZ i RW - zmniejszają stan przy wydaniu odbiorcy zewnętrznemu lub zużyciu na potrzeby własne, na przykład produkcji.
- MM - przenosi ilość między dwoma magazynami albo lokalizacjami bez zmiany łącznego stanu firmy.
- Dokument korygujący - poprawia wcześniejszy zapis, zostawiając oba dokumenty w historii.
Powiązanie zmiany z dokumentem ma znaczenie praktyczne przy wyjaśnianiu rozbieżności. Zamiast szukać przyczyny w całym okresie rozliczeniowym, wystarczy przejrzeć dokumenty dla danego towaru i lokalizacji, żeby ustalić, na którym etapie stan przestał się zgadzać. Zapis po stronie dostawy opisuje artykuł o przyjęciu towaru do magazynu.
Wartość zapasu i sposoby prezentacji
Poza ilością program przelicza wartość zapasu, mnożąc ilość przez cenę ewidencyjną towaru. Może to być cena zakupu albo inna metoda wyceny przyjęta w przedsiębiorstwie. Wartość prezentuje się w złotych, a także w walutach obcych, co ułatwia rozliczenia w firmach importujących towar. Zestawienia wartościowe pokazują, ile kapitału jest zamrożone w zapasie danej grupy towarowej, i wspierają decyzję o ograniczeniu zamówień asortymentu wolno rotującego.
Wycena ma też znaczenie przy obsłudze kilku kontrahentów w jednym obiekcie. Wartość stanów rozlicza się wtedy osobno dla towaru każdego właściciela, mimo że fizycznie zajmuje on wspólną przestrzeń. Wymaga to, żeby każda operacja magazynowa była od razu przypisana do właściwego kontrahenta, a nie rozliczana zbiorczo na koniec okresu.
Wartość zależy również od metody wyceny rozchodu. Przy metodzie FIFO towar schodzi po cenach najstarszych dostaw, a przy średniej ważonej po jednej cenie przeliczanej po każdym przyjęciu. Ta sama fizyczna ilość może więc mieć różną wartość księgową, dlatego metodę wyceny ustala się w polityce rachunkowości firmy, a program tylko ją realizuje spójnie dla wszystkich dokumentów.

Funkcje bieżącego podglądu stanów oraz pulpity raportowe opisano szerzej na stronie systemu magazynowego SoftwareStudio, gdzie omówiono interfejs pracy z tymi danymi z poziomu przeglądarki, bez instalacji dodatkowego oprogramowania. Zestawienia liczbowe i wskaźniki opisuje z kolei artykuł o raportowaniu w systemie WMS. Stan jest wiarygodny tylko wtedy, gdy każda operacja fizyczna ma odzwierciedlenie w dokumencie zatwierdzonym tego samego dnia, a rozbieżności rozlicza się regularnie.



