Kod EAN-13 z kasy niesie jedną wartość, numer produktu. Operator przyjmujący dostawę potrzebuje naraz numeru towaru oraz partii, a do tego terminu ważności, a każde przepisanie ręczne kosztuje czas i grozi pomyłką. Standard GS1 zapisuje te wartości w kodzie liniowym GS1-128 albo w matrycy GS1 DataMatrix, a parser w Studio WMS.net rozdziela je na pola dokumentu.

Dwa sposoby zapisu i jedna struktura danych

GS1-128 nie jest osobną technologią druku. To symbolika Code 128 z zestawem reguł zapisu i z symbolem funkcyjnym FNC1 tuż po znaku startu. Ta flaga przełącza czytnik w tryb GS1. Bez niej identyczny rząd kresek odczytuje się jako zwykły tekst, a żaden program magazynowy nie rozbije go na pola.

Kod liniowy rośnie wraz z liczbą danych. Pełny zestaw danych rozciąga go na kilkanaście centymetrów. Matryca GS1 DataMatrix, oparta na odmianie ECC 200, używa tego samego słownika identyfikatorów i tej samej flagi, ale mieści komplet danych na bardzo małej powierzchni.

CechaGS1-128GS1 DataMatrix
Kształt symboluliniowy, rośnie na szerokośćkwadrat lub prostokąt o stałych proporcjach
Kierunek odczytupoprzecznie do kresekdowolny obrót symbolu
Odporność na uszkodzeniaprzerwana kreska uniemożliwia odczytkorekcja Reeda-Solomona odtwarza dane przy ubytku
Wymagany czytniklaserowy 1D albo obrazowy 2Dwyłącznie obrazowy 2D
Typowe zastosowaniepaleta i karton zbiorczyopakowanie jednostkowe i mały komponent
Struktura danychidentyfikatory zastosowań GS1 i separator FNC1, w obu symbolikach taka sama

Ostatni wiersz jest najważniejszy dla wdrożenia. System dostaje ten sam zestaw pól, niezależnie od tego, czy operator zeskanował pasek na palecie, czy matrycę na pudełku. Zmienia się sprzęt, konfiguracja parsera pozostaje ta sama.

Identyfikatory zastosowań w kodzie

Zwykły kod kreskowy przenosi ciąg bez kontekstu. Aplikacja musi z góry wiedzieć, do jakiego pola bazy należy ciąg 5901234567890. Identyfikator zastosowania, w skrócie AI, przenosi ten kontekst do kodu. Mówi, czym jest wartość i ile ma znaków.

AIZnaczenieFormatDługośćPrzykład
00SSCC, numer jednostki logistycznejn2+n18stała(00)059012340000000215
01GTIN jednostki handlowejn2+n14stała(01)05909991234560
10partia lub serian2+an..20zmienna(10)LOT2026A
15data minimalnej trwałościn2+n6stała(15)270228
17termin ważnościn2+n6stała(17)271130
21numer seryjnyn2+an..20zmienna(21)100045
37liczba jednostek na nośnikun2+n..8zmienna(37)32
400numer zamówienia odbiorcyn3+an..30zmienna(400)ZAM-26-0142

Zapis formatu czyta się prosto. Symbol n14 oznacza czternaście cyfr, a an..20 ciąg liter i cyfr o długości do dwudziestu znaków. Te dwie kropki decydują o tym, czy pole wymaga separatora. Słownik Studio WMS.net obejmuje 22 identyfikatory, a razem z nim działają reguły dla kodów medycznych HIBC i dla zapisu GS1 Digital Link. Zastosowanie numerów na palecie opisuje strona o etykietach logistycznych GS1, a ewidencję partii strona o partiach produkcyjnych i datach ważności.

Separator FNC1 i pola o zmiennej długości

Pole o stałej długości kończy się samo. Dekoder odlicza 14 cyfr dla GTIN albo 6 dla daty i wie, gdzie zaczyna się następny identyfikator. Pole o długości zmiennej, na przykład partia albo numer seryjny, wymaga jawnego znaku końca. Pełni go FNC1, który czytnik tłumaczy na znak sterujący Group Separator, ASCII 29, zapisywany szesnastkowo jako 0x1D.

Skutek pominięcia separatora widać w prostym przykładzie. Partia ABC i termin ważności 261231 zapisane bez separatora zlewają się w jedno pole.

bez separatora:   10ABC17261231           -> partia "ABC17261231", brak terminu
z separatorem:    10ABC<GS>17261231      -> partia "ABC", termin 2026-12-31

W pierwszym wariancie towar wchodzi na stan z numerem partii ABC17261231 i bez terminu ważności. Wypada wtedy z kontroli FEFO, bo nie ma daty, według której mógłby być wydany. Błąd jest cichy: dokument się zapisuje i nikt nie widzi komunikatu aż do reklamacji.

Reguła: pola o zmiennej długości umieszcza się na końcu ciągu. Ostatnie pole zamyka znak stopu kodu, więc separator nie jest potrzebny, a liczba separatorów, które mogą zawieść, jest jak najmniejsza.

Jak parser Studio WMS.net rozbiera etykietę

Odczyt obsługuje moduł Auto ID z transakcją Smart Scan. Operator kieruje czytnik na etykietę, a system rozpoznaje symbolikę, rozbija ciąg na pola i wypełnia pozycję dokumentu. Przebieg kontroli i cztery werdykty opisuje strona 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

Poniższy szkic w JavaScripcie pokazuje samą zasadę dekompozycji. Jest ilustracyjny, obsługuje wyłącznie dwucyfrowe identyfikatory i nie przedstawia kodu produktu.

const STALE = { '00': 18, '01': 14, '02': 14, '11': 6, '15': 6, '17': 6 };
const GS = String.fromCharCode(29);

function parseGs1(raw) {
  let s = raw.replace(/^\](C1|d2)/, '');   // identyfikator symboliki
  const pola = {};
  while (s.length) {
    const ai = s.slice(0, 2);
    if (STALE[ai]) {                        // pole o stałej długości
      pola[ai] = s.slice(2, 2 + STALE[ai]);
      s = s.slice(2 + STALE[ai]);
    } else {                                // pole zmienne, koniec na separatorze
      const end = s.indexOf(GS);
      pola[ai] = end < 0 ? s.slice(2) : s.slice(2, end);
      s = end < 0 ? '' : s.slice(end + 1);
    }
  }
  return pola;
}
// parseGs1(']C1' + '01' + '05909991234560' + '15' + '270228' + '10' + 'LOT98765' + GS + '3732')

Dla podanego ciągu funkcja zwraca cztery pola, a pole 10 ma wartość LOT98765. Parser w systemie robi więcej, bo przelicza daty na format ISO 8601 i wykonuje pięć testów protokołu kontroli.

Test protokołuCo sprawdzaTypowa przyczyna niepowodzenia
Rozpoznanie standarduidentyfikator symboliki ]C1 lub ]d2czytnik nie przesyła przedrostka
Struktura pólliczba wyodrębnionych atrybutówpole wchłonęło sąsiednie
Separatorczy przyszedł znak ASCII 29 i ile razyczytnik nie tłumaczy FNC1
Cyfry kontrolnesuma mod 10 numerów GTIN i SSCCnumer przepisany ręcznie
Pola datzakres daty i przeliczenie na ISO 8601zamieniona kolejność RRMMDD

Rozpoznane pole trafia do konkretnej kolumny bazy. Mapowanie jest elementem konfiguracji, a nie regułą zaszytą w programie. Wartości z kodu wypełniają formularz jako pola zablokowane, więc operator wpisuje tylko liczbę przyjętych sztuk i lokalizację. Tak działa przyjęcie towaru do magazynu na terminalach z Androidem.

Przykłady odczytu etykiet

Najprostszy nośnik ma wyłącznie numer SSCC, który ma stałą długość i nie wymaga separatora. Po odczycie system szuka awizacji przypisanej do tego numeru i podstawia zawartość palety. Bogatsza etykieta dokłada GTIN towaru oraz liczbę jednostek.

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
NośnikStrumień z czytnikaSeparator
Paleta, tylko SSCC]C1 00 059012340000000215nie, pole stałe
Karton zbiorczy]C1 01 05909991234560 15 260831 10 LOT98765 <GS> 37 100po partii, bo następuje pole 37
Opakowanie leku, DataMatrix]d2 01 05909991234560 17 271231 21 SN1234567890 <GS> 10 PARTIA456po numerze seryjnym, partia kończy ciąg

W obrocie farmaceutycznym opakowanie jednostkowe jest małe, więc stosuje się DataMatrix z identycznym zestawem identyfikatorów. Podobną zasadę zawiera strona o skanowaniu numerów seryjnych.

Kiedy etykieta tylko wygląda na GS1

Poprawna struktura nie oznacza poprawnych danych. Numery GTIN i SSCC kończą się cyfrą kontrolną liczoną algorytmem mod 10. Jej niezgodność zdradza literówkę albo błąd w szablonie wydruku. Budowę numeru SSCC opisuje standard GS1 Polska.

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

Parser rozpoznaje format i wyodrębnia pola, a odczyt odrzuca dopiero na etapie kontroli sumy. Błędny numer nie zakłada pozycji w kartotece i nie tworzy wiersza przypisanego do nieistniejącego towaru. Lista przyczyn odrzucenia pomaga zdecydować, co poprawić u źródła.

ObjawPrzyczynaDziałanie
Partia z doklejonym terminembrak separatora po polu zmiennympoprawić szablon etykiety albo włączyć tryb awaryjny
Brak separatora mimo dobrej etykietyczytnik nie wysyła ASCII 29przeprogramować czytnik kodem Transmit Group Separator
Cały kod jako jeden ciągbrak flagi FNC1 po znaku startuprzełączyć generator kodu w tryb GS1
Kod nierozpoznanyetykieta we własnym formacie dostawcydodać profil parsowania dla prefiksu dostawcy

Te same dane w kodzie QR jako adres URL

Identyfikatory można zapisać także jako adres URL w formacie GS1 Digital Link, zwykle w kodzie QR. Wartości trafiają do segmentów ścieżki i do parametrów zapytania.

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

Dla magazynu liczy się to, że parser rozbiera taki adres bez połączenia z Internetem. Segmenty /01/, /10/ i /21/ są zwykłymi identyfikatorami zastosowań. Warstwa online jest opcjonalna. Resolver kieruje w niej na kartę produktu, z której korzysta głównie odbiorca końcowy.

Konfiguracja czytnika i pułapki wdrożeniowe

Większość zgłoszeń przy uruchamianiu odczytu dotyczy ustawień czytnika, a nie oprogramowania. Domyślna konfiguracja wielu urządzeń pomija separator w transmisji, więc poprawna 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

Po stronie systemu zostaje mapowanie identyfikatorów na pola. Numer GTIN musi istnieć w kartotece magazynowej, inaczej odczyt będzie formalnie poprawny, a towaru nie wskaże. Budowę szablonu wydruku opisuje strona o projektowaniu etykiet w języku ZPL. Jakość odczytów w skali magazynu mierzy dashboard Auto ID.

Pytania i odpowiedzi o kody GS1-128 i GS1 DataMatrix

GS1-128 to Code 128 z narzuconymi regułami zapisu. Fizycznie symbolika jest ta sama, ale po znaku startu stoi symbol FNC1, który informuje czytnik, że dalsza treść składa się z identyfikatorów zastosowań. Bez tej flagi ciąg jest zwykłym tekstem.

Symbol FNC1 nie ma odpowiednika w tablicy znaków, więc czytnik tłumaczy go na znak sterujący Group Separator, 0x1D. Gdy 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 stałych, takich jak GTIN, SSCC i daty, czytnik odlicza znaną liczbę znaków. Nie stawia się go też wtedy, gdy pole zmienne kończy cały ciąg, bo funkcję separatora przejmuje znak stopu.

Tak. Kod liniowy odczyta skaner laserowy, a matryca wymaga czytnika obrazowego z matrycą CCD lub CMOS. Czytnik obrazowy obsługuje oba typy kodu, dlatego przy wymianie sprzętu wybiera się zwykle urządzenia 2D.

Takiego kodu nie rozbiją reguły GS1, bo nie zawiera identyfikatorów zastosowań. W Studio WMS.net dodaje się osobny profil parsowania przypisany do prefiksu dostawcy, który opisuje pozycje i długości pól w ciągu.

Specyfikacja dopuszcza dzień 00, gdy istotny jest tylko miesiąc. Parser normalizuje wtedy datę do ostatniego dnia wskazanego miesiąca i zapisuje ją w formacie ISO 8601, więc sortowanie po terminie ważności działa bez wyjątków.

Glosariusz pojęć związanych z kodami GS1

AI (Application Identifier)
Przedrostek określający rodzaj i format danych zapisanych bezpośrednio po nim w kodzie GS1.
FNC1
Symbol funkcyjny GS1 pełniący dwie role: flagi standardu po znaku startu i separatora pól o zmiennej długości.
GTIN
Czternastocyfrowy numer jednostki handlowej, 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 dla systemu magazynowego i dla przeglądarki.
Identyfikator symboliki
Trzyznakowy przedrostek wysyłany przez czytnik, na przykład ]C1, informujący aplikację o odczytanej symbolice.
FEFO
Reguła wydawania towaru według najkrótszego terminu ważności, oparta na dacie odczytanej z etykiety.
Mod 10
Algorytm cyfry kontrolnej numerów GTIN, SSCC i GLN, wykrywający pomyłki przy przepisywaniu numeru.

Warto przeczytać