摘要:UDI 条码里是一串连续字符,括号是印给人看的,不在码里。读它分三步:认应用标识符、按定长切、遇到变长字段看分隔符。 01 后面 14 位是产品代码,11、17 各 6 位是日期,10 后面跟批号、长度不固定。还有一个前提:国产试剂里有一部分印的是 MA 码,开头不是 01,拆法完全不同。
一、先看开头:01 是 GS1,MA 和 AHM 是另外两套
结论:拿到一串码先看开头。以 01 开头、整串都是数字,可以按 GS1 规则拆;以「MA.」开头的,字段靠点号分隔,没有应用标识符那套结构;以「MF0」开头的又是另一套。拆错体系,后面怎么算都不对。
这不是细节,是我国的制度安排。《医疗器械唯一标识系统规则》第十条要求发码机构应当为中国境内的法人机构,第九条又规定注册人/备案人应当按照编制标准创建唯一标识,编制标准可以来自药监局认可的任一发码机构。换句话说,同一家医院的库里出现几种不同体系的码,是正常的。
北京市药监局发布的《医疗器械唯一标识咨询问答》里写明,目前符合要求的发码机构有三家,分别对应三种码制:
| 码制 | 发码机构 · 怎么看 |
|---|---|
| GS1 | 中国物品编码中心。以 01 开头,后面跟应用标识符,检验科见到最多的一种 |
| MA | 中关村工信二维码技术研究院。以「MA」开头,字段之间用点号「.」分隔 |
| AHM | 阿里健康科技(中国)有限公司。以「MF0」开头的 10 位,PI 用 BN、SN、MD、BD、ED 这类字段代号,不是数字应用标识符 |
三种码在真实数据里不是平均分布。按国家药监局 UDI 数据库 2026 年 10 月 1 日的全量公开数据,体外诊断试剂共 24.96 万条:95.3% 用 GS1,4.7% 用 MA 码,AHM 一条都没有。换句话说,检验科的库里会遇到 MA 码,但不必为 AHM 单独准备一套流程。
所以两种常见说法都要修一下。说「国产试剂只有 GS1」,那 4.7% 的 MA 码会被漏掉;说「三种码都可能遇到」,又高估了 AHM。准确的说法是: GS1 是主流,MA 是实实在在的第二套,两者都要能读。
MA 码的产品标识单元数据串,按该问答第 44 问的写法,由「MA」、分隔符「.」、制造商编码、分隔符「.」、产品编码依次组成;制造商编码里含国家代码 3 位、行业代码 2 位、注册人代码 6 位;产品编码由包装编码 1 位、项目编码 6 位和校验码 1 位组成。
所以看到以「MA.」开头、中间一串点号分段的内容,不要去找 01——它本来就没有。 AHM 码也一样:它的 PI 对应的是产品批次、单品序列号、生产日期、保质日期、有效日期这几个字段(第 46 问写的是 BN、SN、MD、BD、ED),按前面引的那份全量数据,目前用它的都是器械。这三个体系的字段名不同、分隔方式不同,后文讲的所有切分规则,都只适用于 GS1 码。
二、定长与变长:这串字符是这么切的
结论:拆 GS1 串的关键不是背字段含义,而是记住每个字段多长。定长的直接切,变长的要等分隔符或者等串结束。
拿一盒试剂的实际标签举例(就是上一篇配图那一盒),扫码枪读出来的原始串是这样:
01069364986002381125111817270518102511014
四十一个字符,看着像一坨数字。其实从第一个字符起就分好了段,每段前面两位是告诉设备「后面这段是什么、多长」:
| AI | 字段 · 取几位 |
|---|---|
| 01 | 产品代码。固定取 14 位数字,就是产品标识(DI) |
| 10 | 生产批号。字母数字,最长 20 位,长度不固定,到分隔符或串尾才结束 |
| 11 | 生产日期。固定取 6 位,年月日各两位 |
| 17 | 失效日期。固定取 6 位,顺序同上 |
| 21 | 序列号。最长 20 位,同样不固定。按单件管理时才出现 |
顺着上面那串切一遍:先读 01,往后取 14 位得 06936498600238;再读 11,取 6 位得 251118;再读 17,取 6 位得 270518;剩下是 10 加 2511014,到串尾结束。四个字段:产品、生产日期、失效日期、批号。
这里有个容易看错的地方:码里的顺序与标签上印的顺序可以不一样。上一篇那张标签的可读行写的是 (01)(17)(10)(11),而编进条码时 10 被放到了最后。这不是印错,是 GS1 的排序规则。
规则写在《GS1 通用规范》里,北京市药监局那份问答第 43 问转述得很清楚:当生产标识里既有预定义长度(定长)的应用标识符,也有非预定义长度(变长)的应用标识符时,应当把预定义长度的放在前面。它给了一个含五个字段的示例(不是上面那盒):
(01)06901234567892(11)141231(17)150707(10)A213B1(21)1234
为什么这么排?因为变长字段放在最后,就不需要任何分隔符:串到哪结束,字段就到哪结束。厂商省一道工序,读的人少一层坑。所以检验科见到的码,绝大多数是 01 打头、变长的 10 或 21 收尾。
反过来说,如果你看到的串是 01 后面直接跟 10、10 后面还有字段,那中间一定藏了分隔符——这就是下一节要讲的东西。
三、那个看不见的分隔符
结论:变长字段后面如果还跟着别的字段,中间必须有一个分隔符,否则后一个字段会被批号吞掉。这个分隔符在屏幕上几乎看不见,是最容易出事的环节。
扫码枪输出的原始串里,它是 ASCII 29(十六进制 1D),GS1 标准里叫 FNC1,也叫组分隔符。粘到记事本里,它可能显示成一个空格、一个小方块,或者什么都不显示。正因为它不可见,出问题的时候没有任何提示。
举个会出事的例子。假设某盒的码是 01 开头、批号在前、生产日期在后:批号 2511014 后面紧跟生产日期 11 251118。中间这个分隔符如果在传输中丢了,系统读到的是「251101411251118」——批号被拉长成 15 位,生产日期消失,而且不会报错。入库时看着一切正常,事后按批号追溯才发现对不上。
怎么发现?看两处。一是批号后面紧跟的应该是另一个应用标识符(01、10、11、17、21 这类两位数字),不该是一长串数字接着一长串数字;二是批号长度突然超过标签上印的位数,多半是吞了后面的字段。
还有一问正好对应这个现象。北京市药监局那份问答第 51 问问的是:载体用了符合标准的 GS1-128 或 GS1 DataMatrix,为什么使用环节扫码只能读出一长串数字字母、没有按应用标识符分开?答案是先确认扫码设备有没有设置到「识读 GS1 条码」的模式,相关软硬件是否按 GS1 标准处理了条码。
这一句值得记住:很多「码坏了」「软件不认」,其实是枪的模式不对。同一把枪在普通键盘模式下一串全吐出来,切不开字段;设成 GS1 模式,才会按应用标识符分段输出。
顺便把上一篇讲过的一处带回来,免得混淆:印在标签上的括号 不是数据。 GS1 明确规定括号只用于人工识读,不编进条码。所以枪读出来没有括号是对的,把括号一起录进系统,反而会让字段错位。
四、一维码也能承载 UDI:为什么有的码扫不出批号
结论:UDI 不一定是方块码。一维条码同样可以承载,而且很常见。这决定了你该买什么枪,也决定了「扫不出批号」到底是码的问题还是枪的问题。
《医疗器械唯一标识系统规则》第十一条的原文是:
医疗器械唯一标识数据载体应当满足自动识别和数据采集技术以及人工识读的要求。如空间有限或者使用受限,应当优先采用符合自动识别和数据采集技术的载体形式。
自动识别和数据采集技术包括一维码、二维码或者射频标签等形式,鼓励采用先进的自动识别和数据采集技术。
采用一维码时,可将产品标识和生产标识串联,也可多行并联;采用射频标签时,应当同时具备一维码或者二维码。
常见的一共有四种 GS1 载体,北京市药监局那份问答第 50 问问的就是这个,列的是 EAN/UPC、ITF-14、 GS1-128 和 GS1 DataMatrix。它们能装的东西不一样:
| 序 | 载体 · 能装什么 · 什么枪能读 |
|---|---|
| 1 | EAN/UPC(竖条纹)。只承载产品标识 GTIN,装不下批号效期。一维枪可读 |
| 2 | ITF-14(竖条纹,较宽)。同样是产品标识,多用于箱。一维枪可读 |
| 3 | GS1-128(竖条纹,较长)。带应用标识符,能装批号与效期。一维枪可读 |
| 4 | GS1 DataMatrix(方块码)。容量大、占位小,小包装常用。必须二维枪 |
看懂这张表,「扫不出批号」就有两种完全不同的解释:一种是这个码本身只装了产品标识(EAN/UPC 与 ITF-14 就是这种,换个枪也扫不出批号);另一种是码里确实有批号,但枪读不了方块码(激光一维枪读 DataMatrix 的表现是扫了没反应,不报错也不出字)。
判断方法很简单:看标签上印的是竖条纹还是方块。竖条纹是一维,方块是二维。要一把枪通吃,买影像式的(2D imager),一维二维都能读;只买激光一维枪,遇到方块码就只能手抄。
五、两位年份:26 是 2026,不是 1926
结论:条码里的日期只有 6 位,年份两位。它不是简单地补「20」,而是按 GS1 的滚动窗口判定世纪。
GS1 通用规范对 UDI 日期字段有一条限制:只能表示相对于当前年份过去 49 年到未来 50 年之间的日期,具体属于哪个世纪由规范判定。也就是说,两位年份永远落在这个滑动窗口里。
所以读到 26,一定是 2026,不会是 1926;读到 99,也不会被当成 2099。这条规则在纸面上不起眼,落到系统里却很关键。
常见的错法是把 6 位日期硬按「20 加前两位」拼。这么做在当下没问题,但导入历史数据时会出事:一批 1990 年代末的记录会被算成 2090 年代,一条早就该清掉的过期试剂,在系统里显示还有几十年才到期。做数据迁移、跨年归档的时候,这一处要专门验一遍。
还有一处常被问到的差异:标签上印「有效期至 2027-05-18」,条码里是 270518,两者是同一天。至于为什么有的软件把「有效期至」和「失效日期」算得差一天,那是另一个话题,见上一篇提到的日期口径,以及库存管理里的效期处理。
六、校验位:最后一位能自证有没有扫错
结论:UDI 里的产品代码,最后一位是校验位,能验证前面十几位有没有抄错、扫错。它只证明这串数字本身合法,不能证明产品是真是假。
算法是模 10 加权。从最右边那位校验位算第 1 位,往左数:第 2、4、6……位乘 3,第 3、5、7……位乘 1,全部相加,用 10 减去和的个位数,结果就是校验位(和为整十时校验位是 0)。
拿标签上那串 06936498600238 验一遍:去掉最后一位 8,前 13 位从右往左是 3、2、0、0、6、8、9、4、6、3、9、6、0,按 3、1、3、1 交替相乘后相加,得 9+2+0+0+18+8+27+4+18+3+27+6+0=122;10 减 122 的个位数 2,等于 8,与最后一位一致。
这一步在入库环节很实用:扫出来的产品代码校验不过,说明这一串少读或多读了一位,不是产品有问题,是这一次没读全。比起入库之后对着实物找差异,当场重扫一次便宜得多。
与此配套的一条要求:系统里应当有一个 14 位字段来保存 GTIN,不足 14 位时前面补零(北京市药监局那份问答第 50 问)。所以库里存的产品代码一律 14 位;标签上印的是 13 位的(EAN-13),前面补一个 0 才是同一个代码。少补这个零,同一个产品在系统里就会变成两个。
七、UDI 码读错了的六种情形
结论:UDI 读错多半不是设备坏,是下面六处之一。前三种在录入环节,后三种在取码环节。
一、把括号录进去。括号是给人看的写法,条码里没有。带着括号存,字段长度全部对不上,按批号查会查不到。
二、批号吞掉后面的字段。分隔符在传输中丢失,批号变成十几个字符,生产日期消失。特征是批号长度异常、后面本该有的字段不见了。
三、少补前导零。标签印 13 位、系统存 14 位,中间差一个 0。补上才是同一个产品,不补就变成两个。
四、6 位日期当 8 位转。手工把 270518 转成 2027-05-18 时看错一位,或者按「20 加两位」硬拼,遇到老数据就跳到下个世纪。
五、箱码当盒码。不同包装级别应当使用不同的 UDI-DI(北京市药监局那份问答第 41 问)。扫箱码入库,库存里就多出一个不存在的规格,数量还翻了几倍。
六、扫的是内部码。医院自己贴的条码、供应商的物流码,长得也可能像 UDI。区别在开头:GS1 码以 01 起,MA 码以「MA.」起,AHM 码以「MF0」起,内部码多是流水号或字母开头。
读对之后还有一步:存的时候存 DI,不存整串。产品标识是去数据库查产品名称、注册证号、生产企业的钥匙;生产标识是这一盒的属性。两者混在一起存,同一个产品会因为批次不同被当成不同产品,库存统计立刻失真。扫码字段怎么落到库存记录上,见智能库存管理;具体到品种、批号、效期的建账方式,见帮助中心;整体功能范围见产品功能总览。
还有一种「读不出来」不是读的问题:这盒本来就不该有码。第二类体外诊断试剂要到 2027 年 6 月 1 日才要求赋码,全部一类体外诊断试剂是同一天,其他一类器械更晚。手里这盒没有方块码,先看生产日期再下结论——完整的起算日、以及整盒有码而单支没有码的情形,见UDI 实施时间表。
八、常见问题
下面 8 个问题,是读码环节被问得最多的。
问:扫出来是一长串数字,中间没有括号,正常吗?
答:正常。括号只出现在标签的人工识读行里,GS1 明确规定不编进条码。枪读出来的就是连续的字符,各字段靠应用标识符分段,靠软件切,不需要靠括号。
问:为什么有的码能扫出批号,有的只有一串数字?
答:看载体。EAN/UPC 与 ITF-14 只承载产品标识,本来就没有批号和效期; GS1-128 和 GS1 DataMatrix 才能连生产标识一起装。所以有的盒子扫出来只有产品代码,不是漏印,是那个码没装那么多信息。
问:一维条码枪能扫 UDI 吗?
答:能扫一维载体的 UDI,扫不了方块码。激光一维枪读 DataMatrix 的表现是没反应,既不报错也不出字。要一维二维都读,得用影像式扫码设备。
问:条码里的日期为什么只有 6 位?
答:GS1 的日期字段固定 6 位,年月日各两位,比如 270518 是 2027 年 5 月 18 日。年份属于哪个世纪由规范按滚动窗口判定,不是简单补「20」。
问:批号后面多了个空格或者小方块,是什么?
答:大概率是分隔符,ASCII 29。批号长度不固定,后面还接别的字段时,中间必须放这个字符,否则后面的字段会被批号吞掉。它本身不是数据,不该存进批号字段。
问:产品代码是 14 位,标签上只印了 13 位,是漏印吗?
答:不是。13 位的是 EAN-13,前面补一个 0 就是 14 位的 GTIN。系统里应当按 14 位保存,不足补零,这是官方问答里明确的要求。
问:同一产品的箱码和盒码扫出来不一样,是不是错了?
答:不是错。不同包装级别应当使用不同的 UDI-DI。箱码对应的是箱这个包装单位,盒码对应最小销售单元。入库时按实际收货单位扫,别把箱码当盒码用。
问:MA 码怎么读?
答:MA 码不用应用标识符那套。产品标识由「MA」、点号、制造商编码、点号、产品编码组成,制造商编码里含国家代码、行业代码、注册人代码,产品编码含包装编码、项目编码和校验码。字段靠点号分隔,不能拿 GS1 的切法去套。按药监局全量公开数据,体外诊断试剂里约 4.7% 用 MA 码,不是个例,得能读。
九、参考资料
本文涉及的法规、标准与官方问答均来自官方发布,可查证的原文与链接如下。
- 国家药品监督管理局公告 2019 年第 66 号:《医疗器械唯一标识系统规则》(国务院公报 2019 年第 35 号) https://www.gov.cn/gongbao/content/2019/content_5462534.htm
- 北京市药品监督管理局:《医疗器械唯一标识咨询问答》(2022 年 6 月,含发码机构、编码结构、载体与读码问答) https://yjj.beijing.gov.cn/yjj/ztzl48/ylqxjgfwzn/zxwdzl68/325830367/2022061514351826406.pdf
- 国家药监局医疗器械唯一标识数据库(公众查询入口,并可按批下载全量公开数据;本文编码体系分布即取自该库 2026-10-01 版全量数据) https://udi.nmpa.gov.cn/
- 国家药监局医疗器械唯一标识数据库 · 发码机构与编码规则 https://udi.nmpa.gov.cn/showNumberingCenter.html
- 《基于商品条码(GS1)标准的医疗器械唯一标识(UDI)实施指南》· 中国物品编码中心中国物品编码中心 · UDI 实施指南(PDF)
- 中国物品编码中心(GS1 中国)官网 http://www.gs1cn.org/
- GS1 DataMatrix Guideline(含应用标识符与单元数据串格式、FNC1 用法) https://www.gs1.org/standards/gs1-datamatrix-guideline/25
- GS1 General Specifications(日期世纪判定见 7.12,条码符号数据处理见 7.8) https://www.gs1.org/standards/barcodes-epcrfid-id-keys/gs1-general-specifications
- 国家药监局、国家卫生健康委、国家医保局:《关于做好第三批实施医疗器械唯一标识工作的公告》(2023 年第 22 号) https://udi.nmpa.gov.cn/toDetail.html?CatalogId=2&infoId=79
- 国家药监局、国家卫生健康委、国家医保局:《关于做好后续品种实施医疗器械唯一标识工作的公告》(2026 年第 21 号,2026-03-04,明确二类及一类体外诊断试剂的起算日为 2027 年 6 月 1 日) https://udi.nmpa.gov.cn/toDetail.html?CatalogId=2&infoId=80
- GS1 Healthcare · UDI 相关标准与实施资源 https://www.gs1.org/industries/healthcare
- 国家药品监督管理局:《对十四届全国人大二次会议第 1929 号建议的答复》(国药监建〔2024〕84 号,原文见国家药监局网站)
- GB/T 16986《商品条码 应用标识符》(应用标识符的国家标准依据)
- GB 12904《商品条码 零售商品编码与条码表示》(GTIN-13 与校验码计算)
- GB/T 16830《商品条码 储运包装商品编码与条码表示》(GTIN-14 与储运包装)
- YY/T 1630《医疗器械唯一标识基本要求》(医药行业标准)
- ISO/IEC 16022《Information technology — Automatic identification and data capture techniques — Data Matrix bar code symbology specification》
文中条文为原文摘录,未改字;编码结构与字段长度以发布机构标准与官方问答为准。本文只说明码的读法,不对任何具体产品的合规状态作判断。