diadoc / diadocapi-docs

HTTP API documentation - http://api-docs.diadoc.ru/
41 stars 90 forks source link

Document type UniversalTransferDocument-??????-utd820_05_01_01 is not allowed to send #539

Open ethaniel opened 4 years ago

ethaniel commented 4 years ago

Что делать с этой ошибкой? Мало того, что вы отказались от JSON, переименовали BoxId в BoxGuid, создав нереальную головную боль, так теперь непонятно как правильно генерировать и подавать XML.

<?xml version="1.0" encoding="utf-8"?>
<UniversalTransferDocument Function="СЧФДОП"
                           DocumentDate="22.11.2019"
                           DocumentNumber="1094"
                           Currency="643">
<Seller>
   <OrganizationReference OrgType="1" BoxId="002868b6-06a2-47a6-8852-f4af3fe6ba21"/>
</Seller>
<Buyer>
   <OrganizationReference OrgType="1" BoxId="fbe912eb-b0e6-4602-bb45-990229eb2e43"/>
</Buyer>
<Shipper SameAsSeller="true" />
<Signers>
   <SignerReference BoxId="002868b6-06a2-47a6-8852-f4af3fe6ba21"/>
</Signers>
<Table TotalWithVatExcluded="123.45" Vat="123.45" Total="123.45" TotalNet="123.45">
   <Item Product="Товарная позиция" TaxRate="18%" Subtotal="123.45"/>
</Table>
<TransferInfo OperationInfo="Информация об операции"/>
</UniversalTransferDocument>

Подаем на

GenerateSenderTitleXml?boxId=002868b6-06a2-47a6-8852-f4af3fe6ba21&documentTypeNamedId=UniversalTransferDocument&documentFunction=СЧФДОП&documentVersion=utd820_05_01_01

Так вы умудрились еще русские символы запихать в GET, что является жутким моветоном, так как непонятно в какой кодировке вы работаете, то UTF-8, то Windows-1251.

Зачем передавать documentFunction в GET, если он уже и так присутствует в XML?!

ethaniel commented 4 years ago

Разобрался в проблеме, забыл заэкранировать параметр GET documentFunction через urlencode. Но вопрос остается - почему нужно указывать documentFunction в GET, если он уже есть в XML?

flosca commented 4 years ago

Привет.

Потому что методы Generate(Sender/Recipient)TitleXml универсальные, а полный тип в Диадоке находится по связке "тип-функция-версия".

Не всегда функция может быть указана в контенте документа, случай с УПД лишь частный.

denlapaev commented 4 years ago

Привет! JSON по GenerateSenderTitleXml не вернули? Модет из-за передачи JSON возвращаться ошибка "Document type UniversalTransferDocument-%D0%A1%D0%A7%D0%A4%D0%94%D0%9E%D0%9F-utd820_05_01_01 is not allowed to send"?

aeremina88 commented 4 years ago

Добрый день! Метод GenerateSenderTitleXml не принимает JSON. В теле запроса должен содержаться заполненный XML-файл.

ethaniel commented 4 years ago

Добрый день! Метод GenerateSenderTitleXml не принимает JSON. В теле запроса должен содержаться заполненный XML-файл.

А чем было вызвано решение резко перейти на XML? Почему вы не перевели все остальные методы вашего API на XML?

flosca commented 4 years ago

А чем было вызвано решение резко перейти на XML?

Решение вызвано тем, что не было универсальности в генерации и парсинге абсолютно любого типа, вместо этого были отдельные методы, которые необходимо развивать и поддерживать.

резко

Обобщённые методы GenerateSenderTitleXml и GenerateRecipientTitleXml доступны в API по меньшей мере с лета 2018-го года.

820-й формат по факту первый, в котором мы отказались от старой парадигмы с отдельными методами на тип. И возможность его генерации через xml в Диадоке появилась в конце мая 2019-го года.

Почему вы не перевели все остальные методы вашего API на XML?

Со всеми предыдущими форматами (155, 83 и т.д.) можно также работать и универсально, через новые методы и упрощенные xml (хотя сейчас с устаревшими форматами в этом смысла нет, конечно). Точечные старые методы, работающие через json или протобуфер, будут удалены, когда интеграции будут готовы отказаться от их использования (т.е. никогда :) )

ethaniel commented 4 years ago

Для вас же по идее не должно быть разницы - парсить данные из упрощенного xml, или из json. Объем работы для вас абсолютно одинаковый.

А для нас, разработчиков, уже начавших разработку под json, который является стандартом api во всех крупных системах (и на котором работает 95% вашего собственного api), переход на xml является очень сложной задачей.

Особенно когда вы не предоставляете примеров, как это раньше вы делали под protobuf/json.

denlapaev commented 4 years ago

Что делать с этой ошибкой? Мало того, что вы отказались от JSON, переименовали BoxId в BoxGuid

А можно чуть подробнее про Guid? Я в примерах вижу BoxId в виде строки без -, в вашем примере это guid, а диадок возвращает строку с @diadoc.ru, и где тут правда – не ясно. И в документации об этом ни слова.

Ошибка у меня сейчас "The 'BoxId' attribute is invalid - The value 'xxxxxxxxx@diadoc.ru' is invalid according to its datatype 'guid' - The Pattern constraint failed."

ethaniel commented 4 years ago

Видимо разработчики СКБ Контур ставят свое удобство превыше удобства своих пользователей. BoxId в XML = BoxIdGuid в json/protobuf. Если вы не хранили BoxIdGuid у себя, то попадос, придется синхронизировать вашу локальную базу с базой диадока еще раз.

OlgaPetushina commented 4 years ago

@denlapaev guid содержится в BoxId до @diadoc.ru, поэтому в коде вы можете получить гуид через Guid.Parse(), предварительно откинув часть @diadoc.ru.

Так же обращаю внимание, что во всех методах, где мы на вход требуем boxId, мы для поддержания обратной совместимости так же принимаем и boxId с @diadoc.ru

ethaniel commented 4 years ago

@OlgaPetushina

Вы лукавите:

@diadoc.ru не принимается вообще.

Line: 9, Position: 39, /UniversalTransferDocument[1]/Sellers[1]/Seller[1]/OrganizationReference[1]/@BoxId: The 'BoxId' attribute is invalid - The value '002868b606a247a68852f4af3fe6ba21@diadoc.ru' is invalid according to its datatype 'guid' - The Pattern constraint failed."

И нельзя просто взять и вырезать часть до @diadoc.ru тоже:

Line: 9, Position: 39, /UniversalTransferDocument[1]/Sellers[1]/Seller[1]/OrganizationReference[1]/@BoxId: The 'BoxId' attribute is invalid - The value '002868b606a247a68852f4af3fe6ba21' is invalid according to its datatype 'guid' - The Pattern constraint failed."
OlgaPetushina commented 4 years ago

я не говорила про контракты для генерации. я говорила про параметры в запросах. это не ваш кейс. соглашусь, что информация в контексте вопроса была лишней.