Как выполнить ответные действия по документам

Большинство ответных действий с документом выполняется с помощью метода PatchTask.AddToPatch().

  1. Создайте PatchTask, см. Box.CreatePatchTask().

  2. Определите с какими документами и что необходимо сделать.

  3. Передайте в PatchTask документы и действие.

  4. Заполните коллекцию ответов на отправку. Здесь стоит учитывать, что возможны ситуации, когда в PatchTask передан один набор документов, а ответы нужно сформировать для других. Такое возможно, если работа ведётся с документами закрытых пакетов или черновиками

  5. Отправьте сформированные ответы.

Перем dd_Reflector_;


Процедура ОтветитьНаДокументы(dd_Box, ДокументИлиДокументы)
    // https://developer.kontur.ru/Docs/Diadoc/COM/ComObjects/PatchTask.html

    dd_PatchTask = dd_Box.CreatePatchTask();

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

    ОтветноеДействие = ВычислитьОтветноеДействие(ДокументИлиДокументы);

    dd_ValueCollection = dd_PatchTask.AddToPatch(ДокументИлиДокументы, ОтветноеДействие);
    Для Каждого dd_PatchItem Из dd_ValueCollection Цикл
        ЗаполнитьОтвет(dd_PatchItem);
    КонецЦикла;

    dd_PatchResult = dd_PatchTask.Send();
КонецПроцедуры


Процедура ЗаполнитьОтвет(dd_PatchItem)
    dd_Reflector = Reflector();
    PatchContent = dd_PatchItem.Content;

    dd_TypeDesc = dd_Reflector.Describe(PatchContent);
    ИмяИнтерфейса = dd_TypeDesc.GetInterfaceName();

    Если "IDraftContentPatchToSend" = ИмяИнтерфейса Тогда
        ЗаполнитьПатчКонтентаЧерновика(dd_PatchItem);

    ИначеЕсли "IDraftSignatureToSend" = ИмяИнтерфейса Тогда
        ЗаполнитьПодписьЧерновика(dd_PatchItem);

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

    ИначеЕсли "IDelayedDocumentContentPatchToSend" = ИмяИнтерфейса Тогда
        ЗаполнитьПатчКонтентаДокументаСОтложеннойОтправкой(dd_PatchItem)

    ИначеЕсли "IRecipientTitleToSend" = ИмяИнтерфейса Тогда
        ЗаполнитьОтветныйТитул(dd_PatchItem)

    ИначеЕсли "IReceiptsToSend" = ИмяИнтерфейса Тогда
        ЗаполнитьИоПы(dd_PatchItem);

    ИначеЕсли "IRejectionToSend" = ИмяИнтерфейса Тогда
        ЗаполнитьОтказ(dd_PatchItem);

    ИначеЕсли "ICorrectionRequestToSend" = ИмяИнтерфейса Тогда
        ЗаполнитьЗапросКорректировки(dd_PatchItem);

    ИначеЕсли "IRevocationRequestToSend" = ИмяИнтерфейса Тогда
        ЗаполнитьЗапросАннулирования(dd_PatchItem);
    КонецЕсли;
КонецПроцедуры


Процедура ИнициализироватьReflector()
    dd_Reflector_ = Новый ComОбъект("AddIn.Diadoc.Reflector");
КонецПроцедуры


Функция Reflector()
    Если dd_Reflector_ = Неопределено Тогда
        ИнициализироватьReflector();
    КонецЕсли;

    Возврат dd_Reflector_;
КонецФункции


Функция ПолучитьTFV(dd_DocumentBase)
    TFV = Новый Структура;

    TFV.Вставить("T", dd_DocumentBase.TypeNamedId);
    TFV.Вставить("F", dd_DocumentBase.DocumentFunction);
    TFV.Вставить("V", dd_DocumentBase.Version);

    Возврат Новый ФиксированнаяСтруктура(TFV);
КонецФункции


Процедура ЗаполнитьМЧД(dd_PowerOfAttorneyToAttach)
    // https://developer.kontur.ru/Docs/Diadoc/COM/ComObjects/PowerOfAttorneyToAttach.html
    dd_PowerOfAttorneyToAttach.UseDefault = True;
КонецПроцедуры


Процедура ЗаполнитьПростогоПодписанта(dd_Signer)
    // https://developer.kontur.ru/Docs/Diadoc/COM/ComObjects/Signer.html
    dd_Signer.Surname    = "Фамилия";
    dd_Signer.FirstName  = "Имя";
    dd_Signer.Patronymic = "Отчество";
    dd_Signer.JobTitle   = "Должность";
    dd_Signer.Inn        = "966785367420";
КонецПроцедуры


Процедура ЗаполнитьРасширенногоПодписанта(dd_ExtendedSigner)
    // https://developer.kontur.ru/Docs/Diadoc/COM/ComObjects/ExtendedSigner.html
    dd_SignerDetails = dd_ExtendedSigner.SignerDetails;
        dd_SignerDetails.Surname    = "Петров";
        dd_SignerDetails.FirstName  = "Пётр";
        dd_SignerDetails.Powers     = "MadeAndSignOperation";
        dd_SignerDetails.PowersBase = "Должностные обязанности";
        dd_SignerDetails.Status     = "BuyerEmployee";
        dd_SignerDetails.SignerType = "LegalEntity";
        dd_SignerDetails.Inn        = "6699000000";
КонецПроцедуры


Процедура ЗаполнитьУниверсальногоПодписанта_UniversalTransferDocument_ДОП_utd820_05_01_02_hyphen(dd_DynamicContent)
    // Получить описание (XSD схему) контента можно методом Box.SaveSignersDynamicContentXSD(...)
    // https://developer.kontur.ru/Docs/Diadoc/COM/ComObjects/Box.html#Box.SaveSignersDynamicContentXSD
    dd_DynamicSigners = dd_DynamicContent.DynamicSigners.Signers;
    dd_DynamicSigner = dd_DynamicSigners.AddSigner();
    dd_SignerDetails = dd_DynamicSigner.SignerDetails;
        dd_SignerDetails.LastName         = "Петров";
        dd_SignerDetails.FirstName        = "Пётр";
        dd_SignerDetails.MiddleName       = "Петрович";
        dd_SignerDetails.SignerPowers     = "1";
        dd_SignerDetails.SignerPowersBase = "Должностные обязанности";
        dd_SignerDetails.SignerStatus     = "1";
        dd_SignerDetails.SignerType       = "1";
        dd_SignerDetails.Inn              = "6699000000";
КонецПроцедуры


Процедура ЗаполнитьУниверсальныйКонтентТитула_UniversalTransferDocument_ДОП_utd820_05_01_02_hyphen(dd_DynamicContent)
    // Получить описание (XSD схему) контента можно методом Box.SaveTitleDynamicContentXSD(...)
    // https://developer.kontur.ru/Docs/Diadoc/COM/ComObjects/Box.html#Box.SaveTitleDynamicContentXSD

    UniversalTransferDocumentBuyerTitle = dd_DynamicContent.UniversalTransferDocumentBuyerTitle;

    UniversalTransferDocumentBuyerTitle.DocumentCreator  = "ООО ""Ромашка""";
    UniversalTransferDocumentBuyerTitle.OperationContent = "Принято без претензий";

    dd_SignerDetails = UniversalTransferDocumentBuyerTitle.Signers.AddItems().SignerDetails;
        dd_SignerDetails.LastName         = "Петров";
        dd_SignerDetails.FirstName        = "Пётр";
        dd_SignerDetails.MiddleName       = "Петрович";
        dd_SignerDetails.SignerPowers     = "1";
        dd_SignerDetails.SignerPowersBase = "Должностные обязанности";
        dd_SignerDetails.SignerStatus     = "1";
        dd_SignerDetails.SignerType       = "1";
        dd_SignerDetails.Inn              = "6699000000";
КонецПроцедуры



Процедура ЗаполнитьУниверсальногоПодписанта(dd_DynamicContent, TFV)
    // https://developer.kontur.ru/Docs/Diadoc/COM/ComObjects/DynamicContent.html
    Если "UniversalTransferDocument" = TFV.T Тогда
        Если "ДОП" = TFV.F Тогда
            Если "utd820_05_01_02_hyphen" = TFV.V Тогда
                ЗаполнитьУниверсальногоПодписанта_UniversalTransferDocument_ДОП_utd820_05_01_02_hyphen(dd_DynamicContent);
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры


Процедура ЗаполнитьУниверсальныйКонтентТитула(dd_DynamicContent, TFV)
    // https://developer.kontur.ru/Docs/Diadoc/COM/ComObjects/DynamicContent.html
    Если "UniversalTransferDocument" = TFV.T Тогда
        Если "ДОП" = TFV.F Тогда
            Если "utd820_05_01_02_hyphen" = TFV.V Тогда
                ЗаполнитьУниверсальныйКонтентТитула_UniversalTransferDocument_ДОП_utd820_05_01_02_hyphen(dd_DynamicContent);
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры


Процедура ЗаполнитьПатчКонтентаЧерновика(dd_PatchItem)
    // https://developer.kontur.ru/Docs/Diadoc/COM/ComObjects/DraftContentPatchToSend.html
    dd_DraftContentPatchToSend = dd_PatchItem.PatchContent;
    ЗаполнитьМЧД(dd_DraftContentPatchToSend.PowerOfAttorneyToAttach);

    // Допустим, мы понимаем, что у черновика получатель не указан
    // или указан неправильно
    dd_DraftContentPatchToSend.ToBoxId = "deadbeaf-dead-beaf-dead-beafdeadbeaf";

    // Определить какой из типов подписанта поддерживается можно из результата метода Box.GetDocumentTypes()
    // https://developer.kontur.ru/Docs/Diadoc/COM/ComObjects/Box.html#Box.GetDocumentTypes
    Если Неопределено <> dd_DraftContentPatchToSend.DynamicSigners Тогда
        ЗаполнитьУниверсальногоПодписанта(dd_DraftContentPatchToSend.DynamicSigners, ПолучитьTFV(dd_PatchItem.Document));

    ИначеЕсли Неопределено <> dd_DraftContentPatchToSend.ExtendedSigners Тогда
        // Можно добавить нескольких расширенных подписантов, если это необходимо
        ЗаполнитьРасширенногоПодписанта(dd_DraftContentPatchToSend.AddExtendedSigner());

    ИначеЕсли Неопределено <> dd_DraftContentPatchToSend.Signer Тогда
        ЗаполнитьПростогоПодписанта(dd_DraftContentPatchToSend.Signer)
    КонецЕсли;
КонецПроцедуры


Процедура ЗаполнитьПодписьЧерновика(dd_PatchItem)
    // https://developer.kontur.ru/Docs/Diadoc/COM/ComObjects/DraftSignatureToSend.html
    dd_DraftSignatureToSend = dd_PatchItem.PatchContent;
    ЗаполнитьМЧД(dd_DraftSignatureToSend.PowerOfAttorneyToAttach);

    // Допустим, мы понимаем, что у черновика получатель не указан
    // или указан неправильно
    НужноИзменитьИлиЗаполнитьПолучателяДокумента = Истина;
    Если НужноИзменитьИлиЗаполнитьПолучателяДокумента Тогда
        dd_DraftSignatureToSend.ToBoxId = "deadbeaf-dead-beaf-dead-beafdeadbeaf";
    КонецЕсли;
КонецПроцедуры


Процедура ЗаполнитьПростуюПодпись(dd_PatchItem)
    dd_AcceptanceToSend = dd_PatchItem.PatchContent;
    ЗаполнитьМЧД(dd_AcceptanceToSend.PowerOfAttorneyToAttach);
КонецПроцедуры


Процедура ЗаполнитьПатчКонтентаДокументаСОтложеннойОтправкой(dd_PatchItem)
    // https://developer.kontur.ru/Docs/Diadoc/COM/ComObjects/DelayedDocumentContentPatchToSend.html
    dd_DelayedDocumentContentPatchToSend = dd_PatchItem.PatchContent;
    ЗаполнитьМЧД(dd_DelayedDocumentContentPatchToSend.PowerOfAttorneyToAttach);

    // Допустим, мы понимаем, что в контенте документа получатель указан неправильно
    dd_DelayedDocumentContentPatchToSend.ToBoxId = "deadbeaf-dead-beaf-dead-beafdeadbeaf";

    // Определить какой из типов подписанта поддерживается можно из результата метода Box.GetDocumentTypes()
    // https://developer.kontur.ru/Docs/Diadoc/COM/ComObjects/Box.html#Box.GetDocumentTypes
    Если Неопределено <> dd_DelayedDocumentContentPatchToSend.DynamicSigners Тогда
        ЗаполнитьУниверсальногоПодписанта(dd_DelayedDocumentContentPatchToSend.DynamicSigners, ПолучитьTFV(dd_PatchItem.Document));

    ИначеЕсли Неопределено <> dd_DelayedDocumentContentPatchToSend.ExtendedSigners Тогда
        // Можно добавить нескольких расширенных подписантов, если это необходимо
        ЗаполнитьРасширенногоПодписанта(dd_DelayedDocumentContentPatchToSend.AddExtendedSigner());

    ИначеЕсли Неопределено <> dd_DelayedDocumentContentPatchToSend.Signer Тогда
        ЗаполнитьПростогоПодписанта(dd_DelayedDocumentContentPatchToSend.Signer)
    КонецЕсли;
КонецПроцедуры


Процедура ЗаполнитьОтветныйТитул(dd_PatchItem)
    // https://developer.kontur.ru/Docs/Diadoc/COM/ComObjects/RecipientTitleToSend.html
    dd_RecipientTitleToSend = dd_PatchItem.PatchContent;
    ЗаполнитьМЧД(dd_RecipientTitleToSend.PowerOfAttorneyToAttach);

    // Допустим, хотим, чтобы отправитель документа прислал Извещение о Получении (ИоП) второго титула
    // Стоит учитывать, что в реальности ИоП будет запрошен, если настройки документооборота (DocumentBase.WorkflowId) это позволяют
    // Если для текущего документооборота запрос ИоПа невозможен, то он запрошен не будет
    dd_RecipientTitleToSend.NeedReceipt = True;

    ЗаполнитьУниверсальныйКонтентТитула(dd_RecipientTitleToSend.DynamicSigners, ПолучитьTFV(dd_PatchItem.Document));
КонецПроцедуры


Процедура ЗаполнитьИоПы(dd_PatchItem)
    // https://developer.kontur.ru/Docs/Diadoc/COM/ComObjects/ReceiptsToSend.html
    dd_ReceiptsToSend = dd_PatchItem.PatchContent;
    ЗаполнитьМЧД(dd_ReceiptsToSend.PowerOfAttorneyToAttach);
КонецПроцедуры


Процедура ЗаполнитьОтказ(dd_PatchItem)
    // https://developer.kontur.ru/Docs/Diadoc/COM/ComObjects/RejectionToSend.html
    dd_RejectionToSend = dd_PatchItem.PatchContent;
    ЗаполнитьМЧД(dd_RejectionToSend.PowerOfAttorneyToAttach);

    dd_FormalizedRejectionContent = dd_RejectionToSend.Content;
    dd_FormalizedRejectionContent.Comment = "Комментарий отказа в подписи";
КонецПроцедуры


Процедура ЗаполнитьЗапросКорректировки(dd_PatchItem)
    // https://developer.kontur.ru/Docs/Diadoc/COM/ComObjects/CorrectionRequestToSend.html
    dd_CorrectionRequestToSend = dd_PatchItem.PatchContent;
    ЗаполнитьМЧД(dd_CorrectionRequestToSend.PowerOfAttorneyToAttach);

    dd_CorrectionRequestContent = dd_CorrectionRequestToSend.Content;
    dd_CorrectionRequestContent.Comment = "Комментарий запроса корректировки/исправления";
КонецПроцедуры


Процедура ЗаполнитьЗапросАннулирования(dd_PatchItem)
    // https://developer.kontur.ru/Docs/Diadoc/COM/ComObjects/RevocationRequestToSend.html
    dd_RevocationRequestToSend = dd_PatchItem.PatchContent;
    ЗаполнитьМЧД(dd_RevocationRequestToSend.PowerOfAttorneyToAttach);

    dd_RevocationRequestContent = dd_RevocationRequestToSend.Content;
    dd_RevocationRequestContent.Comment = "Комментарий запроса аннулирования";
    ЗаполнитьПростогоПодписанта(dd_RevocationRequestContent.Signer);
КонецПроцедуры