Перед загрузкой товарного фида проверьте GTIN в два этапа: сначала состав числа и контрольную цифру, затем связь с конкретным вариантом товара по подтверждённому каталогу. Результаты храните отдельно: корректно составленный код может оказаться кодом другого цвета, размера или комплектации.
Для маркетолога это задача приёмки товарных данных. Нужен отчёт, по которому видно, где повреждён экспорт, где перепутано сопоставление полей, а где ещё нет подтверждения от поставщика. Один зелёный статус «штрихкод корректен» эти ситуации скрывает.
Разделите внутренний ID и товарный код
Внутренний SKU связывает строку с учётной системой магазина. GTIN идентифицирует торговую единицу; его нельзя получать из SKU, номера строки или случайной последовательности цифр. Справка Google по GTIN отдельно требует использовать код правильного варианта и не выдумывать значение при сомнении.
Уникальность внутреннего идентификатора проверяется по отдельному протоколу offer id. В этом разборе внутренний SKU уже определён: по нему сопоставляем экспорт и контрольный каталог, а проверяем переданный товарный код.
Название поля и допустимое форматирование зависят от получателя. В спецификации Google это gtin. Выберите профиль получателя и проверьте его актуальные требования; локальный аудит ниже не подменяет спецификацию рекламной площадки.
Что подтверждает контрольная цифра
Для рассматриваемой проверки берём строки из 8, 12, 13 или 14 цифр ASCII. Пустое поле получает отдельный статус: оно не доказывает, что у товара вообще нет назначенного кода. Пробелы и другие символы наш строгий входной контроль отправляет на разбор, хотя отдельный получатель может допускать своё форматирование.
GS1 Romania описывает расчёт: без последней цифры идём справа налево, умножаем разряды попеременно на 3 и 1, начиная с 3, и складываем результаты. Контрольная цифра дополняет сумму до ближайшего числа, кратного десяти; если сумма уже кратна десяти, это 0.
Для последовательности 4006381333931 взвешенная сумма первых двенадцати цифр равна 89: до 90 не хватает 1. Последний разряд совпал. Такая арифметика помогает обнаруживать ошибки переноса, но не проверяет назначение номера товару и не гарантирует обнаружение любой возможной ошибки.
Учебная сверка шести строк
Мы подготовили feed.csv, контрольный master.csv и выполнили локальный скрипт audit_gtin.py. Все связи SKU → код в этих файлах вымышлены; цифровые последовательности служат тестовыми данными и не подтверждены как коды этих товаров в GS1. В рабочий фид их копировать нельзя.
| SKU | Код в экспорте | Формальная проверка | Сверка с учебным каталогом |
|---|---|---|---|
| A-GREEN | 4006381333931 | Пройдена | Совпадает |
| B-RED | 4006381333931 | Пройдена | Не совпадает |
| C-TYPO | 4006381333932 | Неверная контрольная цифра | Не выполнена |
| D-SHORT | 40063813339 | Неверная длина | Не выполнена |
| E-EMPTY | пусто | Нет значения | Не выполнена |
| F-ZERO | 0012345678905 | Пройдена | Совпадает |
У B-RED арифметика проходит, но контрольный каталог ожидает 4006381333948. Значение попало от другого учебного варианта. Если проверять только последнюю цифру, это расхождение останется незамеченным.
Учебный результат двух независимых этапов; «совпало» означает совпадение с master.csv, без проверки реестра GS1.
У F-ZERO начальные нули сохранены как часть строки. Скрипт не приводит код к числу и не дописывает разряды. Если значение уже изменил табличный редактор, вернитесь к исходной выгрузке по инструкции сохранения артикулов и ID.
Ниже приведены оба учебных CSV и полный исходный код audit_gtin.py; результат проверки показан в таблице выше. Сохраните три блока как файлы с указанными именами в одной папке и выполните python3 audit_gtin.py. Сторонние библиотеки не нужны.
Содержимое feed.csv:
sku,gtin
A-GREEN,4006381333931
B-RED,4006381333931
C-TYPO,4006381333932
D-SHORT,40063813339
E-EMPTY,
F-ZERO,0012345678905Содержимое master.csv:
sku,expected_gtin
A-GREEN,4006381333931
B-RED,4006381333948
C-TYPO,4006381333931
D-SHORT,4006381333931
E-EMPTY,4006381333931
F-ZERO,0012345678905Полный исходный код audit_gtin.py:
from pathlib import Path
import csv,json,re
p=Path(__file__).resolve().parent
def digit(body):return str((-sum(int(x)*(3 if i%2==0 else 1) for i,x in enumerate(reversed(body))))%10)
def format_status(s):
if s=='':return 'MISSING'
if not re.fullmatch('[0-9]+',s):return 'NON_ASCII_DIGITS'
if len(s) not in (8,12,13,14):return 'BAD_LENGTH'
if digit(s[:-1])!=s[-1]:return 'BAD_CHECK_DIGIT'
return 'CHECKSUM_OK'
def audit(feed,master):
if len({r['sku'] for r in master})!=len(master):raise ValueError('duplicate master sku')
if len({r['sku'] for r in feed})!=len(feed):raise ValueError('duplicate feed sku')
m={r['sku']:r['expected_gtin'] for r in master};out=[]
for r in feed:
s=r['gtin'];f=format_status(s);e=m.get(r['sku']); match='NOT_CHECKED' if f!='CHECKSUM_OK' else ('NO_REFERENCE' if not e else ('MATCH' if s==e else 'MISMATCH'))
out.append(dict(r,format_status=f,expected_gtin=e or '',catalog_match=match))
return out
if __name__=='__main__':
with (p/'feed.csv').open(newline='') as f:feed=list(csv.DictReader(f))
with (p/'master.csv').open(newline='') as f:master=list(csv.DictReader(f))
rows=audit(feed,master)
with (p/'result.csv').open('w',newline='') as f:
w=csv.DictWriter(f,fieldnames=rows[0]);w.writeheader();w.writerows(rows)
result={'synthetic':True,'rows':rows,'note':'Контрольные последовательности не подтверждены как назначенные реальным товарам GTIN. Master — учебное условие, не реестр GS1. Проверка ASCII/длины/контрольной цифры не проверяет допустимые префиксы, регистрацию, упаковку и правила получателя.'}
(p/'result.json').write_text(json.dumps(result,ensure_ascii=False,indent=2));print(json.dumps(result,ensure_ascii=False))Скрипт читает файлы рядом с собой, сохраняет result.csv и прекращает работу при повторяющихся SKU в любом входе. Сопоставление идёт по точному SKU, а не по названию, порядку строк или приблизительному сходству товара.
Как получить подтверждённый контрольный каталог
Сначала сверьте значение с маркировкой именно продаваемой единицы и данными производителя или поставщика. Сохраните источник, дату получения и характеристики: модель, цвет, размер, объём, число единиц в упаковке. Если система хранит коробку и отдельный товар, проверьте, какую из этих единиц продаёт карточка.
Реестровая проверка — отдельное действие. GS1 US описывает поиск данных о номере, компании и продукте; полнота результата зависит от данных владельца бренда. Совпадение только компании ещё не подтверждает конкретный вариант. Отсутствие подробной карточки сохраняйте как «не подтверждено» и запрос поставщику, а не как готовый вывод о подлинности товара.
В этом примере реестр не запрашивали. Доступность его функций из Беларуси, условия массовой проверки и тарифы не тестировали; локальная сверка CSV не требует регистрации или покупки сервиса. Доступ к справке Google также не означает доступность размещения рекламы для любого региона.
Как принять исправление
При неверной длине или контрольной цифре проверьте исходник и преобразования экспорта. При совпавшей арифметике и расхождении с каталогом проверьте привязку SKU к варианту. Не заменяйте последнюю цифру вычисленной автоматически: так можно превратить ошибочную запись в правдоподобную, сохранив неверную связь с товаром.
Пустое значение отправьте на выяснение причины. Если назначенный код известен, верните его из подтверждённого источника; если неизвестен, не придумывайте и не объявляйте отсутствие идентификатора только ради прохождения проверки.
После правки повторите оба этапа на полном экспорте и сохраните версию контрольного каталога. Затем выполните общую проверку через анализатор фида и примите изменения по протоколу исправленного фида. Здесь проверены только строки и их связь с учебным справочником: допустимые префиксы, регистрация номера, вся структура файла, модерация и фактический показ товара требуют отдельных проверок.
Источники
Материал подготовлен редакцией WiseLab с помощью AI. Источники и фактические утверждения проверены при подготовке.
Что думаете?
Загружаем комментарии…