diff --git a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/BussinessLogic/ReportLogic.cs b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/BussinessLogic/ReportLogic.cs
new file mode 100644
index 0000000..8e4a2cf
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/BussinessLogic/ReportLogic.cs
@@ -0,0 +1,112 @@
+using FurnitureAssemblyContracts.BindingModels;
+using FurnitureAssemblyContracts.BusinessLogicsContracts;
+using FurnitureAssemblyContracts.SearchModels;
+using FurnitureAssemblyContracts.StoragesContracts;
+using FurnitureAssemblyContracts.ViewModels;
+using FurnitureAssemblyBusinessLogic.OfficePackage;
+using FurnitureAssemblyBusinessLogic.OfficePackage.HelperModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FurnitureAssemblyBusinessLogic.BussinessLogic
+{
+    public class ReportLogic : IReportLogic
+    {
+        private readonly IFurnitureStorage _furnitureStorage;
+
+        private readonly IOrderStorage _orderStorage;
+
+        private readonly AbstractSaveToExcel _saveToExcel;
+
+        private readonly AbstractSaveToWord _saveToWord;
+
+        private readonly AbstractSaveToPdf _saveToPdf;
+
+        public ReportLogic(IFurnitureStorage furnitureStorage,
+           IOrderStorage orderStorage, AbstractSaveToExcel saveToExcel,
+           AbstractSaveToWord saveToWord, AbstractSaveToPdf saveToPdf)
+        {
+            _furnitureStorage = furnitureStorage;
+            _orderStorage = orderStorage;
+
+            _saveToExcel = saveToExcel;
+            _saveToWord = saveToWord;
+            _saveToPdf = saveToPdf;
+        }
+
+
+        public List<ReportFurnitureWorkPieceViewModel> GetFurnitureWorkPiece()
+        {
+            var furnitures = _furnitureStorage.GetFullList();
+
+            var list = new List<ReportFurnitureWorkPieceViewModel>();
+
+            foreach (var furniture in furnitures)
+            {
+                var record = new ReportFurnitureWorkPieceViewModel
+                {
+                    FurnitureName = furniture.FurnitureName,
+                    WorkPieces = new List<(string, int)>(),
+                    TotalCount = 0
+                };
+
+                foreach (var workPiece in furniture.FurnitureWorkPieces)
+                {
+                    record.WorkPieces.Add(new(workPiece.Value.Item1.WorkPieceName, workPiece.Value.Item2));
+                    record.TotalCount += workPiece.Value.Item2;
+                }
+
+                list.Add(record);
+            }
+
+            return list;
+        }
+
+        public List<ReportOrdersViewModel> GetOrders(ReportBindingModel model)
+        {
+            return _orderStorage.GetFilteredList(new OrderSearchModel { DateFrom = model.DateFrom, DateTo = model.DateTo })
+                .Select(x => new ReportOrdersViewModel
+                {
+                    Id = x.Id,
+                    DateCreate = x.DateCreate,
+                    FurnitureName = x.FurnitureName,
+                    Sum = x.Sum,
+                    OrderStatus = x.Status.ToString()
+                }).ToList();
+        }
+
+        public void SaveFurnituresToWordFile(ReportBindingModel model)
+        {
+            _saveToWord.CreateDoc(new WordInfo
+            {
+                FileName = model.FileName,
+                Title = "Список изделий",
+                Furnitures = _furnitureStorage.GetFullList()
+            });
+        }
+        public void SaveFurnitureWorkPieceToExcelFile(ReportBindingModel model)
+        {
+            _saveToExcel.CreateReport(new ExcelInfo
+            {
+                FileName = model.FileName,
+                Title = "Список заготовок",
+                FurnitureWorkPieces = GetFurnitureWorkPiece()
+            });
+        }
+
+        public void SaveOrdersToPdfFile(ReportBindingModel model)
+        {
+            _saveToPdf.CreateDoc(new PdfInfo
+            {
+                FileName = model.FileName,
+                Title = "Список заказов",
+                DateFrom = model.DateFrom!.Value,
+                DateTo = model.DateTo!.Value,
+                Orders = GetOrders(model)
+            });
+        }
+    }
+}
diff --git a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/FurnitureAssemblyBusinessLogic.csproj b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/FurnitureAssemblyBusinessLogic.csproj
index 90359da..1d7301f 100644
--- a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/FurnitureAssemblyBusinessLogic.csproj
+++ b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/FurnitureAssemblyBusinessLogic.csproj
@@ -7,7 +7,11 @@
   </PropertyGroup>
 
   <ItemGroup>
+    <PackageReference Include="DocumentFormat.OpenXml" Version="2.20.0" />
     <PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
+    <PackageReference Include="MigraDocCore.DocumentObjectModel" Version="1.3.63" />
+    <PackageReference Include="MigraDocCore.Rendering" Version="1.3.63" />
+    <PackageReference Include="PDFsharp-MigraDoc-GDI" Version="1.50.5147" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/AbstractSaveToExcel.cs b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/AbstractSaveToExcel.cs
new file mode 100644
index 0000000..bebcbc2
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/AbstractSaveToExcel.cs
@@ -0,0 +1,97 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using FurnitureAssemblyBusinessLogic.OfficePackage.HelperEnums;
+using FurnitureAssemblyBusinessLogic.OfficePackage.HelperModels;
+
+
+namespace FurnitureAssemblyBusinessLogic.OfficePackage
+{
+    public abstract class AbstractSaveToExcel
+    {
+        public void CreateReport(ExcelInfo info)
+        {
+            CreateExcel(info);
+
+            InsertCellInWorksheet(new ExcelCellParameters
+            {
+                ColumnName = "A",
+                RowIndex = 1,
+                Text = info.Title,
+                StyleInfo = ExcelStyleInfoType.Title
+            });
+
+            MergeCells(new ExcelMergeParameters
+            {
+                CellFromName = "A1",
+                CellToName = "C1"
+            });
+
+            uint rowIndex = 2;
+
+            foreach (var fwp in info.FurnitureWorkPieces)
+            {
+                InsertCellInWorksheet(new ExcelCellParameters
+                {
+                    ColumnName = "A",
+                    RowIndex = rowIndex,
+                    Text = fwp.FurnitureName,
+                    StyleInfo = ExcelStyleInfoType.Text
+                });
+
+                rowIndex++;
+
+                foreach (var (WorkPiece, Count) in fwp.WorkPieces)
+                {
+                    InsertCellInWorksheet(new ExcelCellParameters
+                    {
+                        ColumnName = "B",
+                        RowIndex = rowIndex,
+                        Text = WorkPiece,
+                        StyleInfo = ExcelStyleInfoType.TextWithBorder
+                    });
+
+                    InsertCellInWorksheet(new ExcelCellParameters
+                    {
+                        ColumnName = "C",
+                        RowIndex = rowIndex,
+                        Text = Count.ToString(),
+                        StyleInfo = ExcelStyleInfoType.TextWithBorder
+                    });
+
+                    rowIndex++;
+                }
+
+                InsertCellInWorksheet(new ExcelCellParameters
+                {
+                    ColumnName = "A",
+                    RowIndex = rowIndex,
+                    Text = "Итого",
+                    StyleInfo = ExcelStyleInfoType.Text
+                });
+
+                InsertCellInWorksheet(new ExcelCellParameters
+                {
+                    ColumnName = "C",
+                    RowIndex = rowIndex,
+                    Text = fwp.TotalCount.ToString(),
+                    StyleInfo = ExcelStyleInfoType.Text
+                });
+
+                rowIndex++;
+            }
+
+            SaveExcel(info);
+        }
+        protected abstract void CreateExcel(ExcelInfo info);
+
+        protected abstract void InsertCellInWorksheet(ExcelCellParameters excelParams);
+
+        protected abstract void MergeCells(ExcelMergeParameters excelParams);
+
+        protected abstract void SaveExcel(ExcelInfo info);
+
+    }
+}
diff --git a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/AbstractSaveToPdf.cs b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/AbstractSaveToPdf.cs
new file mode 100644
index 0000000..11fc9d9
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/AbstractSaveToPdf.cs
@@ -0,0 +1,67 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using FurnitureAssemblyBusinessLogic.OfficePackage.HelperEnums;
+using FurnitureAssemblyBusinessLogic.OfficePackage.HelperModels;
+
+
+namespace FurnitureAssemblyBusinessLogic.OfficePackage
+{
+    public abstract class AbstractSaveToPdf
+    {
+        public void CreateDoc(PdfInfo info)
+        {
+            CreatePdf(info);
+
+            CreateParagraph(new PdfParagraph
+            {
+                Text = info.Title,
+                Style = "NormalTitle",
+                ParagraphAlignment = PdfParagraphAlignmentType.Center
+            });
+
+            CreateParagraph(new PdfParagraph
+            {
+                Text = $"с {info.DateFrom.ToShortDateString()} по {info.DateTo.ToShortDateString()}",
+                Style = "Normal",
+                ParagraphAlignment = PdfParagraphAlignmentType.Center
+            });
+
+            CreateTable(new List<string> { "2cm", "3cm", "6cm", "3cm", "3cm" });
+
+            CreateRow(new PdfRowParameters
+            {
+                Texts = new List<string> { "Номер", "Дата заказа", "Изделие", "Сумма", "Статус заказа" },
+                Style = "NormalTitle",
+                ParagraphAlignment = PdfParagraphAlignmentType.Center
+            });
+
+            foreach (var order in info.Orders)
+            {
+                CreateRow(new PdfRowParameters
+                {
+                    Texts = new List<string> { order.Id.ToString(), order.DateCreate.ToShortDateString(), order.FurnitureName, order.Sum.ToString(), order.OrderStatus },
+                    Style = "Normal",
+                    ParagraphAlignment = PdfParagraphAlignmentType.Left
+                });
+            }
+
+            CreateParagraph(new PdfParagraph
+            {
+                Text = $"\nИтого: {info.Orders.Sum(x => x.Sum)}\t",
+                Style = "Normal",
+                ParagraphAlignment = PdfParagraphAlignmentType.Right
+            });
+
+            SavePdf(info);
+        }
+        protected abstract void CreatePdf(PdfInfo info);
+        protected abstract void CreateParagraph(PdfParagraph paragraph);
+        protected abstract void CreateTable(List<string> columns);
+        protected abstract void CreateRow(PdfRowParameters rowParameters);
+        protected abstract void SavePdf(PdfInfo info);
+
+    }
+}
diff --git a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/AbstractSaveToWord.cs b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/AbstractSaveToWord.cs
new file mode 100644
index 0000000..0cae3f3
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/AbstractSaveToWord.cs
@@ -0,0 +1,50 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using FurnitureAssemblyBusinessLogic.OfficePackage.HelperEnums;
+using FurnitureAssemblyBusinessLogic.OfficePackage.HelperModels;
+
+
+namespace FurnitureAssemblyBusinessLogic.OfficePackage
+{
+    public abstract class AbstractSaveToWord
+    {
+        public void CreateDoc(WordInfo info)
+        {
+            CreateWord(info);
+
+            CreateParagraph(new WordParagraph
+            {
+                Texts = new List<(string, WordTextProperties)> { (info.Title, new WordTextProperties { Bold = true, Size = "24", }) },
+                TextProperties = new WordTextProperties
+                {
+                    Size = "24",
+                    JustificationType = WordJustificationType.Center
+                }
+            });
+
+            foreach (var furniture in info.Furnitures)
+            {
+                CreateParagraph(new WordParagraph
+                {
+                    Texts = new List<(string, WordTextProperties)> { (furniture.FurnitureName + " ", new WordTextProperties { Bold = true, Size = "24", }),
+                    (furniture.Price.ToString(), new WordTextProperties { Size = "24" }) },
+                    TextProperties = new WordTextProperties
+                    {
+                        Size = "24",
+                        JustificationType = WordJustificationType.Both
+                    }
+                });
+            }
+
+            SaveWord(info);
+        }
+
+        protected abstract void CreateWord(WordInfo info);
+        protected abstract void CreateParagraph(WordParagraph paragraph);
+        protected abstract void SaveWord(WordInfo info);
+
+    }
+}
diff --git a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperEnums/ExcelStyleInfoType.cs b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperEnums/ExcelStyleInfoType.cs
new file mode 100644
index 0000000..ef1ed4b
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperEnums/ExcelStyleInfoType.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FurnitureAssemblyBusinessLogic.OfficePackage.HelperEnums
+{
+    public enum ExcelStyleInfoType
+    {
+        Title,
+
+        Text,
+
+        TextWithBorder
+    }
+}
diff --git a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperEnums/PdfParagraphAlignmentType.cs b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperEnums/PdfParagraphAlignmentType.cs
new file mode 100644
index 0000000..e6294f4
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperEnums/PdfParagraphAlignmentType.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FurnitureAssemblyBusinessLogic.OfficePackage.HelperEnums
+{
+    public enum PdfParagraphAlignmentType
+    {
+        Center,
+
+        Left,
+
+        Right
+    }
+}
diff --git a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperEnums/WordJustificationType.cs b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperEnums/WordJustificationType.cs
new file mode 100644
index 0000000..acf9e1b
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperEnums/WordJustificationType.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FurnitureAssemblyBusinessLogic.OfficePackage.HelperEnums
+{
+    public enum WordJustificationType
+    {
+        Center,
+
+        Both
+    }
+}
diff --git a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/ExcelCellParameters.cs b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/ExcelCellParameters.cs
new file mode 100644
index 0000000..639cea8
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/ExcelCellParameters.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using FurnitureAssemblyBusinessLogic.OfficePackage.HelperEnums;
+
+namespace FurnitureAssemblyBusinessLogic.OfficePackage.HelperModels
+{
+    public class ExcelCellParameters
+    {
+        public string ColumnName { get; set; } = string.Empty;
+        public uint RowIndex { get; set; }
+        public string Text { get; set; } = string.Empty;
+        public string CellReference => $"{ColumnName}{RowIndex}";
+        public ExcelStyleInfoType StyleInfo { get; set; }
+
+    }
+}
diff --git a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs
new file mode 100644
index 0000000..17a32f0
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs
@@ -0,0 +1,17 @@
+using FurnitureAssemblyContracts.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FurnitureAssemblyBusinessLogic.OfficePackage.HelperModels
+{
+    public class ExcelInfo
+    {
+        public string FileName { get; set; } = string.Empty;
+        public string Title { get; set; } = string.Empty;
+        public List<ReportFurnitureWorkPieceViewModel> FurnitureWorkPieces { get; set; } = new();
+
+    }
+}
diff --git a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/ExcelMergeParameters.cs b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/ExcelMergeParameters.cs
new file mode 100644
index 0000000..b0a9321
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/ExcelMergeParameters.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FurnitureAssemblyBusinessLogic.OfficePackage.HelperModels
+{
+    public class ExcelMergeParameters
+    {
+        public string CellFromName { get; set; } = string.Empty;
+
+        public string CellToName { get; set; } = string.Empty;
+
+        // Геттер для указания диапазона для объединения, чтобы каждый раз его не вычислять
+        public string Merge => $"{CellFromName}:{CellToName}";
+    }
+}
diff --git a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs
new file mode 100644
index 0000000..ee2e1b5
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs
@@ -0,0 +1,23 @@
+using FurnitureAssemblyContracts.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FurnitureAssemblyBusinessLogic.OfficePackage.HelperModels
+{
+    public class PdfInfo
+    {
+        public string FileName { get; set; } = string.Empty;
+
+        public string Title { get; set; } = string.Empty;
+
+        public DateTime DateFrom { get; set; }
+
+        public DateTime DateTo { get; set; }
+
+        // Перечень заказов за указанный период для вывода/сохранения
+        public List<ReportOrdersViewModel> Orders { get; set; } = new();
+    }
+}
diff --git a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/PdfParagraph.cs b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/PdfParagraph.cs
new file mode 100644
index 0000000..8f1c340
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/PdfParagraph.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using FurnitureAssemblyBusinessLogic.OfficePackage.HelperEnums;
+
+namespace FurnitureAssemblyBusinessLogic.OfficePackage.HelperModels
+{
+    public class PdfParagraph
+    {
+        public string Text { get; set; } = string.Empty;
+
+        public string Style { get; set; } = string.Empty;
+
+        // Информация по выравниванию текста в параграфе
+        public PdfParagraphAlignmentType ParagraphAlignment { get; set; }
+    }
+}
diff --git a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/PdfRowParameters.cs b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/PdfRowParameters.cs
new file mode 100644
index 0000000..a9b3d66
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/PdfRowParameters.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using FurnitureAssemblyBusinessLogic.OfficePackage.HelperEnums;
+
+namespace FurnitureAssemblyBusinessLogic.OfficePackage.HelperModels
+{
+    public class PdfRowParameters
+    {
+        // Набор текстов
+        public List<string> Texts { get; set; } = new();
+
+        // Стиль к текстам
+        public string Style { get; set; } = string.Empty;
+
+        // Как выравниваем
+        public PdfParagraphAlignmentType ParagraphAlignment { get; set; }
+    }
+}
diff --git a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/WordInfo.cs b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/WordInfo.cs
new file mode 100644
index 0000000..c5ff534
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/WordInfo.cs
@@ -0,0 +1,19 @@
+using FurnitureAssemblyContracts.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FurnitureAssemblyBusinessLogic.OfficePackage.HelperModels
+{
+    public class WordInfo
+    {
+        public string FileName { get; set; } = string.Empty;
+
+        public string Title { get; set; } = string.Empty;
+
+        //список заготовок для вывода и сохранения
+        public List<FurnitureViewModel> Furnitures { get; set; } = new();
+    }
+}
diff --git a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/WordParagraph.cs b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/WordParagraph.cs
new file mode 100644
index 0000000..c775c71
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/WordParagraph.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FurnitureAssemblyBusinessLogic.OfficePackage.HelperModels
+{
+    public class WordParagraph
+    {
+        public List<(string, WordTextProperties)> Texts { get; set; } = new();
+        public WordTextProperties? TextProperties { get; set; }
+
+    }
+}
diff --git a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/WordTextProperties.cs b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/WordTextProperties.cs
new file mode 100644
index 0000000..fbde3f7
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/HelperModels/WordTextProperties.cs
@@ -0,0 +1,21 @@
+using FurnitureAssemblyBusinessLogic.OfficePackage.HelperEnums;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FurnitureAssemblyBusinessLogic.OfficePackage.HelperModels
+{
+    public class WordTextProperties
+    {
+        // Размер текста
+        public string Size { get; set; } = string.Empty;
+
+        // Надо ли делать его жирным
+        public bool Bold { get; set; }
+
+        // Выравнивание
+        public WordJustificationType JustificationType { get; set; }
+    }
+}
diff --git a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/Implements/SaveToExcel.cs b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/Implements/SaveToExcel.cs
new file mode 100644
index 0000000..fa00708
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/Implements/SaveToExcel.cs
@@ -0,0 +1,392 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using DocumentFormat.OpenXml.Office2010.Excel;
+using DocumentFormat.OpenXml.Office2013.Excel;
+using DocumentFormat.OpenXml.Packaging;
+using DocumentFormat.OpenXml.Spreadsheet;
+using DocumentFormat.OpenXml;
+using FurnitureAssemblyBusinessLogic.OfficePackage.HelperEnums;
+using FurnitureAssemblyBusinessLogic.OfficePackage.HelperModels;
+
+namespace FurnitureAssemblyBusinessLogic.OfficePackage.Implements
+{
+    public class SaveToExcel : AbstractSaveToExcel
+    {
+        private SpreadsheetDocument? _spreadsheetDocument;
+
+        private SharedStringTablePart? _shareStringPart;
+
+        private Worksheet? _worksheet;
+
+        // Настройка стилей для файла
+        private static void CreateStyles(WorkbookPart workbookpart)
+        {
+            var sp = workbookpart.AddNewPart<WorkbookStylesPart>();
+            sp.Stylesheet = new Stylesheet();
+
+            // Настройка шрифта простого текста
+            var fonts = new Fonts() { Count = 2U, KnownFonts = true };
+
+            var fontUsual = new Font();
+            fontUsual.Append(new FontSize() { Val = 12D });
+            fontUsual.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color() { Theme = 1U });
+            fontUsual.Append(new FontName() { Val = "Times New Roman" });
+            fontUsual.Append(new FontFamilyNumbering() { Val = 2 });
+            fontUsual.Append(new FontScheme() { Val = FontSchemeValues.Minor });
+
+            // Настройка шрифта заголока
+            var fontTitle = new Font();
+            fontTitle.Append(new Bold());
+            fontTitle.Append(new FontSize() { Val = 14D });
+            fontTitle.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color() { Theme = 1U });
+            fontTitle.Append(new FontName() { Val = "Times New Roman" });
+            fontTitle.Append(new FontFamilyNumbering() { Val = 2 });
+            fontTitle.Append(new FontScheme() { Val = FontSchemeValues.Minor });
+
+            // Добавление созданных шрифтов
+            fonts.Append(fontUsual);
+            fonts.Append(fontTitle);
+
+            // Создание заливки
+            var fills = new Fills() { Count = 2U };
+
+            var fill1 = new Fill();
+            fill1.Append(new PatternFill()
+            {
+                PatternType = PatternValues.None
+            });
+
+            var fill2 = new Fill();
+            fill2.Append(new PatternFill()
+            {
+                PatternType = PatternValues.Gray125
+            });
+
+            fills.Append(fill1);
+            fills.Append(fill2);
+
+            // Стиль границ ячейки - незакрашенный (для заголовка) и закрашенный
+            var borders = new Borders() { Count = 2U };
+
+            var borderNoBorder = new Border();
+            borderNoBorder.Append(new LeftBorder());
+            borderNoBorder.Append(new RightBorder());
+            borderNoBorder.Append(new TopBorder());
+            borderNoBorder.Append(new BottomBorder());
+            borderNoBorder.Append(new DiagonalBorder());
+
+            var borderThin = new Border();
+
+            var leftBorder = new LeftBorder() { Style = BorderStyleValues.Thin };
+            leftBorder.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color() { Indexed = 64U });
+
+            var rightBorder = new RightBorder()
+            {
+                Style = BorderStyleValues.Thin
+            };
+            rightBorder.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color() { Indexed = 64U });
+
+            var topBorder = new TopBorder() { Style = BorderStyleValues.Thin };
+            topBorder.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color() { Indexed = 64U });
+
+            var bottomBorder = new BottomBorder()
+            {
+                Style = BorderStyleValues.Thin
+            };
+            bottomBorder.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color() { Indexed = 64U });
+
+            borderThin.Append(leftBorder);
+            borderThin.Append(rightBorder);
+            borderThin.Append(topBorder);
+            borderThin.Append(bottomBorder);
+            borderThin.Append(new DiagonalBorder());
+
+            borders.Append(borderNoBorder);
+            borders.Append(borderThin);
+
+            // Формирование CellFormat из комбинаций шрифтов, заливок и т. д.
+            var cellStyleFormats = new CellStyleFormats() { Count = 1U };
+
+            var cellFormatStyle = new CellFormat()
+            {
+                NumberFormatId = 0U,
+                FontId = 0U,
+                FillId = 0U,
+                BorderId = 0U
+            };
+
+            cellStyleFormats.Append(cellFormatStyle);
+
+            var cellFormats = new CellFormats() { Count = 3U };
+
+            var cellFormatFont = new CellFormat()
+            {
+                NumberFormatId = 0U,
+                FontId = 0U,
+                FillId = 0U,
+                BorderId = 0U,
+                FormatId = 0U,
+                ApplyFont = true
+            };
+
+            var cellFormatFontAndBorder = new CellFormat()
+            {
+                NumberFormatId = 0U,
+                FontId = 0U,
+                FillId = 0U,
+                BorderId = 1U,
+                FormatId = 0U,
+                ApplyFont = true,
+                ApplyBorder = true
+            };
+
+            var cellFormatTitle = new CellFormat()
+            {
+                NumberFormatId = 0U,
+                FontId = 1U,
+                FillId = 0U,
+                BorderId = 0U,
+                FormatId = 0U,
+                Alignment = new Alignment()
+                {
+                    Vertical = VerticalAlignmentValues.Center,
+                    WrapText = true,
+                    Horizontal = HorizontalAlignmentValues.Center
+                },
+                ApplyFont = true
+            };
+
+            // По итогу создали 3 стиля
+            cellFormats.Append(cellFormatFont);
+            cellFormats.Append(cellFormatFontAndBorder);
+            cellFormats.Append(cellFormatTitle);
+
+            var cellStyles = new CellStyles() { Count = 1U };
+
+            cellStyles.Append(new CellStyle()
+            {
+                Name = "Normal",
+                FormatId = 0U,
+                BuiltinId = 0U
+            });
+
+            var differentialFormats = new DocumentFormat.OpenXml.Office2013.Excel.DifferentialFormats() { Count = 0U };
+
+            var tableStyles = new TableStyles()
+            {
+                Count = 0U,
+                DefaultTableStyle = "TableStyleMedium2",
+                DefaultPivotStyle = "PivotStyleLight16"
+            };
+
+            var stylesheetExtensionList = new StylesheetExtensionList();
+            var stylesheetExtension1 = new StylesheetExtension()
+            {
+                Uri = "{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}"
+            };
+
+            stylesheetExtension1.AddNamespaceDeclaration("x14", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main");
+            stylesheetExtension1.Append(new SlicerStyles()
+            {
+                DefaultSlicerStyle = "SlicerStyleLight1"
+            });
+
+            var stylesheetExtension2 = new StylesheetExtension()
+            {
+                Uri = "{9260A510-F301-46a8-8635-F512D64BE5F5}"
+            };
+
+            stylesheetExtension2.AddNamespaceDeclaration("x15", "http://schemas.microsoft.com/office/spreadsheetml/2010/11/main");
+
+            stylesheetExtension2.Append(new TimelineStyles()
+            {
+                DefaultTimelineStyle = "TimeSlicerStyleLight1"
+            });
+
+            stylesheetExtensionList.Append(stylesheetExtension1);
+            stylesheetExtensionList.Append(stylesheetExtension2);
+
+            sp.Stylesheet.Append(fonts);
+            sp.Stylesheet.Append(fills);
+            sp.Stylesheet.Append(borders);
+            sp.Stylesheet.Append(cellStyleFormats);
+            sp.Stylesheet.Append(cellFormats);
+            sp.Stylesheet.Append(cellStyles);
+            sp.Stylesheet.Append(differentialFormats);
+            sp.Stylesheet.Append(tableStyles);
+            sp.Stylesheet.Append(stylesheetExtensionList);
+        }
+
+        // Получение номера стиля (одного из 3-х нами созданных) из типа
+        private static uint GetStyleValue(ExcelStyleInfoType styleInfo)
+        {
+            return styleInfo switch
+            {
+                ExcelStyleInfoType.Title => 2U,
+                ExcelStyleInfoType.TextWithBorder => 1U,
+                ExcelStyleInfoType.Text => 0U,
+                _ => 0U,
+            };
+        }
+
+        protected override void CreateExcel(ExcelInfo info)
+        {
+            // Создаём документ Excel
+            _spreadsheetDocument = SpreadsheetDocument.Create(info.FileName, SpreadsheetDocumentType.Workbook);
+
+            // Создаем книгу (в ней хранятся листы)
+            var workbookpart = _spreadsheetDocument.AddWorkbookPart();
+
+            workbookpart.Workbook = new Workbook();
+
+            CreateStyles(workbookpart);
+
+            // Получаем/создаем хранилище текстов для книги
+            _shareStringPart = _spreadsheetDocument.WorkbookPart!.GetPartsOfType<SharedStringTablePart>().Any()
+                ? _spreadsheetDocument.WorkbookPart.GetPartsOfType<SharedStringTablePart>().First()
+                : _spreadsheetDocument.WorkbookPart.AddNewPart<SharedStringTablePart>();
+
+            // Создаем SharedStringTable, если его нет
+            if (_shareStringPart.SharedStringTable == null)
+            {
+                _shareStringPart.SharedStringTable = new SharedStringTable();
+            }
+
+            // Создаем лист в книгу
+            var worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
+            worksheetPart.Worksheet = new Worksheet(new SheetData());
+
+            // Добавляем лист в книгу
+            var sheets = _spreadsheetDocument.WorkbookPart.Workbook.AppendChild(new Sheets());
+
+            var sheet = new Sheet()
+            {
+                Id = _spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart),
+                SheetId = 1,
+                Name = "Лист"
+            };
+
+            sheets.Append(sheet);
+
+            _worksheet = worksheetPart.Worksheet;
+        }
+
+        // Метод вставки в лист книги
+        protected override void InsertCellInWorksheet(ExcelCellParameters excelParams)
+        {
+            if (_worksheet == null || _shareStringPart == null)
+            {
+                return;
+            }
+
+            var sheetData = _worksheet.GetFirstChild<SheetData>();
+
+            if (sheetData == null)
+            {
+                return;
+            }
+
+            // Ищем строку, либо добавляем ее
+            Row row;
+
+            if (sheetData.Elements<Row>().Where(r => r.RowIndex! == excelParams.RowIndex).Any())
+            {
+                row = sheetData.Elements<Row>().Where(r => r.RowIndex! == excelParams.RowIndex).First();
+            }
+            else
+            {
+                row = new Row() { RowIndex = excelParams.RowIndex };
+                sheetData.Append(row);
+            }
+
+            // Ищем нужную ячейку
+            Cell cell;
+
+            if (row.Elements<Cell>().Where(c => c.CellReference!.Value == excelParams.CellReference).Any())
+            {
+                cell = row.Elements<Cell>().Where(c => c.CellReference!.Value == excelParams.CellReference).First();
+            }
+            else
+            {
+                // Все ячейки должны быть последовательно друг за другом расположены
+                // Нужно определить, после какой вставлять
+                Cell? refCell = null;
+
+                foreach (Cell rowCell in row.Elements<Cell>())
+                {
+                    if (string.Compare(rowCell.CellReference!.Value, excelParams.CellReference, true) > 0)
+                    {
+                        refCell = rowCell;
+                        break;
+                    }
+                }
+
+                var newCell = new Cell()
+                {
+                    CellReference = excelParams.CellReference
+                };
+
+                row.InsertBefore(newCell, refCell);
+                cell = newCell;
+            }
+
+            // Вставляем новый текст
+            _shareStringPart.SharedStringTable.AppendChild(new SharedStringItem(new Text(excelParams.Text)));
+            _shareStringPart.SharedStringTable.Save();
+
+            cell.CellValue = new CellValue((_shareStringPart.SharedStringTable.Elements<SharedStringItem>().Count() - 1).ToString());
+            cell.DataType = new EnumValue<CellValues>(CellValues.SharedString);
+            cell.StyleIndex = GetStyleValue(excelParams.StyleInfo);
+        }
+
+        // Метод объединения ячеек
+        protected override void MergeCells(ExcelMergeParameters excelParams)
+        {
+            if (_worksheet == null)
+            {
+                return;
+            }
+
+            MergeCells mergeCells;
+
+            if (_worksheet.Elements<MergeCells>().Any())
+            {
+                mergeCells = _worksheet.Elements<MergeCells>().First();
+            }
+            else
+            {
+                mergeCells = new MergeCells();
+
+                if (_worksheet.Elements<CustomSheetView>().Any())
+                {
+                    _worksheet.InsertAfter(mergeCells, _worksheet.Elements<CustomSheetView>().First());
+                }
+                else
+                {
+                    _worksheet.InsertAfter(mergeCells, _worksheet.Elements<SheetData>().First());
+                }
+            }
+
+            var mergeCell = new MergeCell()
+            {
+                Reference = new StringValue(excelParams.Merge)
+            };
+
+            mergeCells.Append(mergeCell);
+        }
+
+        protected override void SaveExcel(ExcelInfo info)
+        {
+            if (_spreadsheetDocument == null)
+            {
+                return;
+            }
+
+            _spreadsheetDocument.WorkbookPart!.Workbook.Save();
+            _spreadsheetDocument.Dispose();
+        }
+    }
+}
diff --git a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/Implements/SaveToPdf.cs b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/Implements/SaveToPdf.cs
new file mode 100644
index 0000000..abed695
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/Implements/SaveToPdf.cs
@@ -0,0 +1,130 @@
+using FurnitureAssemblyBusinessLogic.OfficePackage.HelperEnums;
+using FurnitureAssemblyBusinessLogic.OfficePackage.HelperModels;
+using MigraDoc.DocumentObjectModel;
+using MigraDoc.DocumentObjectModel.Tables;
+using MigraDoc.Rendering;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FurnitureAssemblyBusinessLogic.OfficePackage.Implements
+{
+    public class SaveToPdf : AbstractSaveToPdf
+    {
+        private Document? _document;
+
+        private Section? _section;
+
+        private Table? _table;
+
+        // Преобразование необходимого типа выравнивания в соотвествующее выравнивание в MigraDoc
+        private static ParagraphAlignment GetParagraphAlignment(PdfParagraphAlignmentType type)
+        {
+            return type switch
+            {
+                PdfParagraphAlignmentType.Center => ParagraphAlignment.Center,
+                PdfParagraphAlignmentType.Left => ParagraphAlignment.Left,
+                PdfParagraphAlignmentType.Right => ParagraphAlignment.Right,
+                _ => ParagraphAlignment.Justify,
+            };
+        }
+
+        // Создание стилей для документа
+        private static void DefineStyles(Document document)
+        {
+            var style = document.Styles["Normal"];
+
+            style.Font.Name = "Times New Roman";
+            style.Font.Size = 14;
+
+            style = document.Styles.AddStyle("NormalTitle", "Normal");
+            style.Font.Bold = true;
+        }
+
+        protected override void CreatePdf(PdfInfo info)
+        {
+            // Создаём документ
+            _document = new Document();
+
+            // Передаём для него стили
+            DefineStyles(_document);
+
+            // Получение первой секции документа
+            _section = _document.AddSection();
+        }
+
+        protected override void CreateParagraph(PdfParagraph pdfParagraph)
+        {
+            if (_section == null)
+            {
+                return;
+            }
+
+            var paragraph = _section.AddParagraph(pdfParagraph.Text);
+            paragraph.Format.SpaceAfter = "1cm";
+            paragraph.Format.Alignment = GetParagraphAlignment(pdfParagraph.ParagraphAlignment);
+            paragraph.Style = pdfParagraph.Style;
+        }
+
+        protected override void CreateTable(List<string> columns)
+        {
+            if (_document == null)
+            {
+                return;
+            }
+
+            // Добавляем таблицу в документ как последнюю секцию (?)
+            _table = _document.LastSection.AddTable();
+
+            foreach (var elem in columns)
+            {
+                _table.AddColumn(elem);
+            }
+        }
+
+        protected override void CreateRow(PdfRowParameters rowParameters)
+        {
+            if (_table == null)
+            {
+                return;
+            }
+
+            // Добавление строки в таблицу
+            var row = _table.AddRow();
+
+            for (int i = 0; i < rowParameters.Texts.Count; ++i)
+            {
+                // Ячейка добавляется добавлением параграфа
+                row.Cells[i].AddParagraph(rowParameters.Texts[i]);
+
+                if (!string.IsNullOrEmpty(rowParameters.Style))
+                {
+                    row.Cells[i].Style = rowParameters.Style;
+                }
+
+                Unit borderWidth = 0.5;
+
+                row.Cells[i].Borders.Left.Width = borderWidth;
+                row.Cells[i].Borders.Right.Width = borderWidth;
+                row.Cells[i].Borders.Top.Width = borderWidth;
+                row.Cells[i].Borders.Bottom.Width = borderWidth;
+
+                row.Cells[i].Format.Alignment = GetParagraphAlignment(rowParameters.ParagraphAlignment);
+                row.Cells[i].VerticalAlignment = VerticalAlignment.Center;
+            }
+        }
+
+        protected override void SavePdf(PdfInfo info)
+        {
+            var renderer = new PdfDocumentRenderer(true)
+            {
+                Document = _document
+            };
+
+            renderer.RenderDocument();
+            renderer.PdfDocument.Save(info.FileName);
+        }
+    }
+}
diff --git a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/Implements/SaveToWord.cs b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/Implements/SaveToWord.cs
new file mode 100644
index 0000000..dd4a426
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/OfficePackage/Implements/SaveToWord.cs
@@ -0,0 +1,158 @@
+using DocumentFormat.OpenXml.Packaging;
+using DocumentFormat.OpenXml.Wordprocessing;
+using DocumentFormat.OpenXml;
+using FurnitureAssemblyBusinessLogic.OfficePackage.HelperEnums;
+using FurnitureAssemblyBusinessLogic.OfficePackage.HelperModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FurnitureAssemblyBusinessLogic.OfficePackage.Implements
+{
+    public class SaveToWord : AbstractSaveToWord
+    {
+        private WordprocessingDocument? _wordDocument;
+
+        private Body? _docBody;
+
+        // Получение типа выравнивания
+        private static JustificationValues GetJustificationValues(WordJustificationType type)
+        {
+            // Выравнивание слева будет в том случае, если передаётся неизвестный тип выравнивания
+            return type switch
+            {
+                WordJustificationType.Both => JustificationValues.Both,
+                WordJustificationType.Center => JustificationValues.Center,
+                _ => JustificationValues.Left,
+            };
+        }
+
+        // Настройки страницы
+        private static SectionProperties CreateSectionProperties()
+        {
+            var properties = new SectionProperties();
+
+            // Прописываем портретную ориентацию
+            var pageSize = new PageSize
+            {
+                Orient = PageOrientationValues.Portrait
+            };
+
+            properties.AppendChild(pageSize);
+
+            return properties;
+        }
+
+        // Задание форматирования для абзаца
+        private static ParagraphProperties? CreateParagraphProperties(WordTextProperties? paragraphProperties)
+        {
+            if (paragraphProperties == null)
+            {
+                return null;
+            }
+
+            var properties = new ParagraphProperties();
+
+            // Вытаскиваем выравнивание текста
+            properties.AppendChild(new Justification()
+            {
+                Val = GetJustificationValues(paragraphProperties.JustificationType)
+            });
+
+            properties.AppendChild(new SpacingBetweenLines
+            {
+                LineRule = LineSpacingRuleValues.Auto
+            });
+
+            properties.AppendChild(new Indentation());
+
+            var paragraphMarkRunProperties = new ParagraphMarkRunProperties();
+
+            if (!string.IsNullOrEmpty(paragraphProperties.Size))
+            {
+                paragraphMarkRunProperties.AppendChild(new FontSize
+                {
+                    Val = paragraphProperties.Size
+                });
+            }
+
+            properties.AppendChild(paragraphMarkRunProperties);
+
+            return properties;
+        }
+
+        protected override void CreateWord(WordInfo info)
+        {
+            // Создаём документ Word
+            _wordDocument = WordprocessingDocument.Create(info.FileName, WordprocessingDocumentType.Document);
+
+            // Вытаскиваем главную часть из вордовского документа
+            MainDocumentPart mainPart = _wordDocument.AddMainDocumentPart();
+
+            mainPart.Document = new Document();
+
+            // Генерируем тело основной части документа
+            _docBody = mainPart.Document.AppendChild(new Body());
+        }
+
+        protected override void CreateParagraph(WordParagraph paragraph)
+        {
+            // Проверка на то, был ли вызван WordprocessingDocument.Create (создался ли документ) и есть ли вообще параграф для вставки
+            if (_docBody == null || paragraph == null)
+            {
+                return;
+            }
+
+            var docParagraph = new Paragraph();
+
+            // Добавляем свойства параграфа
+            docParagraph.AppendChild(CreateParagraphProperties(paragraph.TextProperties));
+
+            // Вставляем блоки текста (их называют Run)
+            foreach (var run in paragraph.Texts)
+            {
+                var docRun = new Run();
+                var properties = new RunProperties();
+
+                // Задание свойств текста - размер и жирность
+                properties.AppendChild(new FontSize { Val = run.Item2.Size });
+
+                if (run.Item2.Bold)
+                {
+                    properties.AppendChild(new Bold());
+                }
+
+                docRun.AppendChild(properties);
+
+                docRun.AppendChild(new Text
+                {
+                    Text = run.Item1,
+                    Space = SpaceProcessingModeValues.Preserve
+                });
+
+                docParagraph.AppendChild(docRun);
+            }
+
+            _docBody.AppendChild(docParagraph);
+        }
+
+        // Метод сохранения документа
+        protected override void SaveWord(WordInfo info)
+        {
+            if (_docBody == null || _wordDocument == null)
+            {
+                return;
+            }
+
+            // Вставляем информацию по секциям (смотри, что является входным параметром)
+            _docBody.AppendChild(CreateSectionProperties());
+
+            // Сохраняем документ
+            _wordDocument.MainDocumentPart!.Document.Save();
+
+            _wordDocument.Dispose();
+        }
+    }
+}
diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/BindingModels/ReportBindingModel.cs b/FurnitureAssembly/FurnitureAssemblyContracts/BindingModels/ReportBindingModel.cs
new file mode 100644
index 0000000..cbb9af9
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyContracts/BindingModels/ReportBindingModel.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FurnitureAssemblyContracts.BindingModels
+{
+    public class ReportBindingModel
+    {
+        public string FileName { get; set; } = string.Empty;
+
+        public DateTime? DateFrom { get; set; }
+
+        public DateTime? DateTo { get; set; }
+    }
+}
diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/BusinessLogicsContracts/IReportLogic.cs b/FurnitureAssembly/FurnitureAssemblyContracts/BusinessLogicsContracts/IReportLogic.cs
new file mode 100644
index 0000000..9d23c40
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyContracts/BusinessLogicsContracts/IReportLogic.cs
@@ -0,0 +1,24 @@
+using FurnitureAssemblyContracts.BindingModels;
+using FurnitureAssemblyContracts.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FurnitureAssemblyContracts.BusinessLogicsContracts
+{
+    public interface IReportLogic
+    {
+        List<ReportFurnitureWorkPieceViewModel> GetFurnitureWorkPiece();
+
+        List<ReportOrdersViewModel> GetOrders(ReportBindingModel model);
+
+        void SaveFurnituresToWordFile(ReportBindingModel model);
+
+        void SaveFurnitureWorkPieceToExcelFile(ReportBindingModel model);
+
+        void SaveOrdersToPdfFile(ReportBindingModel model);
+
+    }
+}
diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/SearchModels/OrderSearchModel.cs b/FurnitureAssembly/FurnitureAssemblyContracts/SearchModels/OrderSearchModel.cs
index c0a8f4e..e21004c 100644
--- a/FurnitureAssembly/FurnitureAssemblyContracts/SearchModels/OrderSearchModel.cs
+++ b/FurnitureAssembly/FurnitureAssemblyContracts/SearchModels/OrderSearchModel.cs
@@ -11,5 +11,8 @@ namespace FurnitureAssemblyContracts.SearchModels
     {
         // для поиска по идентификатору
         public int? Id { get; set; }
+        public DateTime? DateFrom { get; set; }
+
+        public DateTime? DateTo { get; set; }
     }
 }
diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/ReportFurnitureWorkPieceViewModel.cs b/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/ReportFurnitureWorkPieceViewModel.cs
new file mode 100644
index 0000000..594748d
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/ReportFurnitureWorkPieceViewModel.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FurnitureAssemblyContracts.ViewModels
+{
+    public class ReportFurnitureWorkPieceViewModel
+    {
+
+        public string FurnitureName { get; set; } = string.Empty;
+
+        public int TotalCount { get; set; }
+        public List<(string WorkPiece, int Count)> WorkPieces { get; set; } = new();
+
+    }
+}
diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/ReportOrdersViewModel.cs b/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/ReportOrdersViewModel.cs
new file mode 100644
index 0000000..eae90d5
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/ReportOrdersViewModel.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FurnitureAssemblyContracts.ViewModels
+{
+    public class ReportOrdersViewModel
+    {
+        public int Id { get; set; }
+
+        public DateTime DateCreate { get; set; }
+
+        public string FurnitureName { get; set; } = string.Empty;
+
+        public double Sum { get; set; }
+
+        public string OrderStatus { get; set; }
+    }
+}
diff --git a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/OrderStorage.cs b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/OrderStorage.cs
index 91d2c94..c618282 100644
--- a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/OrderStorage.cs
+++ b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/OrderStorage.cs
@@ -30,13 +30,20 @@ namespace FurnitureAssemblyDatabaseImplement.Implements
 
         public List<OrderViewModel> GetFilteredList(OrderSearchModel model)
         {
-            if (!model.Id.HasValue)
+            if (!model.Id.HasValue && !model.DateFrom.HasValue && !model.DateTo.HasValue)
             {
                 return new();
             }
 
             using var context = new FurnitureAssemblyDatabase();
-
+            if (!model.Id.HasValue && model.DateFrom.HasValue && model.DateTo.HasValue)
+            {
+                return context.Orders
+                .Include(x => x.Furniture)
+                    .Where(x => x.DateCreate >= model.DateFrom && x.DateCreate <= model.DateTo)
+                .Select(x => x.GetViewModel)
+                .ToList();
+            }
             return context.Orders
                 .Include(x => x.Furniture)
                 .Where(x => x.Id == model.Id)
@@ -92,10 +99,12 @@ namespace FurnitureAssemblyDatabaseImplement.Implements
 
             if (element != null)
             {
+                var deletedElement = context.Orders.Include(x => x.Furniture)
+                    .FirstOrDefault(x => x.Id == model.Id)?.GetViewModel;
                 context.Orders.Remove(element);
                 context.SaveChanges();
 
-                return element.GetViewModel;
+                return deletedElement;
             }
 
             return null;
diff --git a/FurnitureAssembly/FurnitureAssemblyFileImplement/Implements/OrderStorage.cs b/FurnitureAssembly/FurnitureAssemblyFileImplement/Implements/OrderStorage.cs
index d624de4..1c29586 100644
--- a/FurnitureAssembly/FurnitureAssemblyFileImplement/Implements/OrderStorage.cs
+++ b/FurnitureAssembly/FurnitureAssemblyFileImplement/Implements/OrderStorage.cs
@@ -27,9 +27,10 @@ namespace FurnitureAssemblyFileImplement.Implements
 
         public List<OrderViewModel> GetFilteredList(OrderSearchModel model)
         {
-            if (!model.Id.HasValue)
+            if (!model.Id.HasValue && model.DateFrom.HasValue && model.DateTo.HasValue)
             {
-                return new();
+                return source.Orders.Where(x => x.DateCreate >= model.DateFrom && x.DateCreate <= model.DateTo)
+                   .Select(x => GetViewModel(x)).ToList();
             }
 
             return source.Orders.Where(x => x.Id == model.Id).Select(x => GetViewModel(x)).ToList();
diff --git a/FurnitureAssembly/FurnitureAssemblyListImplement/Implements/OrderStorage.cs b/FurnitureAssembly/FurnitureAssemblyListImplement/Implements/OrderStorage.cs
index 96649c8..a67aed5 100644
--- a/FurnitureAssembly/FurnitureAssemblyListImplement/Implements/OrderStorage.cs
+++ b/FurnitureAssembly/FurnitureAssemblyListImplement/Implements/OrderStorage.cs
@@ -37,8 +37,16 @@ namespace FurnitureAssemblyListImplement.Implements
         {
             var result = new List<OrderViewModel>();
 
-            if(!model.Id.HasValue)
+            if(!model.Id.HasValue && model.DateFrom.HasValue && model.DateTo.HasValue)
             {
+                foreach (var order in _source.Orders)
+                {
+                    if (order.DateCreate >= model.DateFrom && order.DateCreate <= model.DateTo)
+                    {
+                        result.Add(GetViewModel(order));
+                    }
+                }
+
                 return result;
             }
 
diff --git a/FurnitureAssembly/FurnitureAssemblyView/FormMain.Designer.cs b/FurnitureAssembly/FurnitureAssemblyView/FormMain.Designer.cs
index 40e5f1e..34cc74c 100644
--- a/FurnitureAssembly/FurnitureAssemblyView/FormMain.Designer.cs
+++ b/FurnitureAssembly/FurnitureAssemblyView/FormMain.Designer.cs
@@ -38,6 +38,10 @@
             this.toolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
             this.workPieceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
             this.furnitureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.отчётыToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.списокКомпонентовToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.компонентыПоИзделиямToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.списокЗаказовToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
             ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
             this.menuStrip.SuspendLayout();
             this.SuspendLayout();
@@ -112,7 +116,8 @@
             // 
             this.menuStrip.ImageScalingSize = new System.Drawing.Size(20, 20);
             this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.toolStripMenuItem});
+            this.toolStripMenuItem,
+            this.отчётыToolStripMenuItem});
             this.menuStrip.Location = new System.Drawing.Point(0, 0);
             this.menuStrip.Name = "menuStrip";
             this.menuStrip.Padding = new System.Windows.Forms.Padding(5, 2, 0, 2);
@@ -132,17 +137,45 @@
             // workPieceToolStripMenuItem
             // 
             this.workPieceToolStripMenuItem.Name = "workPieceToolStripMenuItem";
-            this.workPieceToolStripMenuItem.Size = new System.Drawing.Size(130, 22);
+            this.workPieceToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
             this.workPieceToolStripMenuItem.Text = "Заготовки";
             this.workPieceToolStripMenuItem.Click += new System.EventHandler(this.WorkPieceToolStripMenuItem_Click);
             // 
             // furnitureToolStripMenuItem
             // 
             this.furnitureToolStripMenuItem.Name = "furnitureToolStripMenuItem";
-            this.furnitureToolStripMenuItem.Size = new System.Drawing.Size(130, 22);
+            this.furnitureToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
             this.furnitureToolStripMenuItem.Text = "Изделия";
             this.furnitureToolStripMenuItem.Click += new System.EventHandler(this.FurnitureToolStripMenuItem_Click);
             // 
+            // отчётыToolStripMenuItem
+            // 
+            this.отчётыToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.списокКомпонентовToolStripMenuItem,
+            this.компонентыПоИзделиямToolStripMenuItem,
+            this.списокЗаказовToolStripMenuItem});
+            this.отчётыToolStripMenuItem.Name = "отчётыToolStripMenuItem";
+            this.отчётыToolStripMenuItem.Size = new System.Drawing.Size(60, 20);
+            this.отчётыToolStripMenuItem.Text = "Отчеты";
+            // 
+            // списокКомпонентовToolStripMenuItem
+            // 
+            this.списокКомпонентовToolStripMenuItem.Name = "списокКомпонентовToolStripMenuItem";
+            this.списокКомпонентовToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
+            this.списокКомпонентовToolStripMenuItem.Text = "Список компонентов";
+            // 
+            // компонентыПоИзделиямToolStripMenuItem
+            // 
+            this.компонентыПоИзделиямToolStripMenuItem.Name = "компонентыПоИзделиямToolStripMenuItem";
+            this.компонентыПоИзделиямToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
+            this.компонентыПоИзделиямToolStripMenuItem.Text = "Компоненты по изделиям";
+            // 
+            // списокЗаказовToolStripMenuItem
+            // 
+            this.списокЗаказовToolStripMenuItem.Name = "списокЗаказовToolStripMenuItem";
+            this.списокЗаказовToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
+            this.списокЗаказовToolStripMenuItem.Text = "Список заказов";
+            // 
             // FormMain
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
@@ -180,5 +213,9 @@
         private ToolStripMenuItem toolStripMenuItem;
         private ToolStripMenuItem workPieceToolStripMenuItem;
         private ToolStripMenuItem furnitureToolStripMenuItem;
+        private ToolStripMenuItem отчётыToolStripMenuItem;
+        private ToolStripMenuItem списокКомпонентовToolStripMenuItem;
+        private ToolStripMenuItem компонентыПоИзделиямToolStripMenuItem;
+        private ToolStripMenuItem списокЗаказовToolStripMenuItem;
     }
 }
\ No newline at end of file
diff --git a/FurnitureAssembly/FurnitureAssemblyView/FormReportFurnitureWorkPieces.Designer.cs b/FurnitureAssembly/FurnitureAssemblyView/FormReportFurnitureWorkPieces.Designer.cs
new file mode 100644
index 0000000..b4072aa
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyView/FormReportFurnitureWorkPieces.Designer.cs
@@ -0,0 +1,102 @@
+namespace FurnitureAssemblyView
+{
+    partial class FormReportFurnitureWorkPieces
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.dataGridView = new System.Windows.Forms.DataGridView();
+            this.ColumnWorkPiece = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.ColumnFurniture = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.ColumnCount = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.buttonSaveToExcel = new System.Windows.Forms.Button();
+            ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // dataGridView
+            // 
+            this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+            this.dataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
+            this.ColumnWorkPiece,
+            this.ColumnFurniture,
+            this.ColumnCount});
+            this.dataGridView.Location = new System.Drawing.Point(12, 75);
+            this.dataGridView.Name = "dataGridView";
+            this.dataGridView.RowTemplate.Height = 25;
+            this.dataGridView.Size = new System.Drawing.Size(631, 310);
+            this.dataGridView.TabIndex = 0;
+            // 
+            // ColumnWorkPiece
+            // 
+            this.ColumnWorkPiece.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
+            this.ColumnWorkPiece.HeaderText = "Заготовка";
+            this.ColumnWorkPiece.Name = "ColumnWorkPiece";
+            // 
+            // ColumnFurniture
+            // 
+            this.ColumnFurniture.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
+            this.ColumnFurniture.HeaderText = "Изделие";
+            this.ColumnFurniture.Name = "ColumnFurniture";
+            // 
+            // ColumnCount
+            // 
+            this.ColumnCount.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
+            this.ColumnCount.HeaderText = "Количество";
+            this.ColumnCount.Name = "ColumnCount";
+            // 
+            // buttonSaveToExcel
+            // 
+            this.buttonSaveToExcel.Location = new System.Drawing.Point(491, 35);
+            this.buttonSaveToExcel.Name = "buttonSaveToExcel";
+            this.buttonSaveToExcel.Size = new System.Drawing.Size(152, 34);
+            this.buttonSaveToExcel.TabIndex = 1;
+            this.buttonSaveToExcel.Text = "Сохранить в excel";
+            this.buttonSaveToExcel.UseVisualStyleBackColor = true;
+            this.buttonSaveToExcel.Click += new System.EventHandler(this.buttonSaveToExcel_Click);
+            // 
+            // FormReportFurnitureWorkPieces
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(655, 397);
+            this.Controls.Add(this.buttonSaveToExcel);
+            this.Controls.Add(this.dataGridView);
+            this.Name = "FormReportFurnitureWorkPieces";
+            this.Text = "Заготовки по изделиям";
+            ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private DataGridView dataGridView;
+        private DataGridViewTextBoxColumn ColumnWorkPiece;
+        private DataGridViewTextBoxColumn ColumnFurniture;
+        private DataGridViewTextBoxColumn ColumnCount;
+        private Button buttonSaveToExcel;
+    }
+}
\ No newline at end of file
diff --git a/FurnitureAssembly/FurnitureAssemblyView/FormReportFurnitureWorkPieces.cs b/FurnitureAssembly/FurnitureAssemblyView/FormReportFurnitureWorkPieces.cs
new file mode 100644
index 0000000..936d391
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyView/FormReportFurnitureWorkPieces.cs
@@ -0,0 +1,92 @@
+using FurnitureAssemblyContracts.BindingModels;
+using FurnitureAssemblyContracts.BusinessLogicsContracts;
+using Microsoft.Extensions.Logging;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace FurnitureAssemblyView
+{
+    public partial class FormReportFurnitureWorkPieces : Form
+    {
+        private readonly ILogger _logger;
+
+        private readonly IReportLogic _logic;
+
+        public FormReportFurnitureWorkPieces(ILogger<FormReportFurnitureWorkPieces> logger, IReportLogic logic)
+        {
+            InitializeComponent();
+            _logger = logger;
+            _logic = logic;
+        }
+
+        private void FormReportFurnitureWorkPieces_Load(object sender, EventArgs e)
+        {
+            try
+            {
+                var dict = _logic.GetFurnitureWorkPiece();
+
+                if (dict != null)
+                {
+                    dataGridView.Rows.Clear();
+
+                    foreach (var elem in dict)
+                    {
+                        dataGridView.Rows.Add(new object[] { elem.FurnitureName, "", "" });
+
+                        foreach (var listElem in elem.WorkPieces)
+                        {
+                            dataGridView.Rows.Add(new object[] { "", listElem.Item1, listElem.Item2 });
+                        }
+
+                        dataGridView.Rows.Add(new object[] { "Итого", "", elem.TotalCount });
+                        dataGridView.Rows.Add(Array.Empty<object>());
+                    }
+                }
+
+                _logger.LogInformation("Загрузка списка изделий по заготовкам");
+            }
+            catch (Exception ex)
+            {
+                _logger.LogError(ex, "Ошибка загрузки списка изделий по заготовкам");
+
+                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+            }
+        }
+
+        private void buttonSaveToExcel_Click(object sender, EventArgs e)
+        {
+            using var dialog = new SaveFileDialog
+            {
+                Filter = "xlsx|*.xlsx"
+            };
+
+            if (dialog.ShowDialog() == DialogResult.OK)
+            {
+                try
+                {
+                    _logic.SaveFurnitureWorkPieceToExcelFile(new ReportBindingModel
+                    {
+                        FileName = dialog.FileName
+                    });
+
+                    _logger.LogInformation("Сохранение списка изделий по заготовкам");
+
+                    MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
+                }
+                catch (Exception ex)
+                {
+                    _logger.LogError(ex, "Ошибка сохранения списка изделий по заготовкам");
+
+                    MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+            }
+        }
+    }
+}
diff --git a/FurnitureAssembly/FurnitureAssemblyView/FormReportFurnitureWorkPieces.resx b/FurnitureAssembly/FurnitureAssemblyView/FormReportFurnitureWorkPieces.resx
new file mode 100644
index 0000000..5f4020a
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyView/FormReportFurnitureWorkPieces.resx
@@ -0,0 +1,78 @@
+<root>
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="ColumnWorkPiece.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="ColumnFurniture.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="ColumnCount.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="ColumnWorkPiece.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="ColumnFurniture.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="ColumnCount.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+</root>
\ No newline at end of file
diff --git a/FurnitureAssembly/FurnitureAssemblyView/FormReportOrders.Designer.cs b/FurnitureAssembly/FurnitureAssemblyView/FormReportOrders.Designer.cs
new file mode 100644
index 0000000..aca9604
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyView/FormReportOrders.Designer.cs
@@ -0,0 +1,130 @@
+namespace FurnitureAssemblyView
+{
+    partial class FormReportOrders
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.panel = new System.Windows.Forms.Panel();
+            this.labelS = new System.Windows.Forms.Label();
+            this.label1 = new System.Windows.Forms.Label();
+            this.buttonMake = new System.Windows.Forms.Button();
+            this.buttonToPdf = new System.Windows.Forms.Button();
+            this.dateTimePickerFrom = new System.Windows.Forms.DateTimePicker();
+            this.dateTimePickerTo = new System.Windows.Forms.DateTimePicker();
+            this.panel.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // panel
+            // 
+            this.panel.Controls.Add(this.dateTimePickerTo);
+            this.panel.Controls.Add(this.buttonToPdf);
+            this.panel.Controls.Add(this.dateTimePickerFrom);
+            this.panel.Controls.Add(this.buttonMake);
+            this.panel.Controls.Add(this.label1);
+            this.panel.Controls.Add(this.labelS);
+            this.panel.Location = new System.Drawing.Point(12, 12);
+            this.panel.Name = "panel";
+            this.panel.Size = new System.Drawing.Size(874, 73);
+            this.panel.TabIndex = 0;
+            // 
+            // labelS
+            // 
+            this.labelS.AutoSize = true;
+            this.labelS.Location = new System.Drawing.Point(17, 28);
+            this.labelS.Name = "labelS";
+            this.labelS.Size = new System.Drawing.Size(15, 15);
+            this.labelS.TabIndex = 0;
+            this.labelS.Text = "C";
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(258, 33);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(21, 15);
+            this.label1.TabIndex = 1;
+            this.label1.Text = "по";
+            // 
+            // buttonMake
+            // 
+            this.buttonMake.Location = new System.Drawing.Point(573, 12);
+            this.buttonMake.Name = "buttonMake";
+            this.buttonMake.Size = new System.Drawing.Size(118, 41);
+            this.buttonMake.TabIndex = 2;
+            this.buttonMake.Text = "Создать";
+            this.buttonMake.UseVisualStyleBackColor = true;
+            this.buttonMake.Click += new System.EventHandler(this.buttonMake_Click);
+            // 
+            // buttonToPdf
+            // 
+            this.buttonToPdf.Location = new System.Drawing.Point(709, 12);
+            this.buttonToPdf.Name = "buttonToPdf";
+            this.buttonToPdf.Size = new System.Drawing.Size(118, 40);
+            this.buttonToPdf.TabIndex = 3;
+            this.buttonToPdf.Text = "В pdf";
+            this.buttonToPdf.UseVisualStyleBackColor = true;
+            this.buttonToPdf.Click += new System.EventHandler(this.buttonToPdf_Click);
+            // 
+            // dateTimePickerFrom
+            // 
+            this.dateTimePickerFrom.Location = new System.Drawing.Point(82, 28);
+            this.dateTimePickerFrom.Name = "dateTimePickerFrom";
+            this.dateTimePickerFrom.Size = new System.Drawing.Size(136, 23);
+            this.dateTimePickerFrom.TabIndex = 4;
+            // 
+            // dateTimePickerTo
+            // 
+            this.dateTimePickerTo.Location = new System.Drawing.Point(303, 29);
+            this.dateTimePickerTo.Name = "dateTimePickerTo";
+            this.dateTimePickerTo.Size = new System.Drawing.Size(148, 23);
+            this.dateTimePickerTo.TabIndex = 5;
+            // 
+            // FormReportOrders
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(898, 297);
+            this.Controls.Add(this.panel);
+            this.Name = "FormReportOrders";
+            this.Text = "Заказы";
+            this.panel.ResumeLayout(false);
+            this.panel.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private Panel panel;
+        private Label label1;
+        private Label labelS;
+        private Button buttonToPdf;
+        private Button buttonMake;
+        private DateTimePicker dateTimePickerFrom;
+        private DateTimePicker dateTimePickerTo;
+    }
+}
\ No newline at end of file
diff --git a/FurnitureAssembly/FurnitureAssemblyView/FormReportOrders.cs b/FurnitureAssembly/FurnitureAssemblyView/FormReportOrders.cs
new file mode 100644
index 0000000..fa4878f
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyView/FormReportOrders.cs
@@ -0,0 +1,120 @@
+using FurnitureAssemblyContracts.BusinessLogicsContracts;
+using FurnitureAssemblyContracts.BindingModels;
+using Microsoft.Extensions.Logging;
+using Microsoft.Reporting.WinForms;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace FurnitureAssemblyView
+{
+    public partial class FormReportOrders : Form
+    {
+        private readonly ReportViewer reportViewer;
+
+        private readonly ILogger _logger;
+
+        private readonly IReportLogic _logic;
+        public FormReportOrders(ILogger<FormReportOrders> logger, IReportLogic logic)
+        {
+            InitializeComponent();
+
+            _logger = logger;
+            _logic = logic;
+
+            reportViewer = new ReportViewer
+            {
+                Dock = DockStyle.Fill
+            };
+
+            reportViewer.LocalReport.LoadReportDefinition(new FileStream("ReportOrders.rdlc", FileMode.Open));
+
+            Controls.Clear();
+            Controls.Add(reportViewer);
+            Controls.Add(panel);
+        }
+
+        private void buttonMake_Click(object sender, EventArgs e)
+        {
+            if (dateTimePickerFrom.Value.Date >= dateTimePickerTo.Value.Date)
+            {
+                MessageBox.Show("Дата начала должна быть меньше даты окончания", "Ошибка",
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);
+
+                return;
+            }
+            try
+            {
+                var dataSource = _logic.GetOrders(new ReportBindingModel
+                {
+                    DateFrom = dateTimePickerFrom.Value,
+                    DateTo = dateTimePickerTo.Value
+                });
+
+                var source = new ReportDataSource("DataSetOrders", dataSource);
+
+                reportViewer.LocalReport.DataSources.Clear();
+                reportViewer.LocalReport.DataSources.Add(source);
+
+                var parameters = new[] { new ReportParameter("ReportParameterPeriod",
+                    $"c {dateTimePickerFrom.Value.ToShortDateString()} по {dateTimePickerTo.Value.ToShortDateString()}") };
+
+                reportViewer.LocalReport.SetParameters(parameters);
+                reportViewer.RefreshReport();
+
+                _logger.LogInformation("Загрузка списка заказов на период {From}-{To}", dateTimePickerFrom.Value.ToShortDateString(),
+                    dateTimePickerTo.Value.ToShortDateString());
+            }
+            catch (Exception ex)
+            {
+                _logger.LogError(ex, "Ошибка загрузки списка заказов на период");
+                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+            }
+        }
+
+        private void buttonToPdf_Click(object sender, EventArgs e)
+        {
+            if (dateTimePickerFrom.Value.Date >= dateTimePickerTo.Value.Date)
+            {
+                MessageBox.Show("Дата начала должна быть меньше даты окончания", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+
+                return;
+            }
+
+            using var dialog = new SaveFileDialog
+            {
+                Filter = "pdf|*.pdf"
+            };
+
+            if (dialog.ShowDialog() == DialogResult.OK)
+            {
+                try
+                {
+                    _logic.SaveOrdersToPdfFile(new ReportBindingModel
+                    {
+                        FileName = dialog.FileName,
+                        DateFrom = dateTimePickerFrom.Value,
+                        DateTo = dateTimePickerTo.Value
+                    });
+
+                    _logger.LogInformation("Сохранение списка заказов на период {From}-{To}",
+                        dateTimePickerFrom.Value.ToShortDateString(), dateTimePickerTo.Value.ToShortDateString());
+
+                    MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
+                }
+                catch (Exception ex)
+                {
+                    _logger.LogError(ex, "Ошибка сохранения списка заказов на период");
+
+                    MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+            }
+        }
+    }
+}
diff --git a/FurnitureAssembly/FurnitureAssemblyView/FormReportOrders.resx b/FurnitureAssembly/FurnitureAssemblyView/FormReportOrders.resx
new file mode 100644
index 0000000..f298a7b
--- /dev/null
+++ b/FurnitureAssembly/FurnitureAssemblyView/FormReportOrders.resx
@@ -0,0 +1,60 @@
+<root>
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/FurnitureAssembly/FurnitureAssemblyView/FurnitureAssemblyView.csproj b/FurnitureAssembly/FurnitureAssemblyView/FurnitureAssemblyView.csproj
index e0112f5..e1cef5d 100644
--- a/FurnitureAssembly/FurnitureAssemblyView/FurnitureAssemblyView.csproj
+++ b/FurnitureAssembly/FurnitureAssemblyView/FurnitureAssemblyView.csproj
@@ -15,6 +15,7 @@
     </PackageReference>
     <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
     <PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
+    <PackageReference Include="Microsoft.Reporting.WinForms.v11" Version="1.0.0" />
     <PackageReference Include="NLog.Extensions.Logging" Version="5.3.8" />
   </ItemGroup>