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.
Spis treści
- Dwa sposoby zapisu i jedna struktura danych
- Identyfikatory zastosowań w kodzie
- Separator FNC1 i pola o zmiennej długości
- Jak parser Studio WMS.net rozbiera etykietę
- Przykłady odczytu etykiet
- Kiedy etykieta tylko wygląda na GS1
- Te same dane w kodzie QR jako adres URL
- Konfiguracja czytnika i pułapki wdrożeniowe
- Pytania i odpowiedzi o kody GS1-128 i GS1 DataMatrix
- Glosariusz pojęć związanych z kodami GS1
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.
| Cecha | GS1-128 | GS1 DataMatrix |
|---|---|---|
| Kształt symbolu | liniowy, rośnie na szerokość | kwadrat lub prostokąt o stałych proporcjach |
| Kierunek odczytu | poprzecznie do kresek | dowolny obrót symbolu |
| Odporność na uszkodzenia | przerwana kreska uniemożliwia odczyt | korekcja Reeda-Solomona odtwarza dane przy ubytku |
| Wymagany czytnik | laserowy 1D albo obrazowy 2D | wyłącznie obrazowy 2D |
| Typowe zastosowanie | paleta i karton zbiorczy | opakowanie jednostkowe i mały komponent |
| Struktura danych | identyfikatory 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.
| AI | Znaczenie | Format | Długość | Przykład |
|---|---|---|---|---|
| 00 | SSCC, numer jednostki logistycznej | n2+n18 | stała | (00)059012340000000215 |
| 01 | GTIN jednostki handlowej | n2+n14 | stała | (01)05909991234560 |
| 10 | partia lub seria | n2+an..20 | zmienna | (10)LOT2026A |
| 15 | data minimalnej trwałości | n2+n6 | stała | (15)270228 |
| 17 | termin ważności | n2+n6 | stała | (17)271130 |
| 21 | numer seryjny | n2+an..20 | zmienna | (21)100045 |
| 37 | liczba jednostek na nośniku | n2+n..8 | zmienna | (37)32 |
| 400 | numer zamówienia odbiorcy | n3+an..30 | zmienna | (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.
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łu | Co sprawdza | Typowa przyczyna niepowodzenia |
|---|---|---|
| Rozpoznanie standardu | identyfikator symboliki ]C1 lub ]d2 | czytnik nie przesyła przedrostka |
| Struktura pól | liczba wyodrębnionych atrybutów | pole wchłonęło sąsiednie |
| Separator | czy przyszedł znak ASCII 29 i ile razy | czytnik nie tłumaczy FNC1 |
| Cyfry kontrolne | suma mod 10 numerów GTIN i SSCC | numer przepisany ręcznie |
| Pola dat | zakres daty i przeliczenie na ISO 8601 | zamieniona 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.
| Nośnik | Strumień z czytnika | Separator |
|---|---|---|
| Paleta, tylko SSCC | ]C1 00 059012340000000215 | nie, pole stałe |
| Karton zbiorczy | ]C1 01 05909991234560 15 260831 10 LOT98765 <GS> 37 100 | po partii, bo następuje pole 37 |
| Opakowanie leku, DataMatrix | ]d2 01 05909991234560 17 271231 21 SN1234567890 <GS> 10 PARTIA456 | po 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.
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.
| Objaw | Przyczyna | Działanie |
|---|---|---|
| Partia z doklejonym terminem | brak separatora po polu zmiennym | poprawić szablon etykiety albo włączyć tryb awaryjny |
| Brak separatora mimo dobrej etykiety | czytnik nie wysyła ASCII 29 | przeprogramować czytnik kodem Transmit Group Separator |
| Cały kod jako jeden ciąg | brak flagi FNC1 po znaku startu | przełączyć generator kodu w tryb GS1 |
| Kod nierozpoznany | etykieta we własnym formacie dostawcy | dodać 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.
- Transmisja separatora. Czytnik musi wysyłać ASCII 29 w miejscu FNC1. Ustawienie nazywa się zwykle Transmit Group Separator albo Map FNC1 to ASCII 29.
- Identyfikator symboliki. Przedrostek ]C1 lub ]d2 pozwala odróżnić kod GS1 od zwykłego Code 128 bez zgadywania.
- Tryb 2D. Matrycę odczyta tylko czytnik obrazowy, w tym skaner pierścieniowy Zebra RS5000. Model laserowy nie przeczyta jej niezależnie od ustawień.
- Jakość druku. Zabrudzona głowica drukarki kodów kreskowych obniża kontrast i czytnik odmawia odczytu mimo poprawnych danych.
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.