Spis roczny i spis ciągły - wymagania wobec programu

Program do inwentaryzacji trzeba dobierać do metody spisu, a nie odwrotnie. Spis roczny jest jednorazowym przeliczeniem całego asortymentu na dzień bilansowy. Wymaga zamrożenia stanów oraz komisji spisowej, a także kilku dni pracy całego zespołu. Spis ciągły rozkłada to samo zadanie na cały rok: lokalizacje lub grupy asortymentowe liczy się w cyklach, tak aby każdy indeks trafił do spisu co najmniej raz w ustalonym okresie.

Przepisy o rachunkowości wymagają inwentaryzacji co najmniej raz w roku dla większości grup aktywów, więc spis ciągły uzupełnia roczny, a nie zastępuje go w każdym przypadku. Sama metodyka liczenia jest opisana w artykule o metodach inwentaryzacji magazynu. Ten tekst dotyczy narzędzi: co każda metoda spisu wymaga od programu i czym różnią się arkusz i terminal Android od modułu w systemie WMS.

WymaganieSpis rocznySpis ciągły
Stan wyjściowyzamrożony na dzień spisuruchomy, liczony na chwilę liczenia lokalizacji
Praca magazynu w trakciewydania i przyjęcia wstrzymane lub ograniczonemagazyn pracuje, lokalizacja jest blokowana tylko na czas liczenia
Zadania spisujedno duże, podzielone na strefywiele małych, tworzonych według harmonogramu
Wymagane narzędziearkusze spisowe i sprawny zapis wynikówzadania na terminalu i porównanie ze stanem w bazie
Główne ryzykobłąd przy scalaniu wyników z wielu zespołówruchy towaru w trakcie liczenia fałszujące różnicę

Z tej różnicy wynika większość decyzji zakupowych. Magazyn robiący jeden spis w roku poradzi sobie z prostszym narzędziem. Magazyn, który liczy lokalizacje codziennie, potrzebuje programu znającego stan magazynowy oraz ruchy towaru, a także blokady lokalizacji. Ciągłą metodę opisuje osobno artykuł o inwentaryzacji ciągłej w magazynie.

W spisie rocznym istotny jest jeszcze podział na strefy i zespoły liczące. Każda strefa dostaje arkusz z listą lokalizacji, a wyniki wracają do jednej osoby, która scala je w protokół. Im więcej zespołów, tym większe ryzyko rozbieżnych wersji arkusza, więc narzędzie powinno pilnować, aby jedna lokalizacja nie trafiła do dwóch zespołów naraz.

Pracownica z tabletem w alejce magazynowej przy regałach z towarem na paletach, w tle inni pracownicy
Liczenie lokalizacji w alejce - narzędzie musi znać stan ewidencyjny, do którego porówna wynik tego liczenia

Arkusz kalkulacyjny jako program do inwentaryzacji

Arkusz pozostaje najprostszym punktem wyjścia. Nie wymaga licencji na osobne oprogramowanie ani wdrożenia, a większość osób w magazynie potrafi go obsłużyć. Przy kilkuset indeksach i jednym spisie w roku bywa wystarczający, zwłaszcza gdy stan ewidencyjny da się wyeksportować z programu magazynowego do pliku.

Ograniczenia ujawniają się z rosnącą liczbą pozycji. Wpisywanie ilości ręcznie sprzyja pomyłkom, bo arkusz nie waliduje kodów kreskowych. Scalanie plików wypełnianych równolegle przez kilka osób bywa czasochłonne i ryzykowne, a raz nadpisany plik nie zostawia śladu, kto i kiedy zmienił ilość. Po stronie księgowej dochodzi kwestia dowodowa: protokół spisu zbudowany z luźnych arkuszy trudniej obronić przed audytorem.

Arkusz można wzmocnić walidacją danych na liście indeksów i blokadą komórek z ewidencją. Takie zabezpieczenia pilnuje jednak człowiek, a nie program, więc po kilku spisach zwykle ktoś wyłącza blokadę, żeby szybciej poprawić wpis. Jest to typowy moment, w którym firma zaczyna szukać narzędzia z ewidencją ilości po stronie serwera.

Import wyników z arkusza do bazy

Przejście z arkusza na program magazynowy zaczyna się zwykle od importu wyników liczenia do tabeli pośredniej. Plik CSV z trzema kolumnami (lokalizacja, indeks, ilość) wczytuje się do tabeli przygotowawczej, a dopiero po walidacji przenosi do właściwej. Poniższy przykład pokazuje wczytanie pliku i kontrolę duplikatów, przy czym nazwy tabel i ścieżka są umowne.

CREATE TABLE dbo.SpisImport (
    Lokalizacja VARCHAR(20)   NOT NULL,
    Indeks      VARCHAR(40)   NOT NULL,
    Ilosc       DECIMAL(12,3) NOT NULL
);

BULK INSERT dbo.SpisImport
FROM 'D:\import\spis_strefa_A.csv'
WITH (FIRSTROW = 2, FIELDTERMINATOR = ';', ROWTERMINATOR = '\n', CODEPAGE = '65001');

-- ta sama para lokalizacja-indeks wpisana więcej niż raz
SELECT Lokalizacja, Indeks, COUNT(*) AS Wpisy
FROM dbo.SpisImport
GROUP BY Lokalizacja, Indeks
HAVING COUNT(*) > 1;

Dopiero przy takiej kontroli widać, ile pozycji zostało policzonych dwa razy, a ile pominięto. To zadanie system magazynowy wykonuje automatycznie, bo przypisuje lokalizację do jednego zadania spisu naraz.

Terminal Android i kolektor przy spisie

Skanowanie zamiast wpisywania usuwa najczęstszą przyczynę błędów. Operator skanuje etykietę lokalizacji, potem kolejne towary, a program sam zlicza sztuki. Cały przebieg liczenia na urządzeniu mobilnym, ze spisem ślepym i ponownym liczeniem, opisuje artykuł o aplikacji magazynowej na Androidzie. Tutaj istotny jest wybór samego urządzenia.

Zwykły smartfon czyta kody aparatem. To rozwiązanie tanie, ale wolniejsze przy dużej liczbie skanów wykonywanych jeden po drugim. Kolektor z głowicą skanującą czyta kod w ułamku sekundy, ma obudowę odporną na upadki i zapylenie, a bateria wystarcza na całą zmianę. Kod kreskowy towaru powinien prowadzić do jednego indeksu. Gdy ten sam indeks ma kilka kodów EAN, na przykład dla opakowania jednostkowego i zbiorczego, terminal musi znać przelicznik, bo inaczej karton zeskanowany raz zostanie policzony jako jedna sztuka zamiast dwunastu.

Więcej o tym urządzeniu zawiera strona o kolektorze danych Android WMS, a ogólny wybór sprzętu ze skanerem omawia tekst o programie magazynowym ze skanerem.

NarzędzieZaletyOgraniczeniaKiedy pasuje
Arkusz kalkulacyjnybrak kosztu licencji, znany interfejsbrak walidacji, trudne scalaniekilkaset indeksów, jeden spis w roku
Aplikacja mobilna na smartfonieszybki start, skan aparatemwolniejszy skan, wyniki trzeba przenosić do systemusporadyczny spis małego asortymentu
Moduł w systemie WMSwspólna baza, raport rozbieżności bez przepisywaniawyższy koszt wdrożeniadużo indeksów, spis ciągły, wiele magazynów
Kolektor danychtrwałość, szybki skan seryjny, bateria na zmianękoszt sprzętu i obsługa flotychłodnia, wiele godzin liczenia dziennie
Przemysłowy kolektor danych z klawiaturą i ekranem na tle zamazanych regałów magazynowych
Kolektor danych klasy przemysłowej - sprzęt do wielogodzinnego liczenia w trudnych warunkach pracy

Moduł inwentaryzacyjny w systemie WMS

Moduł wbudowany w system WMS korzysta z tej samej bazy danych co ewidencja stanów oraz dokumenty magazynowe i lokalizacje. Spis startuje na podstawie aktualnych stanów magazynowych, a rozbieżność trafia do raportu bez ręcznego przenoszenia. W module Studio WMS.net ceny ewidencyjne oraz arkusze spisowe i dokumenty inwentaryzacyjne mieszczą się w jednym miejscu, a raporty można eksportować do arkuszy i PDF. Szczegóły opisuje moduł inwentaryzacji WMS.net.

Dostępność w wariancie chmurowym oznacza, że ten sam moduł działa przez przeglądarkę, bez instalacji na stacji roboczej. Wariant opisuje artykuł o magazynie w chmurze. Ze strony producenta dostępna jest też osobna publikacja o programie do inwentaryzacji w Studio WMS.net.

Reguła: spis ciągły ma sens dopiero wtedy, gdy program blokuje liczoną lokalizację i uwzględnia ruchy towaru z czasu liczenia.

Rozbieżności po spisie i ich księgowanie

Rozbieżność jest różnicą między ilością policzoną a ilością w ewidencji. Nadwyżka i niedobór wymagają różnych dokumentów, a decyzja o ich rozliczeniu należy do osób wskazanych w polityce rachunkowości firmy. Program powinien zestawić różnice ilościowo i wartościowo, co ułatwia zatwierdzanie korekt od największej kwoty.

Zestawienie musi objąć trzy przypadki: pozycję policzoną i znaną ewidencji, pozycję policzoną, której ewidencja nie zna, oraz pozycję z ewidencji, której nikt nie znalazł. Złączenie wewnętrzne pokaże tylko pierwszy przypadek, dlatego używa się złączenia zewnętrznego z obu stron. Zapytanie poniżej jest przykładem, a nazwy obiektów nie odpowiadają schematowi konkretnego produktu.

SELECT COALESCE(s.Indeks, e.Indeks)               AS Indeks,
       COALESCE(s.LokalizacjaId, e.LokalizacjaId) AS LokalizacjaId,
       ISNULL(e.Ilosc, 0)                         AS IloscEwidencja,
       ISNULL(s.IloscPoliczona, 0)                AS IloscPoliczona,
       ISNULL(s.IloscPoliczona, 0) - ISNULL(e.Ilosc, 0)          AS Roznica,
       (ISNULL(s.IloscPoliczona, 0) - ISNULL(e.Ilosc, 0))
           * k.CenaEwidencyjna                                   AS WartoscRoznicy
FROM (SELECT Indeks, LokalizacjaId, SUM(Ilosc) AS IloscPoliczona
      FROM dbo.SpisLiczenie
      WHERE ZadanieId = @ZadanieId
      GROUP BY Indeks, LokalizacjaId) AS s
FULL OUTER JOIN dbo.StanSpisu AS e
       ON e.Indeks = s.Indeks AND e.LokalizacjaId = s.LokalizacjaId
JOIN dbo.Kartoteka AS k
       ON k.Indeks = COALESCE(s.Indeks, e.Indeks)
WHERE ISNULL(s.IloscPoliczona, 0) <> ISNULL(e.Ilosc, 0);

Wynik zapytania jest podstawą dwóch typów dokumentów. Nadwyżkę wprowadza się dokumentem przyjęcia wewnętrznego (PW), a niedobór dokumentem rozchodu wewnętrznego (RW), zgodnie z opisem w artykule o dokumentach magazynowych. Wycena idzie po cenie ewidencyjnej z kartoteki. Dokument korygujący powinien zachować odwołanie do zadania spisu, aby księgowość mogła odtworzyć źródło każdej korekty. Rozdział ról pomaga to utrzymać: operator liczy, kierownik zatwierdza korektę, a księgowość otrzymuje gotowy dokument z wyceną.

RozbieżnośćDokument w WMSKto zatwierdza
Nadwyżka po drugim liczeniuPW z odwołaniem do zadania spisuosoba wskazana w procedurze inwentaryzacji
Niedobór po drugim liczeniuRW z przyczyną i wartościąkomisja lub osoba odpowiedzialna za rozliczenie
Różnica poniżej progukorekta zbiorcza według zasad firmykierownik magazynu
Pozycja nieznana ewidencjinowa karta towaru, potem PWdział zakupów lub księgowość

Stan w chwili liczenia w spisie ciągłym

W spisie rocznym stan jest zamrożony, więc porównanie jest proste. W spisie ciągłym magazyn pracuje w trakcie liczenia i stan ewidencyjny zmienia się każdym wydaniem. Operator liczy lokalizację o godzinie 10:15, a wydanie zapisane o 10:20 zmniejszyło stan w bazie. Bez korekty program pokaże niedobór, którego nie ma.

Poprawne porównanie odnosi wynik liczenia do stanu z chwili liczenia. Stan na wskazany moment odtwarza się z bieżącego stanu i ruchów zapisanych po tym momencie. Zapytanie poniżej odejmuje od stanu bieżącego sumę zmian zapisanych po czasie liczenia; kolumna zmiany ma znak dodatni dla przyjęć i ujemny dla wydań.

SELECT st.Indeks, st.LokalizacjaId,
       st.Ilosc - ISNULL(SUM(r.Zmiana), 0) AS IloscWChwiliLiczenia
FROM dbo.Stan AS st
LEFT JOIN dbo.RuchMagazynowy AS r
       ON r.Indeks = st.Indeks
      AND r.LokalizacjaId = st.LokalizacjaId
      AND r.DataRuchu > @CzasLiczenia
WHERE st.LokalizacjaId = @LokalizacjaId
GROUP BY st.Indeks, st.LokalizacjaId, st.Ilosc;

Ta sama zasada tłumaczy blokadę lokalizacji w programach do spisu ciągłego: skoro system wstrzymuje ruchy w liczonej lokalizacji na kilka minut, korekta jest mała albo zbędna. Przy raportach czytających stan podczas pracy magazynu przydaje się poziom izolacji SNAPSHOT, który daje spójny obraz danych bez blokowania zapisów. Opisuje go dokumentacja SET TRANSACTION ISOLATION LEVEL w Microsoft Learn.

Kryteria wyboru programu do inwentaryzacji

Wybór rozstrzygają cztery czynniki, wymienione poniżej. Im więcej indeksów, tym mniej opłaca się ręczne przenoszenie wyników. Kilkaset pozycji obsłuży arkusz albo aplikacja mobilna, natomiast przy kilkudziesięciu tysiącach pozycji przenoszenie danych między systemami przestaje być wykonalne w rozsądnym czasie.

  • Liczba indeksów i lokalizacji - skala zadań spisu i liczba operatorów liczących równolegle.
  • Częstotliwość spisów - jeden spis w roku uzasadnia proste narzędzie, cykliczne liczenie wymaga planowania zadań.
  • Model rozliczenia - subskrypcja w modelu SaaS albo jednorazowe wdrożenie z niższym kosztem w dłuższym okresie.
  • Integracja - eksport wyników do systemu ERP lub księgowego bez ponownego wpisywania.

Model rozliczenia wpływa na całkowity koszt. Aplikacje samodzielne rozlicza się zwykle miesięcznie i rzadko pozwalają przekazać wyniki do głównej ewidencji. Moduł w systemie WMS wymaga wdrożenia, lecz nie duplikuje danych. Ślad zmian ma równie duże znaczenie jak szybkość liczenia: program powinien zapisywać, kto policzył lokalizację, kto zatwierdził korektę i kiedy to zrobił. Kontrolę wiarygodności wyniku, niezależną od wyboru narzędzia, opisuje artykuł o kontroli procesu inwentaryzacji magazynu.

Pilotaż narzędzia w jednej strefie

Rzeczywisty test na kilkuset lokalizacjach szybciej ujawnia ograniczenia niż specyfikacja dostawcy. Pilotaż przebiega w czterech krokach.

  1. Wybór strefy - jedna strefa magazynu z asortymentem o różnej rotacji i z lokalizacjami wysokimi.
  2. Spis próbny - liczenie tej samej strefy w nowym narzędziu i w dotychczasowym, aby porównać wyniki.
  3. Pomiar czasu i błędów - liczba pozycji na godzinę oraz liczba różnic wykrytych przy ponownym liczeniu.
  4. Test rozliczenia - przeniesienie różnic do dokumentów PW i RW oraz sprawdzenie, czy księgowość otrzymuje komplet danych.

Program do inwentaryzacji jest tylko częścią procesu. Zwrot z inwestycji zależy jeszcze od dyscypliny liczenia i jakości wdrożenia, co omawia artykuł o programie do inwentaryzacji. Konfigurację samego programu magazynowego, w tym uprawnień do zatwierdzania korekt, opisuje tekst o konfiguracji programu magazynowego.