diadoc / diadocsdk-csharp

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

Ошиибка создания UniversalCorrectionDocument функция КСЧФДИС #981

Open ArtMooStyle opened 2 years ago

ArtMooStyle commented 2 years ago

При создании документа UniversalCorrectionDocument с функцией КСЧФДИС получаю ошибку Код отправки, генерации документа

` var authToken = diadocApi.Authenticate(companyDiadocSettings.Username, companyDiadocSettings.Password); var typeNamedId = "UniversalCorrectionDocument"; // строковый идентификатор типа УКД var function = "КСЧФДИС"; // функция, представляющая УКД как корректировочный счёт-фактуру var version = "ucd736_05_01_02"; // версия, отвечающая за то, что документ сформирован в формате приказа №736

        var generatedTitle = diadocApi.GenerateTitleXml(
                                authToken,
                                companyDiadocSettings.BoxId,
                                typeNamedId,
                                function,
                                version,
                                0,
                                attachment.Content);

                    var messageToPost = new MessageToPost
        {
            FromBoxId = companyDiadocSettings.BoxId,
            ToBoxId = record.ToBoxId,
        };

        var documentAttach = new DocumentAttachment
        {
            TypeNamedId = typeNamedId,
            Function = function,
            Version = version,
            NeedRecipientSignature = true,
            NeedReceipt = true,
            SignedContent = new SignedContent
            {
                Content = content,
                Signature = CreateSignature("diadoc_ucd-create", content, companyDiadocSettings)
            },
            CustomDocumentId = record.DocumentNumber
        };
        messageToPost.DocumentAttachments.Add(documentAttach);
        await diadocApi.PostMessageAsync(authToken, messageToPost);  //--> тут падает и ошибкой

` Ошибка

Diadoc.Api.Http.HttpClientException: BaseUrl=https://diadoc-api.kontur.ru, PathAndQuery=/V3/PostMessage?operationId, AdditionalMessage=MessageToPost.DocumentAttachments[0]: Документ не может быть отправлен в указанном формате, StatusCode=BadRequest, DiadocErrorCode: DocumentService.InvalidFileContent ---> System.Net.WebException: The remote server returned an error: (400) Bad Request. at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult) at System.Net.WebRequest.<>c.b__68_2(IAsyncResult iar) at System.Threading.Tasks.TaskFactory1.FromAsyncCoreLogic(IAsyncResult iar, Func2 endFunction, Action1 endAction, Task1 promise, Boolean requiresSynchronization) --- End of stack trace from previous location where exception was thrown --- at Diadoc.Api.Http.HttpClient.PerformHttpRequestAsync(HttpRequest request, HttpStatusCode[] allowedStatusCodes) --- End of inner exception stack trace --- at Diadoc.Api.Http.HttpClient.PerformHttpRequestAsync(HttpRequest request, HttpStatusCode[] allowedStatusCodes) at Diadoc.Api.DiadocHttpApi.PerformHttpRequestAsync[TResponse](String token, String method, String queryString, Byte[] requestBody, Func2 convertResponse, HttpStatusCode[] allowStatusCodes) at`

yudinvs1 commented 2 years ago

На вид так то все правильно вроде, покажите xml. может у вас в контенте ошибка?

ArtMooStyle commented 2 years ago

Diadoc SDK 2.9.26 версия установлена на текущий момент

yudinvs1 commented 2 years ago

У меня 2.9.0, вот кусок кода, который получает на вход класс upd (по сути текст xml и некоторые доп поля для поиска ящиков) и отправляет. Может поможет. Контент вроде норм, код вроде тоже похож.

` var crypt = new WinApiCrypt(); var diadocApi = new DiadocApi(мойид, @"https://diadoc-api.kontur.ru", crypt);

        var authTokenByCertificateThumbprint = diadocApi.Authenticate(upd.cer.Thumbprint);
        var organisations = diadocApi.GetMyOrganizations(authTokenByCertificateThumbprint);
        Diadoc.Api.Proto.Box myBox = null;
        Diadoc.Api.Proto.Box ClientBox = null;
        Diadoc.Api.Proto.Organization myOrganisation = null;
        Diadoc.Api.Proto.Organization ClientOrganisation = null;
        foreach (Diadoc.Api.Proto.Organization org in organisations.Organizations)
        {

            if (org.Inn == upd.SenderINN)
            {
                myBox = org.Boxes[0];
                myOrganisation = org;
                break;
            }
        }

        if (myBox == null) return "В контуре не найден ящик для ИНН фирмы " + upd.SenderINN;

        var f1 = diadocApi.GetCounteragents(authTokenByCertificateThumbprint, myOrganisation.OrgId, "IsMyCounteragent", "", upd.RecipientINN);
        foreach (Diadoc.Api.Proto.Counteragent cnt in f1.Counteragents)
        {

            if (cnt.Organization.FnsParticipantId.ToLower().Replace("-","") == upd.ClientID.ToLower().Replace("-", ""))
            {

                ClientBox = cnt.Organization.Boxes[0];

                ClientOrganisation = cnt.Organization;
                break;
            }
        }

        if (ClientBox == null) return "В контуре не найден ящик для ИНН контрагента " + upd.RecipientINN;
        string Drid = Guid.NewGuid().ToString();

        var messageToPost = new MessageToPost
        {
            FromBoxId = myBox.BoxIdGuid,
            ToBoxId = ClientBox.BoxIdGuid
        };

        var typeNamedId = "UniversalTransferDocument"; // строковый идентификатор типа УПД
        var function = "СЧФДОП"; // функция, представляющая УПД как счёт-фактуру
        var version = "utd820_05_01_02_hyphen"; // версия, отвечающая за то, что документ сформирован в формате приказа №820

        if (upd.KSV) //Это корректировка
        {
            typeNamedId = "UniversalCorrectionDocument"; // строковый идентификатор типа УКД
            function = "КСЧФДИС"; // функция, представляющая УПД как корректировочную счёт-фактуру
            version = "ucd736_05_01_02"; // версия, отвечающая за то, что документ сформирован в формате приказа №736

        }
        var content = Encoding.GetEncoding("windows-1251").GetBytes(upd.xDoc.OuterXml);

        var signature = crypt.Sign(content, upd.cer.RawData);

        if (simultaion)
        {
            signature = null;
        }

        var documentAttachment = new DocumentAttachment
        {

            TypeNamedId = typeNamedId,
            Function = function,
            Version = version,

            // Теперь передадим сам файл УПД и сформированную к нему подпись:
            SignedContent = new SignedContent
            {
                Content = content,
                Signature = signature
            },

            Comment = "",
            CustomDocumentId = "",

        };

        messageToPost.DocumentAttachments.Add(documentAttachment);

        if (simultaion)
        {
            messageToPost.IsDraft = true;
        }

        Guid g = Guid.NewGuid(); //Здесь нам нужен operationid
        var response = diadocApi.PostMessage(authTokenByCertificateThumbprint, messageToPost, g.ToString());`
ArtMooStyle commented 2 years ago

Посмотрите следующее:

  1. Мы отправляем var typeNamedId = "UniversalCorrectionDocument"; // строковый идентификатор типа УКД var function = "КСЧФДИС"; // функция, представляющая УКД как корректировочный счёт-фактуру var version = "ucd736_05_01_02"; // версия, отвечающая за то, что документ сформирован в формате приказа №736

  2. Если мы установим function = "КСЧФ" то документ будет отправлен, однако нам нужна именно КСЧФДИС

yudinvs1 commented 2 years ago

у меня тоже КСЧФДИС, отправляется.

ArtMooStyle commented 2 years ago

Спасибо проблема решена - ошибка все таки была при формировании xml

yudinvs1 commented 2 years ago

Спасибо проблема решена - ошибка все таки была при формировании xml

Что не так с xml? Валидацию проходит, изменение в сумме есть, все должно быть хорошо. Разве только кодировка при передаче от КИС в модуль....

relum commented 1 year ago

Спасибо проблема решена - ошибка все таки была при формировании xml

А можно попробовать вспомнить детали решения? Я вот до сих пор не могу побороться...

yudinvs1 commented 1 year ago

Что не получается, поподробнее. XML отправляете? XML приложите, да и код наверное тоже будет не лишний