Подписание документов

Для подписания документов используйте действие Sign в качестве аргумента метода PatchTask.AddToPatch().

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

Так как документы могут быть однотитульными и двухтитульными, то при подписании входящих документов может понадобиться заполнить разные типы ответов.

Процедура ЗаполнитьОбычнуюПодпись(dd_DocumentBase, dd_AcceptanceToSend, dd_PowerOfAttorney)
    // Здесь может быть какая-то ещё логика по обработке dd_DocumentBase
    dd_AcceptanceToSend.PowerOfAttorneyToAttach.PowerOfAttorney = dd_PowerOfAttorney;
КонецПроцедуры


Процедура ЗаполнитьВторойТитул(dd_DocumentBase, dd_RecipientTitleToSend, dd_PowerOfAttorney)
    TFV = dd_DocumentBase.TypeInfo.TypeId;

    Если "UniversalTransferDocument" = TFV.Type
        И "СЧФДОП" = TFV.Function
        И "utd970_05_03_01" = TFV.Version Тогда
        ЗаполнитьТитулПолучателяУПД970(dd_RecipientTitleToSend.Content,
                                       dd_DocumentBase.Organization.MyEmployee.SessionInfo.Certificate.Thumbprint);
    КонецЕсли;

    dd_RecipientTitleToSend.PowerOfAttorneyToAttach.PowerOfAttorney = dd_PowerOfAttorney;
КонецПроцедуры


Процедура ЗаполнитьДанныеДляОтправкиДокумента(dd_DocumentBase, dd_DelayedDocumentContentPatchToSend, dd_PowerOfAttorney)
    Если Неопределено <> dd_DelayedDocumentContentPatchToSend.DynamicSigners Тогда
        TFV = dd_DocumentBase.TypeInfo.TypeId;

        Если "UniversalTransferDocument" = TFV.Type
            И "СЧФДОП" = TFV.Function
            И "utd970_05_03_01" = TFV.Version Тогда
            ЗаполнитьУниверсальногоПодписантаУПД970(dd_DelayedDocumentContentPatchToSend.DynamicSigners,
                                                    dd_DocumentBase.Organization.MyEmployee.SessionInfo.Certificate.Thumbprint);
        КонецЕсли;

    ИначеЕсли Неопределено <> dd_DelayedDocumentContentPatchToSend.ExtendedSigners Тогда
        dd_ExtendedSigner = dd_DelayedDocumentContentPatchToSend.AddExtendedSigner();
            dd_ExtendedSigner.BoxId = dd_DocumentBase.Organization.Guid;
            dd_ExtendedSigner.CertificateThumbprint = dd_DocumentBase.Organization.MyEmployee.SessionInfo.Certificate.Thumbprint;

    ИначеЕсли Неопределено <> dd_DelayedDocumentContentPatchToSend.Signer Тогда
        dd_Signer = dd_DelayedDocumentContentPatchToSend.Signer;
            dd_Signer.Surname    = "Фамилия";
            dd_Signer.FirstName  = "Имя";
            dd_Signer.Patronymic = "Отчество";
            dd_Signer.JobTitle   = "Должность";
            dd_Signer.Inn        = "966785367420";
    КонецЕсли;

    dd_DelayedDocumentContentPatchToSend.PowerOfAttorneyToAttach.PowerOfAttorney = dd_PowerOfAttorney;
КонецПроцедуры


Процедура ЗаполнитьОбычнуюПодписьДляЧерновика(dd_DocumentBase, dd_DraftSignatureToSend, dd_PowerOfAttorney)
    // Здесь может быть какая-то ещё логика по обработке dd_DocumentBase
    dd_DraftSignatureToSend.PowerOfAttorneyToAttach.PowerOfAttorney = dd_PowerOfAttorney;
КонецПроцедуры


Процедура ЗаполнитьДанныеДляОтправкиЧерновика(dd_DocumentBase, dd_DraftContentPatchToSend, dd_PowerOfAttorney)
    Если Неопределено <> dd_DraftContentPatchToSend.DynamicSigners Тогда
        TFV = dd_DocumentBase.TypeInfo.TypeId;

        Если "UniversalTransferDocument" = TFV.Type
            И "СЧФДОП" = TFV.Function
            И "utd970_05_03_01" = TFV.Version Тогда
            ЗаполнитьУниверсальногоПодписантаУПД970(dd_DraftContentPatchToSend.DynamicSigners,
                                                    dd_DocumentBase.Organization.MyEmployee.SessionInfo.Certificate.Thumbprint);
        КонецЕсли;

    ИначеЕсли Неопределено <> dd_DraftContentPatchToSend.ExtendedSigners Тогда
        dd_ExtendedSigner = dd_DraftContentPatchToSend.AddExtendedSigner();
            dd_ExtendedSigner.BoxId = dd_DocumentBase.Organization.Guid;
            dd_ExtendedSigner.CertificateThumbprint = dd_DocumentBase.Organization.MyEmployee.SessionInfo.Certificate.Thumbprint;

    ИначеЕсли Неопределено <> dd_DraftContentPatchToSend.Signer Тогда
        dd_Signer = dd_DraftContentPatchToSend.Signer;
            dd_Signer.Surname    = "Фамилия";
            dd_Signer.FirstName  = "Имя";
            dd_Signer.Patronymic = "Отчество";
            dd_Signer.JobTitle   = "Должность";
            dd_Signer.Inn        = "966785367420";
    КонецЕсли;

    dd_DraftContentPatchToSend.PowerOfAttorneyToAttach.PowerOfAttorney = dd_PowerOfAttorney;
КонецПроцедуры


Функция ПодписатьДокумент(dd_DocumentBase, dd_PowerOfAttorney)
    dd_Box = dd_DocumentBase.Organization;
    dd_PatchTask = dd_Box.CreatePatchTask();

    dd_PatchItem_ValueCollection = dd_PatchTask.AddToPatch(dd_DocumentBase, "Sign");
    Для Каждого dd_PatchItem Из dd_PatchItem_ValueCollection Цикл
        // см. https://developer.kontur.ru/Docs/Diadoc/COM/HowTo/start/object_reflection.html
        ИмяИнтерфейса = ПолучитьИмяИнтерфейса(dd_PatchItem.PatchContent);

        Если "IAcceptanceToSend" = ИмяИнтерфейса Тогда
            ЗаполнитьОбычнуюПодпись(dd_PatchItem.Document, dd_PatchItem.PatchContent, dd_PowerOfAttorney);

        ИначеЕсли "IRecipientTitleToSend" = ИмяИнтерфейса Тогда
            ЗаполнитьВторойТитул(dd_PatchItem.Document, dd_PatchItem.PatchContent, dd_PowerOfAttorney);

        ИначеЕсли "IDelayedDocumentContentPatchToSend" = ИмяИнтерфейса Тогда
            ЗаполнитьДанныеДляОтправкиДокумента(dd_PatchItem.Document, dd_PatchItem.PatchContent, dd_PowerOfAttorney);

        ИначеЕсли "IDraftSignatureToSend" = ИмяИнтерфейса Тогда
            ЗаполнитьОбычнуюПодписьДляЧерновика(dd_PatchItem.Document, dd_PatchItem.PatchContent, dd_PowerOfAttorney);

        ИначеЕсли "IDraftContentPatchToSend" = ИмяИнтерфейса Тогда
            ЗаполнитьДанныеДляОтправкиЧерновика(dd_PatchItem.Document, dd_PatchItem.PatchContent, dd_PowerOfAttorney);

        Иначе
            ВызватьИсключение("Неизвестный тип патча");
        КонецЕсли;
    КонецЦикла;

    Возврат dd_PatchTask.Send();
КонецФункции