Open ArtMooStyle opened 2 years ago
На вид так то все правильно вроде, покажите xml. может у вас в контенте ошибка?
Diadoc SDK 2.9.26 версия установлена на текущий момент
У меня 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());`
Посмотрите следующее:
Мы отправляем var typeNamedId = "UniversalCorrectionDocument"; // строковый идентификатор типа УКД var function = "КСЧФДИС"; // функция, представляющая УКД как корректировочный счёт-фактуру var version = "ucd736_05_01_02"; // версия, отвечающая за то, что документ сформирован в формате приказа №736
Если мы установим function = "КСЧФ" то документ будет отправлен, однако нам нужна именно КСЧФДИС
у меня тоже КСЧФДИС, отправляется.
Спасибо проблема решена - ошибка все таки была при формировании xml
Спасибо проблема решена - ошибка все таки была при формировании xml
Что не так с xml? Валидацию проходит, изменение в сумме есть, все должно быть хорошо. Разве только кодировка при передаче от КИС в модуль....
Спасибо проблема решена - ошибка все таки была при формировании xml
А можно попробовать вспомнить детали решения? Я вот до сих пор не могу побороться...
Что не получается, поподробнее. XML отправляете? XML приложите, да и код наверное тоже будет не лишний
При создании документа UniversalCorrectionDocument с функцией КСЧФДИС получаю ошибку Код отправки, генерации документа
` var authToken = diadocApi.Authenticate(companyDiadocSettings.Username, companyDiadocSettings.Password); var typeNamedId = "UniversalCorrectionDocument"; // строковый идентификатор типа УКД var function = "КСЧФДИС"; // функция, представляющая УКД как корректировочный счёт-фактуру var version = "ucd736_05_01_02"; // версия, отвечающая за то, что документ сформирован в формате приказа №736
` Ошибка
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.TaskFactory
1.FromAsyncCoreLogic(IAsyncResult iar, Func2 endFunction, Action
1 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, Func
2 convertResponse, HttpStatusCode[] allowStatusCodes) at`