Как работать с предопределённым титулом получателя

Классическая схема обмена двухтитульными документами выглядит так: отправитель готовит титул (отправителя, продавца, первый), подписывает его и отправляет вместе с подписью получателю.

В свою очередь, получатель готовит ответный титул (получателя, покупателя, второй), и также подписывает и отправляет его вместе с подписью.

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

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

Узнать версию типа, которая поддерживает такую отправку, можно через метод GetDocumentTypes (поле SupportsPredefinedRecipientTitle = true).

Сейчас отправить документ с двумя титулами сразу можно через шаблоны:

var senderTitle = File.ReadAllBytes("C:\\path\\to\\sender\\title.xml");
var recipientTitle = File.ReadAllBytes  ("C:\\path\\to\\recipient\\title.xml");

var documentAttachmentWithTwoTitles = new TemplateDocumentAttachment
  {
    // Указать тип, для версии которого разрешен предопределённый титул покупателя
    // Саму версию явно можно не указывать, т.к. она должна быть указана  под узлом ВерсФорм в XML.
    TypeNamedId = "typenamedid",
    UnsignedContent = new UnsignedContent
    {
      Content = senderTitle
    },
    PredefinedRecipientTitle = new PredefinedRecipientTitle
    {
      UnsignedContent = new UnsignedContent
      {
        Content = recipientTitle
      }
    }
  };

var templateToPost = new TemplateToPost
  {
    FromBoxId = fromBoxId,
    ToBoxId = toBoxId,
    MessageFromBoxId = messageFromBoxId,
    MessageToBoxId = messageToBoxId,
    DocumentAttachments = {documentAttachmentWithTwoTitles}
  };

var template = api.PostTemplate(authToken, templateToPost);

Далее получатель превращает шаблон в документ:

var templateDocumentToTransform = template
    .Entities
    .FirstOrDefault(e => e.DocumentInfo.TypeNamedId == "typenamedid");

var transformationToPost = new TemplateTransformationToPost
  {
    BoxId = toBoxId,
    TemplateId = template.MessageId,
    DocumentTransformations =
    {
      new DocumentTransformation
        {
          DocumentId = templateDocumentToTransform.EntityId
        }
    }
  };

  api.TransformTemplateToMessage(authToken, transformationToPost);

После превращения документу требуется подпись, чтобы дойти до получателя. Отправитель документа (messageFromBoxId) генерирует подпись и отправляет к своему титулу:

var senderTitleContent = message
        .Entities
        .FirstOrDefault(e => e.EntityId == documentId)
        .Content;

var signatureForSenderTitlePatch = new MessagePatchToPost
{
        Signatures =
        {
                new DocumentSignature
                {
                        ParentEntityId = documentId;
                        Signature = crypt.Sign(senderTitleContent.Data, senderCertificateContent)
                }
        }
};

Нужные entityId сущностей титулов отправителя и получателя можно получить через метод GetMessage.

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

var recipientTitleContent = message
        .Entities
        .FirstOrDefault(e => e.EntityId == recipientTitleEntityId)
        .Content;

var signatureForRecipientTitlePatch = new MessagePatchToPost
{
        Signatures =
        {
                new DocumentSignature
                {
                        ParentEntityId = documentId;
                        Signature = crypt.Sign(recipientTitleContent.Data, recipientCertificateContent)
                }
        }
};

api.PostMessagePatch(authToken, signatureForRecipientTitlePatch);