标记标记,标记和标记。标记很简单!

今年,有关使用新标记系统“诚实标记”的实践的文章立即发表了几篇。它们是由参与营业额的公司的IT部门的“ IT专家”撰写的,反映了他们对试点项目的进展以及启动战斗系统的第一天的看法。例如,在这里那里



该系统经常受到批评和批评,这主要是由于API的频繁更改,个人帐户中的错误以及某些过程中的白点。


尽管不是第一个,我们还是决定就我们正在积极参与的这个新的雄心勃勃的国家项目发表我们的经验和想法。



文章看起来似乎是一团糟,但整个标签却是一团糟,很多方面都集中在一个地方。



图片



简要介绍我们



Cleverens致力于为移动工作人员开发软件,主要用于数据收集终端(TSD)和退休记录仪(RV)的专用设备。



在某人看来,森林,森林中的树木,甲虫在树上,并且微生物生活在甲虫中,而TSD软件的利基与甲虫中的微生物有关。



为此,我们可以回答,人员流动是一个很大的增长市场,带有现成软件的特殊硬件通常是当前所有硬件的未来。最后,任何真正突破性的事情都是在狭n的利基市场上多年工作的结果(请参阅Andrey Doronichev关于移动YouTube的著名采访)。



基本上,Cleverence产品的销售是与会计系统进行现成的集成,我们自己编写和支持(集成)该会计系统(例如,Warehouse 15)。



我们尝试在实际行业,仓库,商店等中运行所有软件和硬件。例如,当鞋标项目刚刚开始时,我们去了中国测试业务流程,与此同时,他们拍摄了有关它视频



什么是标签系统和“公平标记”



粗略地说,这是条形码和RFID上的公共-私有物联网,用于完全跟踪货物单位的移动。



标签系统上有很多信息,主要资源是Honest Sign网站



图片



市场参与者对标签的态度



市场参与者对标签的态度是两极分化,这已经不是什么秘密了。来自“俄罗斯,向前!” 和“这个主意很好,但是实施让我们失望了”,“再次伤害了小孩子”。



优势包括粉刷市场和控制供应链。缺点-交易标记商品时从UTII中删除。



几乎所有的大型标签业务。希望在白色环境中工作精美且白色的小型企业家-还要贴标签,对于他们来说,这是与灰色市场相比的竞争优势。



大多数中小型企业反对标签,标签认为这对他们自己是不必要的负担。


索赔主要被表述为“小企业再次被勒死”或“您有那么多钱和很多人,您本可以做到这一点和那样”,“某某业务流程之类的考虑不周全”。尽管主要是在一家小型企业及其流程上花费的钱-这是一个拥有参与者个人帐户,基于云的代码发射记录器等的站点。



IT专家的职位也值得一提,下面对此进行介绍。



同时,在其上发布信息的“诚实商标”的信息门户也很好。例如,在哪里可以找到英文信息?就在这里还有中文?就在这里



每个人都在谈论的启动问题



飞行员走路时,系统中存在许多错误。基本上,他们设法在2020年7月1日之前治愈了它们。



他们承诺,EGAIS在一开始就可以更好地工作,并且总的来说,服务可用性更高。



现在,该系统始终可以用在烟草和鞋子上,除了迅速关闭几个小时的夜间技术工作外,其他所有功能都可以快速解决。



图片



但一开始的关键问题是“您不能不加利用”,99%的营业额参与者(按人数计算)都愚蠢地忽略了该系统,没有注册,没有负担,等待审判的日子,然后要求推迟。



2019 «» , 10 , ( ). 10 .



, , .


每个人都知道这个问题,他们正在为此做准备,但是当鞋子截止日期到来时,它仍然崩溃了。一些UOT争先恐后地为剩余部分写出免费代码20年,这在高峰时使服务器的负载增加了40倍。当然,这类游戏不会徒劳,因为该系统是数字化的,而且正如他们所说的,“所有动作都被记录下来”。



不幸的是,打标的先驱者也遭受了打击-这些公司从第一天起就一直在打标飞行员中,是出于真诚尝试的,但最后他们也要求推迟。



在这里必须说,状态系统不是从销售的第一天就引起喜悦的iPhone。创建它的目的不是要从IT专家那里收集喜欢的东西,也不是拍摄视频评论,例如“当它出现时,我会亲自决定是否要购买”。



由于某些原因,人们希望系统从一开始就可以像已经投入生产5年一样正常工作。



一般来说,如果您按照这种逻辑等待,当一切都将变得完美时,则必须将一切推迟到2030年,或更晚在征服火星之后,是的。



IT专家的职位



IT专家的职位不是“赞成”或“反对”,而是“给予”。要求所有更改都必须提前宣布,需要更好的文档,更多的测试用例,沙箱,更少的限制。



总的来说,该项目具有许多不同的硬件和国际标准,这仅给经典的IT专家带来痛苦。



IT专家是非常有腐蚀力和智慧的人,对于任何问题都有自己的见解。除了关于API的声明外,在标签上没有达成共识,通常没有。



该系统的API更改的频率比我们在“制造后忘记”方案中希望的更改更频繁。但是同时,我们认为应该向API添加一堆方法来处理组包(聚合),简化授权等,但这又意味着更改API。



我们自己就是IT人员,并且我们同样具有API缺少方法的双重立场,但是API更改经常。正如他们所说,“旗帜是种族主义者,但这是我们的故事。”



通常,需要改进API,但建议提前1-2个月进行警告,并给人们一些时间来更改其系统。那时是在烟草标记战斗循环中比测试循环中有一个较新版本的API。


标记的技术方面



IT专业人员面临的技术问题主要归结为以下几点:



  • UKEP的系统管理员问题,过去和将来,只要操作系统和浏览器的版本存在碎片
  • 编码问题无法通过在StackOverflow上进行谷歌搜索来解决,因为尽管使用了开源软件,但系统是新的且唯一的
  • 实施问题,当人们使用“在线条形码生成器”或“键盘断路器”,然后想知道为什么会出现废话


看,这里是Java,Reactive(RxJava),Spring甚至是Netflix:



图片



要形成自己的见解,您可以阅读购物车中techno聊天



授权书



IS MT中的授权分为两个阶段。



首先,您需要请求一个特定的伪随机“密钥”,该密钥必须经过签名并发送到URL“ / api / v3 / auth / cert /”(在撰写本文时,斜杠“ /”必须位于URL的末尾,否则它不起作用,看起来很奇怪)。



获取“密钥”的方法如下(您需要替换所需的主机,有很多不同的主机,具体取决于它是沙箱还是战斗箱,衣服或其他东西):



//   /api/v3/auth/cert/key “”  ,   
var uri1 = new Uri("< >/api/v3/auth/cert/key")
var randomDataResponse = REST.Invoke<RandomDataResponse>(uri1, "GET", timeout);


然后,您需要使用选定的CEP对这个伪随机“密钥”进行签名,然后将其发送到GIS MT,以接收作为响应的授权令牌。



为此,我们正在为用户选择的指纹(certificateThumb)寻找CEP证书。在这种情况下,证书位于本地计算机的“个人”中。另外,证书上下文必须与密钥对存储区关联(在Windows管理单元中的证书列表中,此类证书用钥匙图标标记):



图片



在代码中获取证书以生成签名:



X509Certificate2 cert = null;
using(store = new X509Store(StoreName.My, StoreLocation.LocalMachine))
{
    store.Open(OpenFlags.ReadOnly);
    cert = from c in store.Certificates where string.Compare(c.Thumbprint, certificateThumb, true) == 0 select c;
}


我们以这种方式签名:



//   
var content = new ContentInfo(randomDataResponse.Data);
var signedCms = new SignedCms(content, false);

//    ,  
var signer = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, cert);
signer.SignedAttributes.Add(new Pkcs9SigningTime(DateTime.Now));

//  
signedCms.ComputeSignature(signer, false);
var sign = signedCms.Encode();


签名的CMS消息(符号)是在转换为Base64格式后需要发送以进行授权的验证签名。



var tokenRequest = new TokenRequest();
tokenRequest.UUID = randomDataResponse.UUID;
tokenRequest.Data = Convert.ToBase64String(sign);

//    /api/v3/auth/cert/
var uri2 = new Uri("< >/api/v3/auth/cert/")
var tokenResponse = REST.Invoke<TokenResponse>(uri2, "POST", tokenRequest);


响应是在Base64中编码JWT令牌。



顺便说一下,要发送的文档以相同的方式签名,仅形成所谓的“分离”签名:



var signedCms = new SignedCms(content, true);


助手类(具有与API中的XSD文档架构相同的架构):



/// <summary>
///    GET /api/v3/auth/cert/key  .
/// </summary>
public class RandomDataResponse
{
    /// <summary>
    ///     ,  string
    /// </summary>
    [Newtonsoft.Json.JsonProperty(PropertyName = "uuid")]
    public string UUID { get; set; }

    /// <summary>
    ///  ,  string
    /// </summary>
    [Newtonsoft.Json.JsonProperty(PropertyName = "data")]
    public string Data { get; set; }
}

/// <summary>
///     .
/// POST /api/v3/auth/cert/
/// </summary>
public class TokenRequest
{
    /// <summary>
    /// uuid -      /api/v3/auth/cert/key
    /// </summary>
    [Newtonsoft.Json.JsonProperty(PropertyName = "uuid")]
    public string UUID { get; set; }

    /// <summary>
    ///        base64
    /// </summary>
    [Newtonsoft.Json.JsonProperty(PropertyName = "data")]
    public string Data { get; set; }
}

/// <summary>
///     .
/// POST /api/v3/auth/cert/
/// </summary>
public class TokenResponse
{
    /// <summary>
    ///    base64-
    /// </summary>
    [Newtonsoft.Json.JsonProperty(PropertyName = "token")]
    public string EncodedTokenBase64 { get; set; }
}


如果您成功登录,则说明您已经完成了一个小任务。



生成和读取条形码的问题



标记系统基于国际标准,带有密码学的部分除外。这是极好的,值得称赞的。



不幸的是,普通的IT专家不会阅读任何标准,不会研究任何东西,而是立即将自行车上的免费组件雕刻成条形码,打印,业务流程等内容。



第一个困难是在设计中打印标签条形码。开箱即用的“ Honest Sign”提供了一个免费工具,但是当然没有人开始使用它,因为这里有一个“在线条形码生成器”和内置的1C / SAP / NAV / DAX报告编辑器。



埋伏是现代条形码不仅是符号的图形表示(我们将在此另作文章)。因此,没有人知道并且不想立即理解的前缀,分隔符,编码,强制性不可打印字符等问题。



带有GS特殊字符(ASCII 29)的



图片



示例带有FNC1特殊字符(ASCII 232)的示例



图片



截屏来自Checkmark应用程序



这是Checkmark源代码的一部分,它解析由相机扫描并由我们的平台解析的条形码:



var km = BarcodeData.GS1;
if (km.Contains("01") && km.Contains("21"))
{
    if ((km.Contains("17") || km.Contains("7003")) && !km.Contains("10"))
    {
         = true;

        if ((km.GetValue("01").Length == 14) && (km.GetValue("21").Length == 7 || 
             km.GetValue("21").Length == 13) && (km.GetValue("17").Length == 6 || 
             km.Getvalue("7003").Length == 10) && (km.GetValue("93").Length == 4))
        {
              = true;
             MSG2 = " KM   .";
             if (km.GetValue("21").Length == 7)
                 MSG2 = "      .";
        }
        else
        {
             //        (EntriesRows)
             //    -     
             EntriesRows = I(EntriesRows, Al = 93, BarcodeData);
             MSG2Error = "   3!     .";
             Msg = "<b>#N005</b>" + Msg;
         }
    }
    else if (km.Contains("8005") || km.Contains("93"))
    {
          = true;

         if (km.GetValue("01").Length == 14 && km.GetValue("21").Length == 7 && 
             km.GetValue("8005").Length == 6 && km.GetValue("93").Length == 4)
         {
              = true;
             MSG2 = "    .";
         }
         else
         {
             EntriesRows = I(EntriesRows, AI = 8005, BarcodeData)
             EntriesRows = I(EntriesRows, Al = 93, BarcodeData)
             MSG2Error = "   3!     .";
             Msg = "<b>#N004</b>" + sg;
         }
    }
    else if (km.Contains("92") && km.Contains("92").Length > 66)
    {
         = true;
        if (km.GetValue("01").Length == 14 && km.GetValue("21").Length == 13 &&
            km.GetValue("91").Length == 4 && km.GetValue("92").Length == 88)
        {
            ... ( ..) ...


特殊字符来自哪里?从标准。 “诚实的标志”按照标准做了一切,货物周转的参与者也必须阅读该标准。



顺便说一句:您只能通过使用照相机进行扫描来检查DataMatrix内容的正确性(即使从TSD进行扫描,也需要使用照相机)。因为根据标准,所有条形码扫描仪都不应返回其读入的1in1信息,至少它们应该扔掉第一个FNC1字符。通常,扫描仪可以在扫描时添加或删除重要的条形码符号,根据设置在适当位置重新排列块,所有这些都会干扰验证。



因为由于系统集成不是关于程序,而是关于人员以及他们如何编写和读取规范,因此这些特殊字符的存在立即导致在交换条形码时出现一些分歧。



例如,他们可以在不真正阅读规格的情况下,在条形码中添加4个字符的字符串“ FNC1”,而不是一个ASCII 232(FNC1)字符。但是,当在子系统之间交换时,此类字符经常被过滤掉并丢失,在没有此类字符的情况下它们可以打印,而在普通文本编辑器中则特别。字符通常不显示,人们想知道如果条形码匹配,为什么出了问题。



同样,如果您未指定符号FNC1在条形码中,某些硬件或软件可能不了解其含义以及如何拆卸,因为条形码开头的符号仅表示这是GS1 DataMatrix格式。



几乎每个人都偶然发现的一个最新示例是序列号中出现括号和标点符号。



图片



括号和标点符号在哪里来自序列号?超出标准! GS1标准允许使用它们。因为序列号只有13个字符长,并且有很多标记商品,您必须使用所有可用的字符。



单独的字母-序列号中的括号。标准允许它们存在,但是没有人期望它们。在所谓的人类可读符号(HID)中,括号具有特殊含义:它们构成有意义的字符组的数量。例如,“(21)”表示序列号将在此行的后面。



如果天真地认为条形码仅包含一个字符串,那么在字符串“(21)abcd12(3)d(1,(91)”)中,序列号似乎是“ abcd12”,而有关“(1,)”的部分似乎根本就是错误。



实际上,这里的序列号是“ abcd12(3)d(1,)”,并且在逗号后面有一个不可读的GS符号。)并不是要序列号应该是13个字符(因为正式地,GS1 DataMatrix中序列的长度可能不同) ,例如,在轮胎中,可以为20个字符)。GS必须考虑在内,并且不显示在任何会计系统的字段中,并且不接受输入,并且通常被禁止(并且在常规记事本中也不可见,也不会显示它,您需要记事本++)。



这些特殊字符的存在对条形码数据的传输和存储施加了限制;例如,必须在Base64中对其进行筛选或编码。



顺便说一句:有一种用于存储和传输条形码(例如字符串)的标准(ISO / IEC 15424-2018),但是由于某种原因,没有人使用它。以字符串形式存储的GS1 DataMatrix条形码数据必须以“] d2”开头。



现在,几乎每个人都已修复了其条形码打印组件(可能已修复)。但是谁会读这些标准,对吗?



为了验证,作业:这里的主题是,如果该字段的长度固定,则不需要插入GS,并且如果该长度是可变的并且该字段的值不是最大长度,则需要插入。实际上,这不是此规则的工作原理。仅当AI以该表中的一对数字开头时,才插入特殊字符GS



图片

在所有其他情况下,都将其插入。您的条形码生成/解析代码是否起作用?



另一个问题是使用诸如“键盘楔子中的扫描器”之类的较老工具扫描条形码标记。贴标签之前,最大的问题是在某个地方切割或插入了额外的零。随着新代码的引入,带有扫描功能的Lulz标记达到了一个全新的高度。



这些通常不是扫描仪本身或其设置的问题,而是缺乏经验和理解条形码原理的问题。



例如,当将扫描仪“连接到键盘楔形”(或模拟此模式)时,以及将扫描仪作为HID设备连接时,将扫描条形码中的某些字符替换为其他字符或某些字符消失可能会出现问题。



图片

将扫描仪连接至键盘中断的方案



在指定模式下工作时,扫描仪不会将条形码中的符号传输到计算机(sic!),但是必须按下键盘上的击键代码才能在键盘上键入此条形码中的符号。



同时,很明显,根据布局语言和按下修饰键(Shift,Caps Lock,Alt和Ctrl),几个可能的字符可以一次对应一个键盘键。



例如,当您在键盘右下角按此键时:



图片



结果可以是任何字符“?”,“ /”,“,”或“。”,具体取决于所选的布局和修饰键的使用。输入的特定字符取决于操作系统的键盘设置,而不取决于扫描仪。



因此,结帐时会丢弃完全不同的序列,而不是某些序列,或者根本找不到代码。



顺便说一句,如果序列中有校验和,可以使用最后一位数字来检查代码是否正确,是否正确读取/输入了代码,这些问题可以避免。对于活期帐户,TIN,卡号和EAN13,最后一位数字是用于验证的支票金额,因此人和车在输入时不会出错。



图片



显然,在这里他们希望DataMatrix能自我检查,再加上一个加密尾巴。但是一件事是整个条形码,可以进行自我检查,另一件事是一段带有序列号的代码,可以完全从键盘输入。



IT专家的不同争议是由所谓的“加密尾巴”引起的。



“加密货币”是标记条形码的必要部分,因此,可以使用对称键检查该项目的序列号是否没有从手指中吸出。



图片



加密尾巴仅存在于条形码中,而不存储在标记数据库中,因此,没有黑客可以破坏基础并打印其他人的条形码。



那些。这是一种数字签名。但由于条形码不是橡胶的,但商品很多,此数字签名的长度很短,不允许使用对所有人开放的加密密钥。



当然,所有序列号都在标记数据库中,但是如果您在线检查它,那么当Internet下降时,所有仓库和商店都会立即站起来。



加密货币旨在解决此问题,但到目前为止(到2020年夏天),加密货币尚未完全发挥作用。



事实是,加密是俄语的,并且与硬件相关。但是,除了俄罗斯地穴之外,别无选择,俄罗斯国家系统无法使用外国地穴,这将是一个漏洞因此,您将不得不忍受俄语,这是合理的,而不是困难的。



通常,密码学是一个非常复杂的主题。有很多信息,在特定情况下很难找到有关如何签名或加密数据的描述。


试图与标签API集成的每个人都面临着这一问题。聊天中有很多问题,例如“为什么不登录?”,“如何签名?”,“分享示例!”,“签名生成但拒绝了,为什么?”还有很多其他



错误常常是司空见惯的。例如,在签名后,数据被更改,或者丢失了空格或某种无关紧要的字符,但这对签名至关重要,在将其发送到API之后,收到的拒绝是没有说明的,因为签名尚未验证。



幸运的是,在聊天中,他们最经常提供帮助并回答了此类问题。总的来说,所有这些问题都将在2020年7月1日之前得到解决或已经得到解决。



“ ” 1 2020 - , , . , .





在Cleverance,我们认为软件问题不是主要问题。更糟糕的是,商品流通的参与者仍然不了解变化的实质。这是一个比软件错误大得多的问题。



人们将标签视为另一种会计报告,可以坐在1C / SAP / NAV / DAX中的计算机上进行编辑,更正,追溯更改等。该类型将由会计师和后勤人员使用,并且IT专家必须为此“缩减”必要的模块和处理。



客户的主要要求是对仓库/中文/ tetyamasha进行扫描,然后将其“正确”加载到1C / SAP / NAV / DAX中。我们已经成功地做到了。



但这是一个明显的错误,当公司开始彼此平衡余额并且状态开始罚款时,就会显示出来。



实际的打标系统是什么



产品标签是反映真实运动的系统。



真正的标签问题



这纯粹是我们的恕我直言。



自动机的所有实际问题都来自标记系统的真正用途,即反映真实运动的系统。



首先,当通过SKU,按批次或平均方式对所有事项进行核算时,实际的变动核算与当前对整个链条进行核算的原则相矛盾。追溯地,减少和纠正是我们的一切。



任何公司的会计系统都是经过精炼和修正的童话,讲述了经过100,500个电话,更正,重新过帐和清理错误后一切都变得多么美好。



在一个大型外国药品分销商的一次扩展会议上,经过一个小时的讨论,首席物流师终于翻了个白眼,说:“每个包装是否有不同的条形码?”。显然,“唯一”,“序列号”,“每个副本”,“扫描所有内容”等字样飞了过去。



其次,对变动的实际核算违反了当前的商业惯例和关注点分离的原则。



即使公司规模很大,员工也无权编辑某些文档-因为有电话号码,您可以致电或写信给可以纠正的人。



或者,例如,文件由一些基层员工由董事的CEP签名,如果有两因素身份验证,则通过SMS。在标记系统中,存在着关于用户及其权利的障碍,您可以向每个人发布单独的CEP,但是人们并不急于这样做。



这是一个明显的问题,可以通过向贴有标签产品的普通员工提供越来越多的权利和会计工具来解决。



此外,计算成本价格或会计系统中变动的会计规则基于平均和简化,例如FIFO / LIFO和平均价格。从生产到零售,数十年来一直在各地应用的会计准则就是基于这些简化,并且与唯一单位的真实可追溯性背道而驰。



因此,实际上,例如,事实证明是通过FIFO / LIFO将货物发送到标记系统,但是实际装运的是离出口更近的货物。



对于普通员工来说,这也可以通过特殊的设备和软件来解决,这些员工由于工作性质而不能坐在计算机旁。



另一个问题是试图“在地球上拉猫头鹰”并将标记代码插入所有标准ERP文档中,以便会计师,后勤人员或负责的经理可以在此处看到它们。



尽管他没什么可看的,但他却无能为力。



的确,作为一名会计或经理,看着监视器,他可以理解自己昨天扫描了那里的仓库,为什么在成千上万的三支香烟中有红色突出显示的差异?



基层人员可以访问所有必要信息的工具也可以解决此问题。



那是 这些不是某些系统的技术问题,总体而言,这些问题已在2020年7月1日之前得到纠正,而是在新轨道上重组公司工作的问题。


结论



标签的主要优点是,该州迫使每个人都进行数字化,并使用数字签名和加密技术转换为EDF。



“浪潮抬高了所有船只,”整个市场向通用轨道的过渡产生了巨大的协同效应。



祝大家自动化愉快!



All Articles