Kod EAN-13 przy kasie sklepowej niesie jedną informację - numer produktu. W magazynie to za mało. Operator przyjmujący dostawę potrzebuje w tym samym momencie numeru towaru, numeru partii, terminu ważności i numeru nośnika, a każde ręczne przepisanie tych wartości to ryzyko pomyłki i kilkanaście sekund straconego czasu. Standard GS1 rozwiązuje ten problem dwoma symbolikami: liniowym kodem GS1-128 oraz dwuwymiarowym GS1 DataMatrix. Poniżej rozbieramy je na części i pokazujemy, jak taką etykietę czyta parser w Studio WMS.net.

O czym przeczytasz na tej stronie

Budowa kodu GS1-128 i różnice względem DataMatrix

GS1-128, dawniej nazywany EAN-128, to nie osobna technologia druku, lecz zestaw reguł zapisu danych nałożony na symbolikę Code 128. Ta sama drukarka i ten sam czytnik obsłużą oba warianty - różnica leży w treści i w jednym znaku na początku ciągu.

Symbol GS1-128 składa się kolejno z cichej strefy początkowej, znaku startu (wariant A, B albo C), symbolu funkcyjnego FNC1 wstawionego zaraz po starcie, właściwej treści złożonej z identyfikatorów zastosowań i przypisanych im wartości, znaku kontrolnego liczonego algorytmem mod 103, znaku stopu oraz cichej strefy końcowej. Rolę graniczną pełni tu FNC1 w pierwszej pozycji - to on przełącza czytnik w tryb GS1. Bez niego identyczny ciąg kresek zostanie odczytany jako zwykły tekst i żaden program magazynowy z kodami kreskowymi nie rozbije go na pola.

Ograniczeniem kodu liniowego jest szerokość. Zapisanie numeru towaru, partii, daty i numeru seryjnego rozciąga symbol do kilkunastu centymetrów, przez co etykieta gorzej znosi zagięcia kartonu i wymaga płaskiej, szerokiej powierzchni. Tu wchodzi GS1 DataMatrix - matryca oparta na odmianie ECC 200, korzystająca z tego samego słownika identyfikatorów i tej samej flagi FNC1, ale mieszcząca komplet danych na powierzchni znaczka pocztowego.

Porównanie symbolik stosowanych na etykietach logistycznych
CechaGS1-128GS1 DataMatrix
Wymiar symboluliniowy, rośnie na szerokość wraz z ilością danychmatryca kwadratowa lub prostokątna o stałych proporcjach
Powierzchnia przy komplecie danychkilkanaście centymetrów szerokościułamek centymetra kwadratowego
Kierunek odczytupoprzecznie do kresekdowolny obrót symbolu
Odporność na uszkodzeniaprzerwanie kresek uniemożliwia odczytkorekcja Reeda-Solomona odtwarza dane przy znacznym ubytku powierzchni
Wymagany czytniklaserowy 1D albo obrazowy 2Dwyłącznie obrazowy 2D
Typowe zastosowanieetykieta paletowa, karton zbiorczyopakowanie jednostkowe, wyrób medyczny, mały komponent
Struktura danychidentyczna - identyfikatory zastosowań GS1 z separatorem FNC1

Ostatni wiersz tabeli jest najważniejszy z punktu widzenia wdrożenia. Skoro obie symboliki niosą tę samą strukturę logiczną, system magazynowy otrzymuje identyczny zestaw pól niezależnie od tego, czy operator zeskanował pasek kresek na palecie, czy matrycę na pudełku. Zmienia się sprzęt, nie zmienia się konfiguracja parsera.

Identyfikatory zastosowań, czyli kontekst zapisany w kodzie

Zwykły kod kreskowy przenosi ciąg znaków bez kontekstu. Aplikacja odbierająca 5901234567890 musi z góry wiedzieć, do którego pola bazy ta wartość należy. Identyfikatory zastosowań, w skrócie AI, przenoszą ten kontekst do wnętrza kodu. Każda wartość jest poprzedzona przedrostkiem, który mówi, czym ona jest i jak długa może być.

Dzięki temu jeden odczyt daje komplet atrybutów pozycji dokumentu. System wie, że po cyfrach 01 następuje czternastocyfrowy numer towaru, po 17 sześciocyfrowa data, a po 10 numer partii o nieznanej z góry długości. Poniżej najczęściej spotykane identyfikatory w obrocie magazynowym, w zapisie stosowanym w słowniku Auto ID Studio WMS.net.

Identyfikatory zastosowań GS1 spotykane na etykietach logistycznych
AIZnaczenieFormatDługośćPrzykład
00SSCC - seryjny numer jednostki logistycznejn2+n18stała 18(00)059012340000000215
01GTIN - globalny numer jednostki handlowejn2+n14stała 14(01)05909991234560
02GTIN jednostek zawartych na nośnikun2+n14stała 14(02)05901234123457
10Partia lub seria produkcyjnan2+an..20zmienna(10)LOT2026A
11Data produkcjin2+n6stała 6(11)260315
15Data minimalnej trwałościn2+n6stała 6(15)270228
17Termin ważnościn2+n6stała 6(17)271130
21Numer seryjnyn2+an..20zmienna(21)100045
37Liczba jednostek w jednostce logistycznejn2+n..8zmienna(37)32
310xWaga netto w kilogramach, x oznacza liczbę miejsc dziesiętnychn4+n6stała 6(3102)001250
400Numer zamówienia odbiorcyn3+an..30zmienna(400)ZAM-26-0142
410GLN miejsca dostawyn3+n13stała 13(410)5901234000017
90-99Identyfikatory wewnętrzne, ustalane dwustronnien2+an..30zmienna(91)MAG-A-05

Zapis formatu czyta się prosto. Symbol n2 oznacza dwucyfrowy identyfikator, n14 czternaście cyfr wartości, a an..20 ciąg alfanumeryczny o długości do dwudziestu znaków. To właśnie te dwie kropki decydują o tym, czy pole trzeba zamknąć separatorem. Pełny słownik systemu obejmuje 22 identyfikatory i jest dostępny w transakcji Słowniki standardów, razem z regułami dla kodów medycznych HIBC oraz dla zapisu GS1 Digital Link. Praktyczne zastosowanie tych numerów opisujemy szerzej przy okazji etykiet logistycznych z numerem SSCC oraz ewidencji partii produkcyjnych i dat ważności.

Separator FNC1 i pola o zmiennej długości

Identyfikatory dzielą się na dwie grupy. Pierwsza ma stałą, zapisaną w specyfikacji długość wartości - GTIN zawsze zajmuje 14 cyfr, SSCC 18, a data 6. Przy takich polach dekoder odlicza znaki i sam wie, gdzie zaczyna się kolejny identyfikator. Druga grupa, na przykład numer partii albo numer seryjny, ma długość zmienną i tu potrzebny jest jawny znak końca pola. Tę funkcję pełni symbol FNC1 w roli separatora.

FNC1 nie jest literą ani cyfrą - to symbol funkcyjny, którego nie widać na wydruku. Czytnik tłumaczy go na znak sterujący Group Separator o kodzie ASCII 29, zapisywany szesnastkowo jako 0x1D. Aplikacja magazynowa odbiera więc zwykły znak sterujący i na jego podstawie zamyka bieżące pole.

Konsekwencje pominięcia separatora najlepiej widać na przykładzie. Chcemy zapisać partię ABC pod identyfikatorem 10 oraz termin ważności 261231 pod identyfikatorem 17.

bez separatora:
10ABC17261231
dekoder buduje pole partii aż do końca ciągu, termin ważności przepada
z separatorem (<GS> = ASCII 29):
10ABC<GS>17261231
partia zamknięta na trzech znakach, data trafia do właściwego pola

W pierwszym wariancie system zapisze partię o wartości ABC17261231 i pozycję bez terminu ważności. Towar wejdzie na stan, ale wypadnie z kontroli FEFO, bo nie ma daty, według której miałby być wydawany. Błąd jest cichy - dokument się zapisze, nikt nie zobaczy komunikatu, a skutek ujawni się dopiero przy reklamacji.

Od reguły jest jeden wyjątek. Jeśli pole o zmiennej długości stoi na samym końcu ciągu, separator nie jest potrzebny - domknięcie zapewnia znak stopu kodu. Dlatego dobrą praktyką przy projektowaniu etykiety jest umieszczanie pól zmiennych jako ostatnich, co ogranicza liczbę separatorów do minimum.

Jak parser Studio WMS.net rozbiera etykietę

W Studio WMS.net za odczyt odpowiada moduł Auto ID z transakcją Smart Scan. Operator kieruje czytnik na etykietę, a system w jednym kroku rozpoznaje symbolikę, rozbija ciąg na pola, sprawdza cyfry kontrolne i wypełnia pozycję dokumentu. Wynik nie jest wyłącznie techniczny - obok dekompozycji pojawia się werdykt, czy etykietę można obsługiwać automatycznie. Sam przebieg tej kontroli, wraz z czterema werdyktami parsera, opisujemy na stronie o weryfikacji etykiet w czasie rzeczywistym.

Studio WMS.net - dekompozycja kodu GS1-128 na cztery pola GTIN, termin ważności, numer partii i numer seryjny
Protokół kontroli etykiety i rozbicie kodu GS1-128 na cztery pola z przypisaniem do kolumn bazy danych

Protokół kontroli przechodzi przez pięć testów. Rozpoznanie standardu opiera się na identyfikatorze symboliki, czyli trzyznakowym przedrostku, który czytnik dokleja przed treścią - ]C1 oznacza GS1-128, ]d2 kod GS1 DataMatrix. Struktura pól potwierdza, ile atrybutów udało się wyodrębnić. Test separatora pokazuje, czy czytnik faktycznie przesłał ASCII 29 i ile razy. Kontrola cyfr kontrolnych przelicza sumę mod 10 dla numerów GTIN i SSCC. Ostatni test sprawdza pola dat i przelicza je na format ISO 8601.

Każde rozpoznane pole system przypisuje do konkretnej kolumny w bazie. To mapowanie jest widoczne wprost pod wartością i stanowi element konfiguracji, a nie zaszytą w kodzie regułę.

Domyślne mapowanie identyfikatorów na pola dokumentu magazynowego
AIOpisPole w bazieTypDługość
00SSCC nośnikadpmag.NRPALETYnumeric18
01GTIN towaruknaso.EANASNnumeric14
02GTIN jednostek na nośnikuknaso.EANASNnumeric14
10Numer partiidpmag.NRSERIItextzmienna
11Data produkcjidpmag.DATAPRODUKCJIdate6
15 i 17Data minimalnej trwałości i termin ważnościdpmag.TERMINWAZNOSCIdate6
21Numer seryjnydpmag.UWAGIPOZtextzmienna
37Liczba jednostekdpmag.ILOSCnumericzmienna

Wartości przeniesione z kodu trafiają do formularza jako pola zablokowane do edycji. Operator uzupełnia tylko to, czego kod nie zawiera - liczbę faktycznie przyjętych sztuk oraz lokalizację docelową. Reszta pochodzi z etykiety, więc cała ścieżka od skanu do zapisu pozycji obywa się bez klawiatury. W ten sposób działa przyjęcie towaru do magazynu na terminalach mobilnych z systemem Android, gdzie ekran jest mały, a wpisywanie ręczne najbardziej kosztowne.

Odczyty zapisują się w dzienniku parsowania razem z werdyktem parsera. Rejestr pozwala policzyć udział poprawnych etykiet w danym okresie i pogrupować błędy według prefiksu dostawcy, co zamienia rozmowę o jakości etykiet z ogólnej na konkretną. Sposób czytania tych liczb opisujemy przy wskaźnikach jakości skanowania.

Praktyczne przykłady odczytu etykiet

Etykieta paletowa z numerem SSCC

Najprostszy przypadek to nośnik oznaczony wyłącznie numerem SSCC. Identyfikator 00 ma stałą długość osiemnastu cyfr, więc ciąg jest jednoznaczny i nie wymaga separatora.

(00)059012340000000215

Po odczycie system wyszukuje awizo dostawy przypisane do tego numeru i podstawia całą zawartość palety. Bogatsza wersja etykiety dokłada numer GTIN towaru na nośniku, liczbę jednostek i numer partii.

Studio WMS.net - odczyt etykiety paletowej z numerem SSCC, GTIN nośnika, liczbą jednostek i numerem partii
Etykieta paletowa rozbita na cztery pola - SSCC nośnika, GTIN towaru na palecie, liczba jednostek i numer partii

Karton zbiorczy z terminem ważności i partią

Etykieta na opakowaniu zbiorczym łączy pola o stałej i zmiennej długości, więc separator jest tu niezbędny. Zapis czytelny dla człowieka wygląda tak:

(01)05901234567897(15)260831(10)LOT98765(37)100

a strumień wysyłany przez czytnik tak:

]C101059012345678971526083110LOT98765<GS>37100

Dekoder czyta 01, pobiera czternaście cyfr numeru towaru, następnie 15 i sześć cyfr daty, którą interpretuje jako 31 sierpnia 2026 roku. Przy 10 zaczyna zbierać znaki partii i przerywa dopiero na separatorze, a ostatnie pole 37 zamyka znak stopu. Cztery atrybuty pozycji dokumentu powstają w ułamku sekundy, bez ani jednego znaku wpisanego z klawiatury.

Opakowanie leku w kodzie GS1 DataMatrix

W obrocie farmaceutycznym opakowanie jednostkowe niesie cztery atrybuty, a powierzchnia pudełka nie pomieściłaby kodu liniowego. Stosuje się więc GS1 DataMatrix z tym samym zestawem identyfikatorów.

]d201059099912345671727123121SN1234567890<GS>10PARTIA456

Numer seryjny ma zmienną długość i stoi w środku ciągu, więc kończy go separator. Numer partii również ma zmienną długość, ale zamyka cały ciąg i separatora nie potrzebuje. Ta sama zasada obowiązuje przy skanowaniu numerów seryjnych w magazynach części zamiennych i elektroniki.

Kiedy etykieta tylko wygląda na GS1

Poprawna struktura nie oznacza jeszcze poprawnych danych. Numery GTIN, SSCC i GLN kończą się cyfrą kontrolną wyliczaną algorytmem mod 10, a jej niezgodność zdradza literówkę powstałą przy ręcznym przepisaniu numeru albo błąd w szablonie wydruku.

Studio WMS.net - komunikat o etykiecie, która tylko wygląda na GS1 z powodu błędnej cyfry kontrolnej GTIN
Parser odrzuca etykietę z niezgodną cyfrą kontrolną GTIN, zanim błędny numer trafi do bazy danych

System rozpoznaje format, wyodrębnia pola i dopiero na etapie kontroli sumy odrzuca odczyt. To istotna różnica wobec parserów, które przyjmują wszystko, co da się rozebrać - błędny numer nie zakłada kartoteki i nie tworzy pozycji przypisanej do nieistniejącego towaru. Poniżej najczęstsze przyczyny odrzucenia i sposób postępowania.

Typowe przyczyny odrzucenia etykiety i reakcja
ObjawPrzyczynaCo zrobić
Partia zawiera doklejony termin ważnościbrak separatora po polu o zmiennej długościpoprawić szablon etykiety u dostawcy albo włączyć tryb awaryjny parsera
Parser zgłasza brak separatora mimo poprawnej etykietyczytnik nie przesyła znaku ASCII 29przeprogramować czytnik kodem Transmit Group Separator
Niezgodna cyfra kontrolna GTINnumer przepisany ręcznie albo błąd w szablonie wydrukuzweryfikować numer w kartotece i poprawić źródło danych
Kod odczytany jako jeden długi ciągbrak flagi FNC1 po znaku startuzmienić generator kodu na tryb GS1
Data poza sensownym zakresemzamieniona kolejność RRMMDD i DDMMRRskorygować format w szablonie etykiety
Kod nierozpoznany jako GS1etykieta w formacie własnym dostawcydodać profil parsowania przypisany do prefiksu dostawcy

Trzecim sposobem zapisu tych samych identyfikatorów jest GS1 Digital Link, czyli adres URL umieszczany zwykle w kodzie QR. Identyfikatory trafiają do segmentów ścieżki i do parametrów zapytania.

https://<resolver>/01/<GTIN>/10/<LOT>/21/<SN>?17=<RRMMDD>

Dla magazynu istotne jest to, że parser rozbiera taki adres bez łączenia się z Internetem - segmenty /01/, /10/ i /21/ to zwyczajne identyfikatory zastosowań. Warstwa online, w której resolver przekierowuje na stronę produktu z kartą charakterystyki czy certyfikatem, jest opcjonalna i przeznaczona raczej dla odbiorcy końcowego. Jeden kod QR obsługuje więc dwa scenariusze naraz.

Konfiguracja czytnika i pułapki wdrożeniowe

Największa część zgłoszeń przy uruchamianiu odczytu etykiet nie dotyczy oprogramowania, tylko ustawień samego czytnika. Domyślna konfiguracja wielu urządzeń pomija znak separatora w transmisji, przez co poprawnie wydrukowana etykieta trafia do systemu jako jeden ciąg.

Studio WMS.net - konfiguracja separatora FNC1, normalizacji dat oraz mapowania identyfikatorów GS1 na pola bazy
Ustawienia parsera - znak separatora przesyłany przez skaner, zachowanie przy jego braku i mapowanie AI na kolumny bazy

Lista kontrolna przed uruchomieniem odczytu w magazynie wygląda następująco.

Po stronie systemu pozostaje mapowanie identyfikatorów na pola dokumentu i kartoteki. Numer GTIN musi odpowiadać wartości zapisanej w kartotece magazynowej, inaczej odczyt będzie poprawny formalnie, ale nie znajdzie towaru. Z tego samego powodu warto uporządkować znakowanie towarów w magazynie zanim uruchomi się automatyczne przyjęcia.

Poprawnie odczytana etykieta pracuje potem w całym cyklu magazynowym. Ten sam numer partii steruje wydawaniem według FEFO przy kompletacji zleceń, numer SSCC pozwala odnaleźć nośnik podczas inwentaryzacji, a numer GTIN wiąże pozycję z kartoteką w każdym dokumencie. Podstawy samej techniki zapisu opisujemy szerzej na stronie o kodach kreskowych w magazynie, a wymagania dotyczące budowy nośnika informacji - w materiale o etykiecie GS1.

Najczęściej zadawane pytania

Poniżej odpowiedzi na pytania, które najczęściej pojawiają się przy uruchamianiu odczytu etykiet GS1 w magazynie.

GS1-128 to Code 128 z narzuconym zestawem reguł zapisu danych. Fizycznie to ta sama symbolika kresek, ale zaraz po znaku startu pojawia się symbol funkcyjny FNC1, który informuje czytnik, że dalsza treść jest zbudowana z identyfikatorów zastosowań GS1. Bez tej flagi ten sam ciąg zostanie odczytany jako zwykły tekst, bez podziału na pola.

Symbol funkcyjny FNC1 nie ma odpowiednika w tablicy znaków, więc czytnik tłumaczy go na znak sterujący Group Separator o kodzie ASCII 29, zapisywany szesnastkowo jako 0x1D. Jeśli parser zgłasza brak separatora, czytnik trzeba przestawić kodem konfiguracyjnym Transmit Group Separator z instrukcji urządzenia.

Separator zamyka wyłącznie pole o zmiennej długości. Po polach o stałej długości, takich jak GTIN, SSCC czy data, czytnik odlicza z góry znaną liczbę znaków i sam przechodzi do kolejnego identyfikatora. Separatora nie stawia się także wtedy, gdy pole zmiennej długości kończy cały ciąg - tę funkcję przejmuje znak stopu kodu.

Tak. Kod liniowy GS1-128 odczyta prosty skaner laserowy, natomiast GS1 DataMatrix jest matrycą dwuwymiarową i wymaga czytnika obrazowego z matrycą CCD lub CMOS. Czytnik obrazowy poradzi sobie z obydwoma symbolikami, dlatego przy planowaniu wymiany sprzętu wybiera się zwykle urządzenia 2D.

Takiego kodu nie da się rozebrać regułami GS1, bo nie zawiera identyfikatorów zastosowań. W Studio WMS.net dodaje się wtedy osobny profil parsowania przypisany do prefiksu dostawcy, który opisuje pozycje i długości pól w ciągu. Każdy odczyt trafia do dziennika parsowania, więc widać, którzy dostawcy generują najwięcej odrzuceń.

Specyfikacja GS1 dopuszcza zapis dnia jako 00, gdy istotny jest tylko miesiąc. Parser Studio WMS.net normalizuje wtedy datę do ostatniego dnia wskazanego miesiąca i zapisuje ją w formacie ISO 8601, dzięki czemu porównania i sortowanie po terminie ważności działają bez wyjątków.

Glosariusz pojęć

AI (Application Identifier)
dwu-, trzy- lub czterocyfrowy przedrostek, który określa rodzaj i format danych zapisanych bezpośrednio po nim.
FNC1
symbol funkcyjny standardu GS1 pełniący dwie role - flagi standardu po znaku startu i separatora pól o zmiennej długości.
GTIN
globalny numer jednostki handlowej o długości 14 cyfr, identyfikujący produkt lub opakowanie zbiorcze.
SSCC
osiemnastocyfrowy seryjny numer jednostki logistycznej, identyfikujący konkretną paletę lub kontener.
Group Separator
znak sterujący ASCII 29 (0x1D), na który czytniki tłumaczą symbol FNC1 w strumieniu wysyłanym do aplikacji.
ECC 200
odmiana kodu DataMatrix z korekcją błędów Reeda-Solomona, jedyna dopuszczona w standardzie GS1 DataMatrix.
GS1 Digital Link
zapis identyfikatorów GS1 w postaci adresu URL, czytelny zarówno dla systemu magazynowego, jak i dla przeglądarki.
Identyfikator symboliki
trzyznakowy przedrostek wysyłany przez czytnik, na przykład ]C1, informujący aplikację, jaką symbolikę odczytano.
FEFO
reguła wydawania towaru według najkrótszego terminu ważności, oparta na dacie odczytanej z etykiety.
Mod 10
algorytm wyliczania cyfry kontrolnej numerów GTIN, SSCC i GLN, wykrywający pomyłki przy przepisywaniu numeru.

Warto przeczytać