сам лично не писал, но вот куски кода примерно такие :
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 (чтобы не мешать пользователям), а пакетом с определенной периодичностью отсылается и проверяется типа : Отправлено/Не отправлено.
Понимаю, что может быть мало и не достаточно информации, но может быть поможет.