diadoc / diadocsdk-csharp

Official Diadoc SDK for C#
MIT License
34 stars 64 forks source link

Перестала работать отправка кодов маркировки в УПД #1010

Closed kdubailov closed 1 year ago

kdubailov commented 1 year ago

DiadocApi v2.9.0.0

Код маркировки перед отправкой выглядит так:

010641944025376321LqlUs>WmjPaED91FFD092dGVzdP537gb3xr15cMYFacXleo8jxXeBuZSQ9hQQc/4=

Возникает исключение

"Invalid data UserContractData:\r\n'\u001d', hexadecimal value 0x1D, is an invalid character. Line 41, position 54." в Diadoc.Api.Http.HttpClient.PerformHttpRequest(HttpRequest request, HttpStatusCode[] allowedStatusCodes) в Diadoc.Api.DiadocHttpApi.GenerateSenderTitleXml(String authToken, String boxId, String documentTypeNamedId, String documentFunction, String documentVersion, Byte[] userContractData, Boolean disableValidation, String editingSettingId) <код нашего приложения>

Если передавать код маркировки не полностью, то отправка выполняется успешно. Создается УПД, в xml

  <СведТов НомСтр="1" НаимТов="маркированный товар" ОКЕИ_Тов="796" КолТов="1" ЦенаТов="88.80" СтТовБезНДС="88.80" НалСт="без НДС" СтТовУчНал="88.80">
    <Акциз>
      <БезАкциз>без акциза</БезАкциз>
    </Акциз>
    <СумНал>
      <БезНДС>без НДС</БезНДС>
    </СумНал>
    <ДопСведТов КодТов="14567" НаимЕдИзм="шт">
      <НомСредИдентТов>
        <КИЗ>010641944025376321LqlUs&amp;gt;WmjPaED</КИЗ>
      </НомСредИдентТов>
    </ДопСведТов>
  </СведТов>

Вопросы 1) Почему символ 0x1D стал считаться некорректным? (раньше работало) 2) Как правильно передавать код маркировки? в полном или сокращенном формате?

ilzag commented 1 year ago

Добрый день! Методы генерации в Диадоке не экранируют символы. В данном конкретном КИЗ последовательность &#x1D распознаётся как hex-символ "Information Separator Three". Варианты решения:

  1. Экранировать символы & перед генерацией, обращая их в &amp;, тогда метод не вернёт ошибку.
  2. Экранировать весь код сразу, используя конструкцию CDATA: <КИЗ><![CDATA[код]]></КИЗ>

Экранировать требуется не только символ &. Можно использовать таблицу ниже:

Символ | Замена -- | -- `<` | `<` `>` | `>` `&` | `&` `'` | `'` `"` | `"`