Coder Social home page Coder Social logo

diadocsdk-csharp's Introduction

Build Status
master Build status (master)
latest Build status (lastest)
nuget diadocsdk

diadocsdk-csharp

diadocsdk-csharp является официальной C#-реализацией клиента, использующего публичный API Диадока.

Для подключения diadocsdk-csharp к вашему проекту рекомендуется использовать nuget-пакет diadocsdk. Также можно скачать готовую сборку diadocsdk со страницы релизов.

Документация

Документация последней версии SDK доступна по ссылке: http://api-docs.diadoc.ru/.

Мы планируем освежить документацию. Если у вас после её прочтения остаются вопросы, пожалуйста, выскажитесь в соответствующей issue.

Примеры использования

Diadoc.Samples — примеры кода работы API с пояснениями.

Diadoc.Console — пример консольного приложения, с помощью которого можно получать и отправлять документы, читать события, устанавливать связи с контрагентами.

Сборка проекта

Для окончательной сборки проекта используется утилита Cake.

Запуск powershell-скрипта build.ps1 скачает утилиту Cake, если ее у вас нет, и запустит сборку проекта. Из командной строки этот скрипт можно запустить с помощью generate.bat.

Выполняется:

  • генерация версии на основе тега github
  • генерация C#-кода из proto-файлов
  • ILMerge (сборка protobuf-net включается в DiadocApi)
  • подписание сборки строгим именем (при наличии ключа diadoc.snk в папке src)
  • создание nuget-пакета

Добавление функциональности

  • Сделайте Fork
  • Создайте ветку для новой фичи (git checkout -b my-new-feature)
  • Сделайте Commit изменений (git commit -am 'Add some feature')
  • Сделайте Push новой ветки (git push origin my-new-feature)
  • Создайте новый Pull Request

diadocsdk-csharp's People

Contributors

alogicman avatar anatolidubko avatar asakyraz avatar asvyazin avatar atytsky avatar basmus avatar capucinimo avatar diadoc-admin avatar dmokhnatkin avatar drunkybard avatar einfoman avatar etwirt avatar fakefeik avatar flosca avatar gangstatracer avatar gnkoshelev avatar halex2005 avatar ichaynikov avatar iftruereturn avatar kiryakovskb avatar koheatel avatar ltitbe avatar mkayukov avatar rispele avatar slenik avatar thisisbuddyrich avatar tkirill avatar varenykhe avatar vladyslav-vasyliev avatar zharkovstas avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

diadocsdk-csharp's Issues

Создание и изменение пакетов документов.

Здравствуйте!

Вопрос такой: можно ли добавлять и удалять уже загруженные документы (созданные в Диадоке, т.е. есть EntityId) в пакет?

Или это возможно только при первоначальной выгрузке ?

Статус счет-фактуры

Здравствуйте.
По счет-фактуре в личном кабинете статус "Документооборот завершен", а по api приходит статус "OutboundNotFinished". Не подскажете, в чем может быть проблема?

Интеграция с Диадок

Добрый день коллеги!
Пожалуйста помогите с ориентироваться. Стоит задача интегрировать нашу систему (веб приложение, .Net (C#, ASP)) с системой Диадок для формирования документа и подписания.
На клиентской машине стоит КриптоПро CSP и сертификаты загруженны.
Мы для получения сертификата из хранилища использовали WinApiCrypt но система ищет сертификат (и ключи) на машине сервера.
Подскажите пожалуйста, как правильнее организовать, чтобы сертификат получить из хранилища на клиентской машине?
Заранее благодарен.

Формирование ЭД (ТОРГ-12, СФ) на стороне клиента

Здравствуйте, уважаемые разработчики!

К сожалению не нашёл иного способа общения с Вами на github - посему пишу сюда.

Имею на руках программный код, генерирующий из данных документы для ЭДО и отправляющий из контрагентам через Вашу систему.
Для генерации документов всегда требуется заполнить тэг СвУчДокОбр (или его аналог СвУчДокОбрСФ):

  <СвУчДокОбор ИдОтпр="ДАННЫЕ_ОТПРАВИТЕЛЯ" ИдПок="ДАННЫЕ_ПОЛУЧАТЕЛЯ">
    <СвОЭДОтпрСФ НаимОрг="ЗАО &quot;ПФ &quot;СКБ Контур&quot;" ИННЮЛ="6663003127" ИдЭДОСФ="2BM" />
  </СвУчДокОбор>

И тут вопрос:
сейчас для заполнения этого тэга при отправке документов приходится вызывать API несколько раз:

  • GetMyOrganizations - для получения своего ИдОтпр.
  • GetOrganizationByInnKpp с ИНН = 6663003127 - для получения Вашего НаимОрг и ИдЭДОСФ.
  • GetOrganizationByInnKpp с ИНН получателя - для получения ИдПок.

Можно ли как-нибудь уменьшить количество вызовов (например создать новую API-функцию GetParticipants(sessionId, myBoxId, counteragentInn, counteragentKpp), возвращающую данные сразу о трёх организациях - моей, Вашей и другой стороны)?
К тому же очень не хочется "костылять", держа захакрдкоденным Ваш ИНН.

получение ИНН, КПП и названия контрагента при скачивании документа

Уважаемые коллеги!
Скачиваю входящие документы через API (.NET). Хотелось бы при скачивании документа получить ИНН, КПП и название контрагента, данный документ приславшего.
Подскажите, какими функциями для этого воспользоваться.

Отображение содержания протобуфера

Как можно вывести содержимое протобуфера в консоль\файл?

          DocumentList documents = Api.GetDocuments(authToken, box, "AnyInvoiceDocumentType.Inbound", tobox, null, null, null, null,null,true,null);

            logger.Debug("Except{0}", documents, null);
            Console.Read();

пустая строка

GetDocument откуда взять entityId

при отправке счет фактуры получаю ид сообщения

 var response = Api.PostMessage(authToken, messageToPost);

пытаюсь получить

var invoiceDocument = Api.GetDocument(authToken, box, response.MessageId, null);

boxId: идентификатор ящика;
messageId: идентификатор сообщения, содержащего искомый документ;
entityId: идентификатор сущности типа LetterAttachment внутри сообщения messageId, представляющей искомый документ;

что за entityId? откуда его взять

Подпись Счет-Фактуры

Здравствуйте.

Как можно подписать счет-фактуру с доверенностью?

Например, в акте это можно сделать с помощью объекта Attorney.

Функция регистрации SendFnsRegistrationMessage

Cогласно вашей документации, подать заявку на участие возможно через функцию SendFnsRegistrationMessage .

"Отправка заявления участника ЭДО
При помощи метода SendFnsRegistrationMessage можно отправить заявление участника ЭДО."

Для интеграции мы используем предоставляемое SDK , вызов функции не генерирует никаких исключений. Как понять статус предоставления доступа по добавляемому сертификату? Видимые проблемы, которые могут повлиять на процесс.

  1. Регистрация происходит с задержкой, и надо как-то проверять статус . Вопрос тогда как ?
  2. Для теста мы используем ящик в вебинтерфейсе которого присутствует уведомление "Пилотный режим: передаваемые документы не являются юридически значимым"

Поддержка TAP в SDK

Добрый день.
Очень хочется увидеть поддержку TAP в SDK. Есть ли такое в планах?

Использование исключительно закрытых ключей

Вопрос по авторизации через сертификат и использовании ЭЦП. Библиотека установлена и зарегистрирована, импортированы COM-объекты в дельфи. Закрытые ключи установлены в КриптоПро, открытого ключа нет. Icomcryptapi.GetPersonalCertificates(true,false) находит сертификат, но

  1. iCertificateInfo(il.item(0)).thumbprint указывает на имя сертификата, а не на его отпечаток. Соответственно, полученная строка не подходит для авторизации ('Не обнаружен сертификат')
  2. забиваю вручную отпечаток. метод AuthenticateWithCertificate вылетает с неверной адресацией памяти.

При этом авторизация через логин-пароль работает без всяких вопросов.
Вытаскивать файл '.cer' из КриптоПро не вариант, с ним не работает точно так же.

Ошибка после обновления DiadocApi.dll

Добрый день!

Создавал приложение, которое использовало библиотеку для отправки документов в Вашу систему. Все работало до того как обновил DiadocApi.dll
Теперь система выдает ошибки при связи подписанного документа с непонятным сообщение об ошибки, можете пожалуйста помочь разобраться:
В строке 18 выходит ошибка : Параметр задан неверно.
Версия библиотеки последняя из релиза 1.36.2
До этого была версия : 1.23.0
И все работало.

  1. var message = new ActiveXObject("Diadoc.Api.MessageToPost");
    2
  2. message.FromBoxId = boxId;
  3. message.ToBoxId = boxId;
  4. var attachment = new ActiveXObject("Diadoc.Api. XmlDocumentAttachment "); //
  5. attachment.Comment = "тестовый сф";
  6. var content = new ActiveXObject("Diadoc.Api.SignedContent");
  7. content.LoadContentFromFile("ONSFAKT…xml"); // готовый xml-файл счета-фактуры
  8. crypt.Sign("ONSFAKT…xml ", certificateThumbprint, "signature");
  9. content.LoadSignatureFromFile("signature");
  10. attachment.SetSignedContent(content);
  11. message.AddAttachment(attachment);

Про поле NeedRecipientSignature и его появление в разных структурах

Вопрос по обращению, связанному с этим: некоторое время назад написал на почту поддержки Диадок №10991224 (т.к. в запросе присутствовали ID внутренних документов из абонентского ящика).

Суть вопроса:

При вызове API GetDocument для некоторой счёт-фактуры, отображаемой в веб-клиенте с отметкой "Требуется аннулирование", её RevocationStatus имеет значение RequestsMyRevocation

Однако, если после вызова API GetMessage для сообщения, в котором находится эта СФ, найти в ответе Entity, соответствующую связанному с ней предложению об аннулировании, то можно заметить: значение поля NeedRecipientSignature == false (то есть якобы предложение об аннулировании не требует ответной подписи, что очевидно неверно).

От менеджера мне пришёл Ваш ответ:

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

Проверил где данное поле встречается в документации http://api-docs.diadoc.ru/ru/latest/search.html?q=NeedRecipientSignature&check_keywords=yes&area=default#

  1. В описании структуры Entity сказано, что поле используется только для Attachment -> Nonformalized http://api-docs.diadoc.ru/ru/latest/proto/Entity%20message.html?highlight=needrecipientsignature
  2. В описании структуры NonformalizedAttachment сказано, что поле используется для требования подписи получателя под документом.
  3. В описании "как получить и отправить ТОРГ-12" это же поле приведено в ответе в пункте "Получение товарной накладной ТОРГ-12", хотя вроде как согласно (1) поле не имеет в этом случае смысла http://api-docs.diadoc.ru/ru/latest/howto/example_torg12.html?highlight=needrecipientsignature#id5
  4. Также поле встречается в описании AcceptanceCertificateAttachment, "Как отправить счёт-фактуру" и "Как получить счёт-фактуру".

Вопросы:

  1. Раз по факту указанное поле используется для многих (или для всех?) типов первичных документов, хорошо было бы поправить документацию, указав везде одно и то же.
  2. Что мешает Вам передавать актуальное значение данного документа для всех Entity, а не только для документов? (это уже к вопросу обращения №10991224). Так по крайней мере не пришлось бы во время загрузки API GetDocument лишний раз вызывать - хватило бы и данных ответа API GetMessage.

Регистрация DiadocApi для .NET 3.5

В readme файле написано что нужно регистрировать апи. В содержимом батника команды для версии .net 4. Нужно ли регистрировать для 3.5 и каким образом?

'Message" не содержит определения для "AttachmentId" и не удалось найти метод расширения "AttachmentId"

http://api-docs.diadoc.ru/ru/latest/howto/example_send_invoice.html

беру пример

           var invoiceReceipt = Api.GenerateInvoiceDocumentReceiptXml(authToken, invoiceDocument.MessageId, invoiceConfirmation.AttachmentId, signer);

            //отправка извещения
            var messagePatchToPost = new MessagePatchToPost
            {
                BoxId = boxId,
                MessageId = invoiceDocument.MessageId,
                Receipts =
                   {
                           new ReceiptAttachment
                           {
                                   ParentEntityId = invoiceDocument.EntityId,
                                   SignedContent = new SignedContent //файл подписи
                                   {
                                           Content = invoiceDocument.Content,
                                           Signature = new byte[0] //подпись продавца
                                   }
                           }
                   }
            };

и получаю Ошибка CS1061 'Message" не содержит определения для "AttachmentId" и не удалось найти метод расширения "AttachmentId", принимающий тип "Message" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)

Could not deserialize http response

Подскажите пожалуйста в чем может быть проблема?
При попытке авторизации выдается сообщение об ошибке.
Выход в интернет через прокси.

Could not deserialize http response
Request: POST /Authenticate
AdditionalHeaders:
Authorization: DiadocAuth ddauth_api_client_id= //здесь наш код разработчика
Response: 200 (OK)
ResponseHeaders:
Access-Control-Allow-Origin: *
Content-Length: 784
Date: Tue, 20 Sep 2016 07:35:30 GMT
Server: nginx
Content: [784]
0?� � *?H??
���??�?0?�?��

Определение требований подписи под указанной сущностью (Entity)

По аналогии с предыдущим вопросом об определении отправителя-получателя мне требуется для некоторой сущности (про которую известно только то, что она типа Attachment, и задана через пару messageId + entityId) максимально просто ответить на вопросы:

  1. Какие подписи существуют под указанной сущностью?
  2. Требуется ли подпись второй стороны под указанной сущностью?

Мой текущий алгоритм действий:

  1. Получаем Сообщение Диадок (далее diadocMessage) через API GetMessage.
  2. Находим среди Сущностей Сообщения Диадок нашу Сущность по её entityId (далее diadocEntity).
  3. Если найденная Сущность Диадок - Документ (спасибо вашему лайфхаку c ParentEntityId == null), то извлекаем diadocDocument = diadocEntity.DocumentInfo.
    • Смотрим diadocEntity.DocumentInfo - там, в зависимости от AttachmentType, лезем в нужное поле *Metadata. Например, в случае формализованной товарной накладной, смотрим XmlTorg12Metadata.DocumentStatus - из его значения (описание которых понятны по названию, - правда, отсутствуют в документации) легко понять и статус подписей, и есть ли ожидание подписи получателя.
  4. Если найденная Сущность Диадок - не Документ, то:
    • ищем в diadocMessage сущности, ParentEntityId которых равен diadocEntity.Id + определяем по SignerBoxId чьи это подписи.
    • ??? Как в таком случае определить, нужна ли под сущностью diadocEntity подпись получателя?

Крипто-API

Подскажите, что имеется ввиду под Крипто-API, предоставляемое операционной системой (доступно через класс WinApiCrypt) ? Где это находится, где скачать?

Статусы документа / документооборота

Здравствуйте.

Я пытаюсь получить статус документа. Выполнив метод api GetDocument, получаю у документа пустые статусы (почти все), в том числе ResolutionStatus. Хотя в Вашем приложении (https://diadoc.kontur.ru/) у этого документа статус "Отказано в подписи" и имеется история статусов с дополнительной информацией.

Что я делаю не так?
Какие есть способы получения статусов документа, статусов документооборота, истории статусов? Интересуют все возможные.

Не собирается проект

Добрый день!
Пытаюсь собрать проект, но выдаются ошибки. Лог работы скрипта приложил
BuildLog.docx
Ругается на Cryptography\StreamCrypt.cs(123,60): error CS1056: Unexpected character '$' [D:\Projects\diadocsdk-csharp-master\src\DiadocApi-net35.csproj]

В чем может быть проблема?

UnitCode, UnitName

Для формирования XML акта о выполнении работ заполняю структуру AcceptanceCertificateSellerTitleInfo. Дошел до WorkItem. В данной структуре есть поля UnitCode, UnitName. По аналогии со счет-фактурой, о заполнении которой в документации сказано следующее:
Коды единиц измерения InvoiceItem.Unit, коды стран происхождения товара InvoiceItem.CountriesOfOrigin, а также коды иностранных госудраств ForeignAddress.Country можно указывать в буквенном формате, тогда Диадок предпримет попытку сконвертироваить их в соответствующие числовые коды.
, заполняю поле UnitName. UnitCode оставляю пустым. При попытке формирования XML получаю Exception:
'BaseUrl=https://diadoc-api.kontur.ru, PathAndQuery=/GenerateAcceptanceCertificateXmlForSeller, AdditionalMessage=AcceptanceCertificateSellerTitleInfo.Works[0].Items[0].UnitCode is required when AcceptanceCertificateSellerTitleInfo.Works[0].Items[0].Name is filled, StatusCode=BadRequest, DiadocErrorCode: Http.BadRequest'
Если задать значение UnitCode, XML формируется без проблем. При этом содержимое поля UnitName ничего не меняет и не используется. Вопрос: Почему при составлении акта не работает преобразование буквенного формата в числовой как в счет-фактуре? И для чего тогда предназначено поле UnitName? В документации про это ничего не сказано.

Сделать интерфейсы для удобной работы с Вложениями Диадок

Приветствую!

Имею заполненную структуру SignedContent для некоторого Attachment'а + тип Attachment'а, который хочу отправить. Хочу добавить его в MessageToPost или MessagePatchToPost (в зависимости от очевидных условий).
Однако, поскольку в каждой сущности за добавление каждого типа Attachment'ов отвечает свой метод (который ещё и добавляет данные в соответствующий список), приходится городить примерно такой вот extension:

public static bool AddAttachment(this MessagePatchToPost diadocMessagePatch,
            AttachmentType diadocAttachmentType,
            SignedContent fileSignedContent, string diadocParentDocumentId)
        {
            try
            {
                // 1. Создаём нужную сущность под Документ + заполняем специфичные именно для указанного типа поля.
                IList correspondingMessageList;
                dynamic diadocAttachment;
                switch (diadocAttachmentType)
                {
                    case AttachmentType.Receipt:
                        diadocAttachment = new ReceiptAttachment
                        {
                            ParentEntityId = diadocParentDocumentId,
                        };
                        correspondingMessageList = diadocMessagePatch.Receipts;
                        break;

                    case AttachmentType.XmlTorg12BuyerTitle:
                        diadocAttachment = new ReceiptAttachment
                        {
                            ParentEntityId = diadocParentDocumentId,
                        };
                        correspondingMessageList = diadocMessagePatch.XmlTorg12BuyerTitles;
                        break;
                    case AttachmentType.XmlSignatureRejection:
                        diadocAttachment = new XmlSignatureRejectionAttachment
                        {
                            ParentEntityId = diadocParentDocumentId,
                        };
                        correspondingMessageList = diadocMessagePatch.XmlSignatureRejections;
                        break;
                    case AttachmentType.InvoiceCorrectionRequest:
                        diadocAttachment = new CorrectionRequestAttachment
                        {
                            ParentEntityId = diadocParentDocumentId,
                        };
                        correspondingMessageList = diadocMessagePatch.CorrectionRequests;
                        break;
                    default:
                        return false;
                }
                // 2. Заполняем поля Документа по запросу с предыдущего шага.
                diadocAttachment.SignedContent = fileSignedContent;
                correspondingMessageList.Add(diadocAttachment);
                return true;
            }
            catch (Exception e)
            {
                // Структура объектов изменилась с момента написания кода?
                return false;
            }
        }

(код добавления к Message ещё более витиеватый из-за большего количества типов Attcahment'ов)

Вопрос: может сделаете в коде Diadoc SDK набор интерфейсов, группирующих документы по их типам и наличию-отсутствию определённых полей?
Например чтобы интерфейс IDiadocAttachment реализовывали все Attachment'ы; его уточнение IDiadocAttachmentWithCustomDocumentId давало доступ к полю CustomDocumentId Attachment'а (разумеется, если объект его реализует).
Тогда и dynamic использовать не потребуется, и метод AddAttachment со значительно меньшим количеством срок кода можно будет внести в классы MessageToPost и MessagePatchToPost.

Использование метода Recognize для счетов-фактур

Добрый день коллеги,
Наша компания очень хотела бы использовать функционал вашего API, связанный с распознаванием документов:
http://api-docs.diadoc.ru/ru/latest/MiscellaneousApiFeatures.html?highlight=recognize

В настоящий момент я сформировал xps файл (во вложении) на базе PDF файла, который, в свою очередь был сформирован непосредственно из Контур Диадок.
Запустил процедуру распознавания для этого файла.

recognitionId = «49e0e139-3115-436e-a7f4-c64cc69ca1dd»

Результат распознавания, насколько я могу судить отрицательный:
RecognizedSuccessfully = “False”
ErrorMessage = “Sequence contains no elements”
DocumentType = “UnknownRecognizedDocumentType”

Не могли бы вы подсказать, в чем причина?

С уважением
Евгений

Определение отправителя и получателя любой сущности (Entity)

Приветствую уважаемых разработчиков!

Пусть имеется MessageId + EntityId некоторой сущности.
Вопрос: как правильно определить направление (входящая она или исходящая) и кто контрагент (другая сторона документооборота)?

Сейчас я делаю запрос GetMessage по MessageId, далее смотрю на EntityType + AttachmentType сущности и действую в соответствии с ними.
Для краткости IsOurBox(boxId) - true если мы отправитель (boxId совпадает с нашим)

EntityType AttachmentType Как определить контрагента и направление
Signature любой entity.SignerBoxId != "[email protected]" => direction = IsOurBox(entity.SignerBoxId) ? Outgoing : Incoming
Attachment XmlTorg12 or Torg12 or Invoice or InvoiceRevision or InvoiceCorrection or Nonformalized direction = IsOurBox(GetDocument(..., MessageId, EntityId).CounteragentBoxId) ? Outgoing : Incoming

Вопросы:

  1. Как получить данные контрагента для исходящих сущностей типа Attachment (CounteragentBoxId в этом случае содержит адрес ящика отправителя - то есть наш)?
  2. Как определить направление и контрагента для сущностей типа Attachment, которые не умеет обрабатывать GetDocument, в первую очередь для XmlTorg12BuyerTitle, RevocationOffer и XmlSignatureRejection?

Подписание формализованной счета-фактуры со стороны покупателя.

При подписании формализованной счет-фактуры со стороны покупателя, для продавца устанавливается статус "Ожидается извещение о получении" и не переходит в статус "Документооборот завершен".

При заходе(просмотре) через ВЕБ-интерфейс в этот документ, статус автоматически меняется на "Документооборот завершен". Что собственно и нужно.

Вопрос: в чем может быть проблема ? Что еще нужно вызвать на строне покупателя, что бы статус изменился на "Документооборот завершен".

Спасибо.

какой минимально допустимый вариант отправки?

private static GeneratedFile GenerateinvoiceXml(string authToken)
{
    var certContent = ReadFileContent(FileWithCertName);

    var signer = new Signer
    {
        SignerCertificate = certContent
    };

    var content = new InvoiceInfo()
    {
        // заполняем согласно структуре InvoiceInfo
        InvoiceDate = DateTime.Now.ToString(),                    // дата СФ
        InvoiceNumber = "aaa",                  // номер СФ
        Signer = signer,
        Total = "1000"
    };
    return Api.GenerateInvoiceXml(authToken, content);
}

Проблема при заполнении InvoiceItem.Unit в Delphi

Добрый день.
Импортировал библиотеку в качестве COM объекта в Delphi 7.0. Получил исходник DiadocApi_TLB.
Подключение, регистрация, все работает. Пытаюсь сформировать XML для счет-фактуры.
Во время выполнения GenerateInvoiceXml получаю ошибку: "Method 'Unit_' not supported by automation object". Т.е. не получается указать единицы измерения для строк счет-фактуры. Код заполнения данных строки следующий:
Item := TInvoiceItem.Create(Self); Item.Product := 'Электроэнергия'; Item.Unit_ := 'кВт.ч'; Item.Quantity := '1000'; Item.Price := '2.00'; Item.SubtotalWithVatExcluded := '2000'; Item.TaxRateValue := 3; Item.Vat := '360'; Item.SubTotal := '2360';
Если закомментировать строку
// Item.Unit_ := 'кВт.ч';
XML успешно формируется, но вместо единиц измерения в счет-фактуре получаем прочерк. Помогите разобраться с проблемой.

Утверждение аннулирования

Добрый день.
В продолжении вопроса: #57

Были даны рекомендации:

Подтверждение аннулирования - это подпись под запросом на аннулирование. Нужно использовать метод AddSignature и класс DocumentSignature . Предварительно нужно получить контент запроса на аннулирование (например, при помощи GetMessage) и подписать его

Подписали полученный файл предложения об аннулировании и отправили с помощью этого метода и класса. При отправке ошибок нет. Но в ящике говорит: Ошибка при аннулировании документа -

Подписанные данные были искажены после момента подписания.
Проверяю подпись под полученным файлом аннулирования на сайте госсуслуг - ошибок нет.
Метод AddSignature и класс DocumentSignature использовали для утверждения неформализованных документов и таких ошибок не встречали.

нужен diadocapi.dll

Добрый день.
Нужно получить diadocapi.dll.
Для этого скопировал файлы diadocsdk-csharp на диск и запускаю generate.bat.
Выскакивает ошибка:
& : Имя ".\build.ps1" не распознано как имя командлета, функции, файла сценария
или выполняемой программы. Проверьте правильность написания имени, а также нал
ичие и правильность пути, после чего повторите попытку.
строка:1 знак:3

  • & '.\build.ps1'
  • CategoryInfo : ObjectNotFound: (.\build.ps1:String) [], Command
    NotFoundException
  • FullyQualifiedErrorId : CommandNotFoundException

Что нужно сделать? Как получить DiadocApi.dll чтобы потом ее использовать для интеграции в нашей erp системе?

[Questions] Ещё одни вопросы по SDK

Здравствуйте.

  1. Есть такая штука как Entity.Content. Когда его скачиваешь - это какой-то сериализованый protobuf'ом массив байтов. Какому типу/типам в SDK он соответствует? Есть потребность его десериализовать и получить некоторые данные. (В моём случае имя/должность и др. реквизиты подписавшего входящий документ человека)

  2. В документации http://api-docs.diadoc.ru/ru/latest/http/SearchDocflows.html указано, что можно использовать формат

ключ: значение

Ни одна попытка выполнить запросы типа

Inn: <кучацифр>

или

ИНН: <кучацифр>

не возымела успеха. С кавычками/без, с пробелом/без или другими комбинациями. В то время как обычный запрос

<кучацифр>

выдавал некоторые осмысленные "околонужные" результаты.
Не смог понять фразу из документации:

В выдачу попадают документы, которые содержат указанную пару “ключ-значение” среди пользовательских данных, привязанных к документу.

Таки какие значения может принимать Key?
3. Есть такой класс DocumentsFilter, используется в методе sdk GetDocuments, у него есть св-во DocumentNumber, на что оно влияет при фильтрации? Поскольку перегруженный метод GetDocuments, принимающий DocumentsFilter в качестве параметра, при заданном только DocumentNumber (включая, разумеется необходимые данные, такие как BoxId, FilterCategory etc.) возвращает все документы подряд.
На скрине ниже видно что я имею ввиду. Какой фильтр задаётся и что в получено результате. Могу гарантировать, что в ящике нет 9 тыс. документов с заданным DocumentNumber.

Скрин

image

Спасибо.

Статусы документов

Подскажите, в каком поле хранятся статусы документов? В частности формализованных актов, накладных, счет-фактур. Как узнать текущий статус документа?

В экземпляре объекта не задана ссылка на объект

    public static GeneratedFile GenerateinvoiceXml(string authToken, string box, string tobox)
    {
        try
        {
            var content = new InvoiceInfo()
            {
                InvoiceDate = "31.01.2016",                    // дата СФ
                InvoiceNumber = "11-012016-2410000000",                  // номер СФ
                Seller = {
                BoxId = box
            },
                Buyer = {
                BoxId = tobox
            },
                Signer = {
                SignerCertificate = ReadFileContent(FileWithCertName)
            },

                PaymentDocuments =   {
                    new PaymentDocumentInfo
                    {
                           DocumentDate = "08.08.2016",
                           DocumentNumber = "№00243015140"
                    }
            },
                Items = {
                new InvoiceItem
                {
                    Product = "Горячая вода (компонент на тепловую энергию). Прочие",
                    CountriesOfOrigin = { "23", "3243" } ,
                    CustomsDeclarationNumbers = { "3243"},
                    TaxRate =  TaxRate.Fraction_10_110,
                    Subtotal = "321231"
                }
            },
                AdditionalInfos = {
                new AdditionalInfo
                {
                    Id = "2312321",
                    Value = "32423423"
                }
            },
                Total = "1000"
            };
            return Api.GenerateInvoiceXml(authToken, content);
        }
        catch (Exception e)
        {

            logger.Debug("Except{0}", e, null);
            Console.Read();
            return null;
        }
    }

получаю diadoc_cnsl.Program.GenerateinvoiceXml Debug: ExceptSystem.NullReferenceException: В экземпляре объекта не задана ссылка на объект.

приведите пример InvoiceInfo

как заполнять этот метод?

    private GeneratedFile GenerateinvoiceXml(string authToken)
    {
        var content = new InvoiceInfo()
        {
            // заполняем согласно структуре InvoiceInfo


        };
        return Api.GenerateInvoiceXml(authToken, content);
    }

Ошибка при инициализации DiadocHttpApi

по примеру http://api-docs.diadoc.ru/ru/latest/howto/example_authorization.html

using System.Windows.Forms;
using System.Security.Cryptography.X509Certificates;
using Diadoc.Api;
using Diadoc.Api.Cryptography;
using Diadoc.Api.Http;

namespace diadoc
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// Можно использовать либо аутентификацию по логину/паролю, либо по сертификату
var authTokenLogin = Api.Authenticate(DefaultLogin, DefaultPassword); // по паре логин/пароль
var authTokenPassword = Api.Authenticate(ReadCertContent(DefaultPathToCert)); // по сертификату
}

    // URL веб-сервиса Диадок
    private const string DefaultApiUrl = "https://diadoc-api.kontur.ru";

    // идентификатор клиента
    private const string DefaultClientId = "*****";

    // Для использования Диадок требуются:
    // 1. Крипто-API, предоставляемое операционной системой (доступно через класс WinApiCrypt)
    // 2. Экземпляр класса DiadocApi, проксирующий работу с веб-сервисом Диадок
    private static WinApiCrypt Crypt = new WinApiCrypt();
    public static readonly DiadocHttpApi Api = new DiadocApi(
            DefaultClientId,
            new HttpClient(DefaultApiUrl),
            Crypt);

    // Логин для авторизации на сервере Диадок

    private const string DefaultLogin = "***";

    // Пароль для авторизации на сервере Диадок
    private const string DefaultPassword = "***";

    // Путь к сертификату для авторизации на сервере Диадок        
    public const string DefaultPathToCert = "**";

    // Для авторизации по сертификату необходимо сертификат преобразовать в массив байтов
    public static byte[] ReadCertContent(string pathToCert)
    {
        var cert = new X509Certificate(pathToCert);
        return cert.Export(X509ContentType.Cert);
    }

}

}

получаю ошибку

Ошибка CS1503 Аргумент 2: не удается преобразовать из "Diadoc.Api.Http.HttpClient" в "string".

Использование клиента Diadoc + ЭЦП в Windows-службе, запущенной в домене

Приветствую, уважаемые разработчики!

Некоторое время назад нам потребовалось сделать службу Windows, которая бы выполняла автоматические действия по обработке документов (в частности, автоподпись уведомления о получении).
Запускать службу нам надо из-под доменной учёной записи - однако выяснилось, что из-под неё нельзя инициализировать работу с ЭЦП (откопали такую вот статью https://blogs.msdn.microsoft.com/alejacma/2011/05/19/scardestablishcontext-fails-with-scard_e_no_service-error/).
Переписанное в статье решение под C# не сработало (ошибка при взаимодействии управляемого и неуправляемого кода).
В общем сейчас приходится запускать службу как консольное приложение в автозапуске (огромный костылище); в планах отдельная служба для работы с ЭЦП, запускаемая с учёткой LocalService + взаимодействие с ней через WCF Named Pipe другой службы с доменного аккаунта (костыль, но уже поменьше). Или реализация отдельной службы, которая бы при старте давала права на взаимодействие нашей службе (т.е. решение из статьи).

Подскажите, имеете ли Вы более изящное решение данной проблемы?

Проблемы со скачиванием документов

Здравствуйте, уважаемые!
Пытаюсь скачать документы нижеприведенным образом, однако это удается только в редких случаях. В основном выдается ошибка

Ошибка 404:Не найден

try
{
  var org = Api.GetMyOrganizations(authTokenLogin);
  Diadoc.Api.Proto.Documents.IDocumentZipGenerationResult doc = null;

  doc = Api.GenerateDocumentZip(authTokenLogin, org.Organizations[0].Boxes[0].BoxId,  dataGridView3.Rows[ind].Cells["MesID"].Value.ToString(), dataGridView3.Rows[ind].Cells["ID"].Value.ToString(), false);         

var file = Api.GetFileFromShelf(authTokenLogin, doc.ZipFileNameOnShelf);
saveFileDialog1.FileName = dataGridView3.Rows[ind].Cells["doc"].Value.ToString(); //+ ".zip";

                if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    if (saveFileDialog1.FileName != "")
                    {
                        File.WriteAllBytes( saveFileDialog1.FileName + ".zip", file);
                        MessageBox.Show("Документ заархивирован и загружен");                    
                    }
                }         

            }
            catch (Diadoc.Api.Http.HttpClientException ex)
            {
                MessageBox.Show(ex.InnerException.Message.ToString(), "Ошибка загрузки файла", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

в таблице dataGridView3 выводится список документов при помощи метода GetDocuments. Предполагал сначала, что дело в ID документа:
Diadoc.Api.Proto.Documents.DocumentList.Documents[i].EntityId
Однако теперь уже думаю, что проблема в самих документах. Подскажите, пожалуйста, куда копать?
P.S. Если выводить имена файлов проблемных документов, то они пустые, т.е. проблема возникает еще на этапе GenerateDocumentZip

Несколько вопросов по использованию Diadoc API на C#

Здравствуйте, уважаемые сотрудники техподдержки.
Подскажите, пожалуйста, есть ли возможность через API (C#) при запросе списка контрагентов или списка документов выводить сразу все, т.е. не по 100 позиций в списке, а единовременным запросом все сразу? Если нет, то можно ли как-то узнать общее кол-во этих позиций, чтобы вывести их в цикле по 100 (максимум) штук?
И еще вопрос по поводу загрузки документа в черновики. Использую метод UploadFileToShelf для этого, но после его успешного выполнения, в веб-интерфейсе в черновиках загруженного документа нет. Возможно, данный метод нужно использовать в совокупности с чем-либо еще?
Заранее благодарен.

Утверждение аннулирования

Добрый день.
Подскажите пожалуйста по поводу утверждения аннулирования документов. Какой метод класса MessagePatchToPost нужно использовать и какой класс атачмента. Отклонение аннулирования работает без проблем. Утвердить не удается.
Пробуем использовать метод AddReceipt и класс Diadoc.Api.ReceiptAttachment.

Сейчас ошибки:

При утверждении аннулирования продавцом:
DiadocApi: BaseUrl=https://diadoc-api.kontur.ru, PathAndQuery=/V3/PostMessagePatch?operationId=, AdditionalMessage=Команда AddCommonReceipt не поддерживается документом 70a8e9e1-67ac-437b-9b13-056bdc5

При утверждения аннулирования покупателем:
DiadocApi: BaseUrl=https://diadoc-api.kontur.ru, PathAndQuery=/V3/PostMessagePatch?operationId=, AdditionalMessage=Некорректная ссылка на родительский файл, StatusCode=BadRequest, DiadocErrorCode: Doc

как получить документы?

Добрый день!
Разбираюсь с вашим API. Хочу получить список подписанных входящих счетов фактур (всех). Делаю следующим образом:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim DefaultApiUrl As String
Dim DeveloperKey As String
Dim Crypt As WinApiCrypt
Dim MyApi As DiadocApi
Dim MyLogin As String
Dim MyPassword As String
Dim MyTokenLogin As String
Dim filterCategory As Object
Dim documents As Diadoc.Api.Proto.Documents.DocumentList

Try
DefaultApiUrl = "https://diadoc-api.kontur.ru"
DeveloperKey = "ключ разработчика"
MyLogin = "логин"
MyPassword = "пароль"

Crypt = New WinApiCrypt
MyApi = New DiadocApi(DeveloperKey, DefaultApiUrl, Crypt)

MyTokenLogin = MyApi.Authenticate(MyLogin, MyPassword)
'MsgBox(MyTokenLogin, MsgBoxStyle.OkOnly, "Information")

filterCategory = "AnyInvoiceDocumentType.InboundFinished"

documents = MyApi.GetDocuments(MyTokenLogin, filterCategory)

Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Error")
End Try
End Sub

Аутентификация проходит, в итоге получаю пустой список. Что не так?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.