Как использовать ZUGFeRD совместно с FastReport .NET

27.07.2022

Стандарт ZUGFeRD был разработан в Германии специально для упрощения процесса электронного выставления счетов. Этот стандарт позволяет обмениваться счетами-фактурами без предварительного соглашения между поставщиком и получателем услуг или товаров. В Германии планируется применять этот стандарт повсеместно: в малом, среднем и крупном бизнесе, а также в государственных учреждениях.

Название стандарта – это аббревиатура ZUGFeRD. Расшифровывается как «Единое руководство для пользователей, разработанное Германским форумом по электронным счетам-фактурам».

В Германии уже используется стандарт электронного документооборота EDI (Electronic Data Interchange), но он используется только в крупных компаниях. Задача же ZUGFeRD охватить все сферы деятельности в стране, будь то частное предпринимательство или крупный автоконцерн. Этот стандарт универсален и не привязан к конкретной отрасли.

В основе ZUGFeRD лежит использование структурированных данных. Это реализовано с помощью стандарта XML. Человеко-читаемое представление счета реализуется с помощью стандарта PDF/A. В формате PDF/A-3 реализована возможность включать в документ объекты произвольного типа. Благодаря этому, в документ включается XML представление структурированных данных счета-фактуры. Таким образом, один документ содержит как человеко-читаемое представление, так и машино-читаемое.


Преимущества ZUGFeRD перед бумажным документооборотом:

  • экономит бумагу;
  • экономит время передачи документа;
  • экономит человеческий ресурс, требуемый на доставку документа;
  • экономит время на поиск документа;
  • экономит пространство на хранение документов, т.к. в электронном виде;
  • ускоряет процесс оплаты платежных поручений, что улучшает ликвидность товаров;
  • существенно уменьшает процент ошибок в документах, благодаря автоматическому внесению в системы учета;
  • исключает затраты на ручное внесение в базы данных, благодаря интеграции с автоматизированными системами бухгалтерского учета;
  • экономит время на утверждение документа, благодаря быстрой доставке.

 

ZUGFeRD поддерживает следующие типы счетов:

ZUGFeRD Basic

  • Коммерческие счета-фактуры (счета-фактуры для товаров и услуг) с кодом 380
  • Уведомления (например, требования об уплате налогов государственными органами) с кодом 380
  • Коммерческие кредитные примечания (например, исправленные счета-фактуры / аннулирования) с отрицательным значением (код 380)

ZUGFeRD Comfort также поддерживает:

  • Дебетовое примечание, касающееся финансовых корректировок (код 84)
  • Кредитная нота, связанная с финансовыми корректировками с отрицательным значением (код 84)

  ZUGFeRD Extended также поддерживает:

  • Счета с самооценкой (кредитная записка / процедура самостоятельного выставления счетов в соответствии с налоговым законодательством, код 389)
  • Самооценка кредитных нот с отрицательным значением (код 389)

Теперь рассмотрим некоторые детали документа стандарта ZUGFeRD. Как отмечалось выше, для машинной обработки счетов предусмотрен XML документ, интегрированный в PDF файл. Допускается также, включение XSD схемы в PDF документ.

XML-файл всегда внедряется в PDF документ с именем «ZUGFeRD-invoice.xml». Существует также возможность вставлять другие документы, объясняющие счет-фактуру, в качестве дополнительных файлов.

Вот так выглядит типичная счет-фактура в виде XML части ZUGFeRD документа:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<ram:IncludedSupplyChainTradeLineItem>
<ram:AssociatedDocumentLineDocument>
<ram:LineID>1</ram:LineID>
</ram:AssociatedDocumentLineDocument>
<ram:SpecifiedSupplyChainTradeAgreement>
<ram:GrossPriceProductTradePrice>
<ram:ChargeAmount currencyID="EUR">1.0000</ram:ChargeAmount>
</ram:GrossPriceProductTradePrice>
<ram:NetPriceProductTradePrice>
<ram:ChargeAmount currencyID="EUR">1.0000</ram:ChargeAmount>
</ram:NetPriceProductTradePrice>
</ram:SpecifiedSupplyChainTradeAgreement>
<ram:SpecifiedSupplyChainTradeDelivery>
<ram:BilledQuantity unitCode="C62">100.0000</ram:BilledQuantity>
</ram:SpecifiedSupplyChainTradeDelivery>
<ram:SpecifiedSupplyChainTradeSettlement>
<ram:ApplicableTradeTax>
<ram:TypeCode>VAT</ram:TypeCode>
<ram:CategoryCode>S</ram:CategoryCode>
<ram:ApplicablePercent>19.00</ram:ApplicablePercent>
</ram:ApplicableTradeTax>
<ram:SpecifiedTradeSettlementMonetarySummation>
<ram:LineTotalAmount currencyID="EUR">100.00
</ram:LineTotalAmount>
</ram:SpecifiedTradeSettlementMonetarySummation>
</ram:SpecifiedSupplyChainTradeSettlement>
<ram:SpecifiedTradeProduct>
<ram:SellerAssignedID>ZS997</ram:SellerAssignedID>
<ram:Name>Citric acid 100 ml</ram:Name>
</ram:SpecifiedTradeProduct>
</ram:IncludedSupplyChainTradeLineItem>

Давайте теперь рассмотрим пример использования FastReport.Net для генерации счет-фактур ZUGFeRD. Вы можете найти его в папке «J:\Program Files (x86)\FastReports\FastReport.Net\Demos\C#\ZUGFeRD». Проект представляет собой обычное WinForms приложение.

Форма содержит поле ввода и две кнопки:

 

Одна из кнопок позволяет задать путь к файлу, используя стандартный диалог открытия файла. Вторая кнопка запускает процедуру генерации документа ZUGFeRD.

Рассмотрим код всего класса формы:

Код программы:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using FastReport;
using FastReport.Export.Pdf;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace ZUGFeRD
{
 public partial class MainForm : Form
 {
 private string appPath; //Путь к папке с исполняемым файлом приложения
 
 public MainForm()
 { 
 InitializeComponent();
 }
//Кнопка выбора xml-файла формата ZUGFeRD
 private void btnSelectFile_Click(object sender, EventArgs e)
 {
//Стандартный диалог открытия файла
 using (OpenFileDialog openDialog = new OpenFileDialog())
 {
 openDialog.Title = "Select ZUGFeRD XML";
 openDialog.InitialDirectory = appPath;
 openDialog.Filter = "ZUGFeRD invoice XML (*.xml)|*.xml|All files (*.*)|*.*";
 if (openDialog.ShowDialog() == DialogResult.OK)
 {
 tbZUGFeRDPath.Text = openDialog.FileName; //Присваиваем полю ввода имя выбранного файла
 }
 }
 }
//Событие загрузки главной формы программы
 private void MainForm_Load(object sender, EventArgs e)
 {
 appPath = Path.GetDirectoryName(Application.ExecutablePath); //Задаем путь к папке с исполняемым файлом программы
 }
//Кнопка создания PDF документа со счетом стандарта ZUGFeRD
 private void btnCreatePDF_Click(object sender, EventArgs e)
 {
//Получаем путь к xml файлу
 string xmlFile = File.Exists(tbZUGFeRDPath.Text) ? tbZUGFeRDPath.Text : Path.Combine(appPath, tbZUGFeRDPath.Text);
 if (File.Exists(xmlFile))
 {
//Получаем путь к файлу отчета
 string reportFile = Path.Combine(appPath, "Invoice.frx");
 if (File.Exists(reportFile))
 {
//Вызываем стандартный диалог сохранения файла
 using (SaveFileDialog saveDialog = new SaveFileDialog())
 {
 saveDialog.Title = "Select path to save PDF file with embedded ZUGFeRD";
 saveDialog.Filter = "PDF/A-3b file (*.pdf)|*.pdf|All files (*.*)|*.*";
 saveDialog.FileName = "Invoice-With-ZUGFeRD.pdf";
 if (saveDialog.ShowDialog() == DialogResult.OK)
 {
 using (Report report = new Report()) //Создаем объект отчета
 using (PDFExport pdf = new PDFExport()) //Создаем объект PDF экспорта
 using (FileStream file = new FileStream(xmlFile, FileMode.Open, FileAccess.Read)) //Создаем поток
 {
 report.Load(reportFile); //Загружаем отчет
 report.Prepare(); //Подготавливаем отчет
 pdf.PdfCompliance = PDFExport.PdfStandard.PdfA_3b; //Задаем стандарт PDF файла
 pdf.OpenAfterExport = true; //Открыть файл после экспорта
 pdf.AddEmbeddedXML("ZUGFeRD-invoice.xml", "ZUGFeRD invoice", DateTime.Now, file); //Вложить xml файл в PDF документ
 report.Export(pdf, saveDialog.FileName); //Выполнить экспорт отчета
 }
 }
 }
 }
 else
 MessageBox.Show("Report file does not exist!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
 }
 else
 MessageBox.Show("XML file does not exist!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
 }
 }
}
 

Из комментариев к коду понятно, что мы выполняем экспорт заранее созданного отчета в PDF. При этом, устанавливаем стандарт PDF/A-3 и добавляем в документ xml файл счета стандарта ZUGFeRD.

Давайте рассмотрим шаблон отчета, который, представляет собой счет-фактуру, оформленную по стандартам ZUGFeRD.

 

Для генерации XML представления этого отчета нужно использовать библиотеку, которую можно найти тут: https://www.nuget.org/packages/ZUGFeRD-csharp/.

С помощью кода и библиотеки ZUGFeRD-csharp мы генерируем вот такой XML файл:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<?xml version="1.0" encoding="UTF-8"?><rsm:CrossIndustryDocument xmlns:rsm="urn:ferd:CrossIndustryDocument:invoice:1p0" xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:12" xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:15" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <rsm:SpecifiedExchangedDocumentContext>
 <ram:TestIndicator>
 <udt:Indicator>true</udt:Indicator>
 </ram:TestIndicator>
 <ram:GuidelineSpecifiedDocumentContextParameter>
 <ram:ID>urn:ferd:CrossIndustryDocument:invoice:1p0:basic</ram:ID>
 </ram:GuidelineSpecifiedDocumentContextParameter>
 </rsm:SpecifiedExchangedDocumentContext>
 <rsm:HeaderExchangedDocument>
 <ram:ID>2017-415</ram:ID>
 <ram:Name>Rechnung</ram:Name>
 <ram:TypeCode>380</ram:TypeCode>
 <ram:IssueDateTime>
 <udt:DateTimeString format="102">20170320</udt:DateTimeString>
 </ram:IssueDateTime>
 <ram:IncludedNote>
 <ram:Content>Created by FastReport.Net https://www.fast-report.com</ram:Content>
 </ram:IncludedNote>
 </rsm:HeaderExchangedDocument>
 <rsm:SpecifiedSupplyChainTradeTransaction>
 
 <ram:ApplicableSupplyChainTradeAgreement>
 <ram:SellerTradeParty>
 <ram:Name>Haimerl Datentechnik</ram:Name>
 <ram:PostalTradeAddress>
 <ram:PostcodeCode>94356</ram:PostcodeCode>
 <ram:LineOne>Kreuzacker 10</ram:LineOne>
 <ram:CityName>Kirchroth / Kössnach</ram:CityName>
 <ram:CountryID>DE</ram:CountryID>
 </ram:PostalTradeAddress>
 <ram:SpecifiedTaxRegistration>
 <ram:ID schemeID="VA">DE179151914</ram:ID>
 </ram:SpecifiedTaxRegistration>
 </ram:SellerTradeParty>
 <ram:BuyerTradeParty>
 <ram:Name>ABB Lackieranlagen GmbH</ram:Name>
 <ram:PostalTradeAddress>
 <ram:PostcodeCode>35510</ram:PostcodeCode>
 <ram:LineOne>Schorbachstrasse 9</ram:LineOne>
 <ram:CityName>Butzbach</ram:CityName>
 <ram:CountryID>DE</ram:CountryID>
 </ram:PostalTradeAddress>
 </ram:BuyerTradeParty>
 </ram:ApplicableSupplyChainTradeAgreement>
 <ram:ApplicableSupplyChainTradeDelivery>
 <ram:ActualDeliverySupplyChainEvent>
 <ram:OccurrenceDateTime>
 <udt:DateTimeString format="102">20170320</udt:DateTimeString>
 </ram:OccurrenceDateTime>
 </ram:ActualDeliverySupplyChainEvent>
 </ram:ApplicableSupplyChainTradeDelivery>
 <ram:ApplicableSupplyChainTradeSettlement>
 <ram:PaymentReference>2017-415</ram:PaymentReference>
 <ram:InvoiceCurrencyCode>EUR</ram:InvoiceCurrencyCode>
 <ram:ApplicableTradeTax>
 <ram:CalculatedAmount currencyID="EUR">160.93</ram:CalculatedAmount>
 <ram:TypeCode>VAT</ram:TypeCode>
 <ram:BasisAmount currencyID="EUR">847.00</ram:BasisAmount>
 <ram:ApplicablePercent>19.0</ram:ApplicablePercent>
 </ram:ApplicableTradeTax>
 <ram:SpecifiedTradeSettlementMonetarySummation>
 <ram:LineTotalAmount currencyID="EUR">847.00</ram:LineTotalAmount>
 <ram:ChargeTotalAmount currencyID="EUR">0</ram:ChargeTotalAmount>
 <ram:AllowanceTotalAmount currencyID="EUR">0</ram:AllowanceTotalAmount>
 <ram:TaxBasisTotalAmount currencyID="EUR">847.00</ram:TaxBasisTotalAmount>
 <ram:TaxTotalAmount currencyID="EUR">160.93</ram:TaxTotalAmount>
 <ram:GrandTotalAmount currencyID="EUR">1007.93</ram:GrandTotalAmount>
 </ram:SpecifiedTradeSettlementMonetarySummation>
 </ram:ApplicableSupplyChainTradeSettlement>
 <ram:IncludedSupplyChainTradeLineItem>
 <ram:AssociatedDocumentLineDocument/>
 <ram:SpecifiedSupplyChainTradeDelivery>
 <ram:BilledQuantity unitCode="C62">1</ram:BilledQuantity>
 </ram:SpecifiedSupplyChainTradeDelivery>
 <ram:SpecifiedSupplyChainTradeSettlement/>
 <ram:SpecifiedTradeProduct>
 <ram:Name>FastReport.Net Professional Edition Single License</ram:Name>
 </ram:SpecifiedTradeProduct>
 </ram:IncludedSupplyChainTradeLineItem>
 <ram:IncludedSupplyChainTradeLineItem>
 <ram:AssociatedDocumentLineDocument/>
 <ram:SpecifiedSupplyChainTradeDelivery>
 <ram:BilledQuantity unitCode="C62">2</ram:BilledQuantity>
 </ram:SpecifiedSupplyChainTradeDelivery>
 <ram:SpecifiedSupplyChainTradeSettlement/>
 <ram:SpecifiedTradeProduct>
 <ram:Name>FastReport.Net Win+WebForms Edition Single License</ram:Name>
 </ram:SpecifiedTradeProduct>
 </ram:IncludedSupplyChainTradeLineItem>
 </rsm:SpecifiedSupplyChainTradeTransaction>
</rsm:CrossIndustryDocument>

Запускаем программу:

 

Выбираем xml-файл счет-фактуры. Нажимаем кнопку Create PDF/A-3b with embedded XML. А вот так выглядит человеко-читаемое представление документа, собственно сам PDF документ:

 

Таким образом, для использования xml представления ZUGFeRD совместно с отчетом FastReport нужно всего лишь выполнить экспорт отчета в PDF формата A-3 и прикрепить xml файл.

 

20 ноября 2024

Локализация и смена языков в FastReport VCL

FastReport VCL поддерживает 40 языков для локализации интерфейса и позволяет изменять язык на лету через меню или код, без перекомпиляции.
1 ноября 2024

Новые возможности редактора отчетов FastReport VCL

Рассматриваем новые возможности редактора отчетов: выносные линии, подсветка пересекающихся объектов, обновлённые деревья отчетов и данных.
30 октября 2024

Использование стилей при создании отчетов в FastReport VCL

В статье подробно рассматривается одна из новых возможностей FastReport VCL – применение стилей и страниц стилей.