Показать сообщение отдельно
Старый 19.01.2017, 16:51   #4  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
сам лично не писал, но вот куски кода примерно такие :
X++:
class DiadocNet
{
    Shipdocuments                         ShipDocuments;
    DataArray_X                                 data;
    Dataarray_X                                 orgdata;
    Diadoc.Api.DiadocApi                          api;
    Diadoc.Api.Cryptography.WinApiCrypt           winApiCrypt;
    Diadoc.Api.Proto.Invoicing.InvoiceInfo        InvoIceinfo;
    Diadoc.Api.Proto.Invoicing.InvoiceCorrectionInfo    InvoiceCorrectionInfo;
    Diadoc.Api.Proto.Invoicing.Torg12SellerTitleInfo Torg12SellerTitleInfo;
    Diadoc.Api.Proto.Invoicing.TaxRate            TaxRate;

    Diadoc.Api.Proto.Invoicing.DiadocOrganizationInfo  Buyer;
    Diadoc.Api.Proto.Invoicing.DiadocOrganizationInfo  seller;
    Diadoc.Api.Proto.Invoicing.PaymentDocumentInfo PaymentDocumentInfo;

    Diadoc.Api.Proto.Invoicing.ShipperOrConsignee Shipper;
    Diadoc.Api.Proto.Invoicing.ShipperOrConsignee Consignee;
    Diadoc.Api.Proto.Invoicing.Signer             Signer;
    Diadoc.Api.Proto.Invoicing.SignerDetails      SignerDetails;
    Diadoc.Api.Proto.Events.MessageToPost         MessageToPost;
    str                                           token;
    System.Exception                              netExcepn;
    Diadoc.Api.Proto.Events.GeneratedFile GeneratedFile;
    str                                           filedirectory;
}
X++:
void invoicecreate(boolean ICF = false)
{
        real TotalWithVatExcLude;
        real Vat;
        real Total;
        Diadoc.Api.Proto.Invoicing.InvoiceItem        InvoiceItem;
        System.Byte[] sign;

        ;

        data.reset();
    
        while (data.next())
        {
            InvoiceItem = new Diadoc.Api.Proto.Invoicing.InvoiceItem();
            this.initTaxRate(data.valueStr('TaxRate'));
            InvoiceItem.set_Product(data.valueStr('Product'));
            InvoiceItem.set_Unit(data.valueStr('Unit'));
            InvoiceItem.set_Quantity(data.valueStr('Quantity'));
            InvoiceItem.set_Price(data.valueStr('Price'));
            InvoiceItem.set_TaxRate(TaxRate);
            InvoiceItem.set_SubtotalWithVatExcluded(data.valueStr('SubtotalWithVatExcluded'));
            InvoiceItem.set_Vat(data.valueStr('Vat'));
            InvoiceItem.set_Subtotal(data.valueStr('Subtotal'));
            TotalWithVatExcLude += data.value('SubtotalWithVatExcluded');
            Vat                 += data.value('Vat');
            Total               += data.value('Subtotal');
            InvoiceInfo.AddItem(InvoiceItem);
          
        }

        InvoiceInfo.set_InvoiceNumber(orgdata.valueStr('InvoiceNumber'));
        InvoiceInfo.set_InvoiceDate(orgdata.valueStr('InvoiceDate'));
        if(orgdata.valueStr('DocumentDate'))
        {
            PaymentDocumentinfo.set_DocumentDate(orgdata.valueStr('DocumentDate'));
            PaymentDocumentinfo.set_DocumentNumber(orgdata.valueStr('DocumentNumber'));
            InvoiceInfo.AddPaymentDocument(PaymentDocumentinfo);
        }
        InvoiceInfo.set_Currency(orgdata.valueStr('Currency'));
        InvoiceInfo.set_TotalWithVatExcluded(real2str(TotalWithVatExcLude,1,2,1,0));
        InvoiceInfo.set_Total(real2str(Total,1,2,1,0));
        InvoiceInfo.set_Vat(real2str(Vat,1,2,1,0));
        InvoiceInfo.set_AdditionalInfo(orgdata.valueStr('AdditionalInfo'));

        if(ICF)
        {
            InvoiceInfo.set_InvoiceRevisionDate(orgdata.valueStr('InvoiceRevisionDate'));
            InvoiceInfo.set_InvoiceRevisionNumber(orgdata.valueStr('InvoiceRevisionNumber'));
        }

        Shipper.set_SameAsSellerOrBuyer(true);
        Consignee.set_SameAsSellerOrBuyer(true);    
        this.set_Signer();
        seller = this.set_seller();
        Buyer  = this.set_Buyer();
        InvoiceInfo.set_Seller(seller);
        InvoiceInfo.set_Buyer(Buyer);
        InvoiceInfo.set_Shipper(Shipper);
        InvoiceInfo.set_Consignee(Consignee);
        InvoiceInfo.set_Signer(Signer);

}
X++:
void GenerateInvoiceXml()
{
    Diadoc.Api.Proto.Content   Content;
    //Diadoc.Api.Proto.Events.GeneratedFile GeneratedFile;
    Diadoc.Api.Proto.Events.XmlDocumentAttachment XmlDocumentAttachment = new  Diadoc.Api.Proto.Events.XmlDocumentAttachment();
    Diadoc.Api.Proto.Events.SignedContent   SignedContent = new Diadoc.Api.Proto.Events.SignedContent();
    DiadocTable     DiadocTable;
    Diadoc.Api.Cryptography.WinApiCrypt _WinApiCrypt;
    System.Byte[] sign;
    System.Byte[] certData;
    str filename;
    str filesign;

    try
    {

        GeneratedFile = api.GenerateInvoiceXml(token,InvoIceinfo,false);
        filename+= filedirectory;
        filename+= GeneratedFile.get_FileName();
        GeneratedFile.SaveContentToFile(filename);

        filesign = filedirectory + this.set_FilenameSign();
        certData = this.Signaturecreate();
        sign = WinApiCrypt.Sign(GeneratedFile.get_Content(), certData);
        SignedContent.set_Signature(sign);
        SignedContent.SaveSignatureToFile(filesign);
        ttsbegin;
        select firstfast forupdate * from DiadocTable where DiadocTable.DocumentNum == orgdata.value('InvoiceNumber')
            && DiadocTable.DocumentDate == orgdata.value('InvoiceDate')
            && DiadocTable.Shipdocuments == Shipdocuments
            && DiadocTable.Status == DiadocStatus::Created;
        if(DiadocTable)
            DiadocTable.delete();

        DiadocTable.Shipdocuments = Shipdocuments;
        DiadocTable.Voucher   = orgdata.value('Voucher');
        DiadocTable.Salesid   = orgdata.value('Salesid');
        DiadocTable.DocumentNum   = orgdata.value('InvoiceId');
        DiadocTable.DocumentDate  = orgdata.value('InvoiceDate');
        DiadocTable.FileName      = GeneratedFile.get_FileName();
        DiadocTable.SignFileName  = filesign;
        DiadocTable.Seller        = orgdata.value('SellerAccount');
        DiadocTable.Buyer         = orgdata.value('BuyerAccount');
        DiadocTable.Status        = DiadocStatus::Created;
        DiadocTable.ToBoxid       = Buyer.get_BoxId();
        DiadocTable.FromBoxid     = seller.get_BoxId();
        DiadocTable.insert();
        ttscommit;


        /*sign = this.Signaturecreate();
        SignedContent.set_Content(GeneratedFile.get_Content());
        //SignedContent.set_SignByAttorney(true);

        //SignedContent.set_Signature(sign);
        XmlDocumentAttachment.set_SignedContent(SignedContent);

        MessageToPost.set_ToBoxId(Buyer.get_BoxId());
        MessageToPost.set_FromBoxId(seller.get_BoxId());
        MessageToPost.AddInvoice(XmlDocumentAttachment);*/
    }
    catch
    {
        netExcepn = CLRInterop::getLastException();
        box::info(netExcepn.ToString());
        throw error('Ошибка!');
    }
}
идея такая, что при формировании СФ вся информация ложится в табличку DiadocTable (чтобы не мешать пользователям), а пакетом с определенной периодичностью отсылается и проверяется типа : Отправлено/Не отправлено.
Понимаю, что может быть мало и не достаточно информации, но может быть поможет.
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.

Последний раз редактировалось Pustik; 19.01.2017 в 16:54.
За это сообщение автора поблагодарили: UNRW (2).