Предопределенный титул получателя

Схема обмена двухтитульными документами подразумевает, что

  • отправитель готовит первый титул документа, подписывает его и отправляет вместе с подписью получателю,

  • получатель готовит ответный титул, подписывает и отправляет его вместе с подписью отправителю.

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

Не все версии документов поддерживают такую схему работы. Узнать, доступен ли предопределенный титул получателя для выбранного типа документа, функции и версии можно из ответа метода GetDocumentTypes (V2): информация хранится в поле DocumentTypeDescriptionV2.Functions[].Versions[].SupportsPredefinedRecipientTitle. Инструкция о получении данных из метода GetDocumentTypes приведена на странице Получение информации о типе документа.

Отправить документ с двумя титулами можно через шаблон.

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

Ниже приведен пример кода на C# с использованием SDK для работы с предопределенным титулом получателя.

  1. Отправитель создает шаблон

    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);
    
  2. Отправитель создает документ из шаблона

    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);
    
  3. Отправитель генерирует подпись и прикрепляет ее к своему титулу.

    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 (V5) или GetMessage (V6).

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

  4. Получатель генерирует подпись и прикрепляет ее к своему титулу.

    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);