Как использовать 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 файл.

 

.NET FastReport ZUGFeRD .NET FastReport ZUGFeRD
10 июля 2026

Как настроить Content Security Policy для отчетов FastReport .NET WEB

Узнайте, как настроить Content Security Policy для отчётов FastReport .NET WEB: обзор директив и значений CSP, изменения в архитектуре FastReport, типичные сценарии обхода и способы защиты.
22 июня 2026

Как настроить отчет с Business Objects из кода и дизайнера в FastReport .NET

В этой статье рассматривается реальный пример создания и использования шаблона отчета .frx для подключения к иерархическим бизнес-объектам в FastReport .NET.
21 апреля 2026

Использование водяных знаков в FastReport VCL

В статье подробно рассмотрели функционал добавления водяных знаков в FastReport VCL — как через визуальный интерфейс, так и программно, с помощью кода на Delphi и в скриптах отчётов.

Не является публичной офертой
© 1998-2026 ООО «Быстрые отчеты»