diff --git a/ShipyardView/FormReportShipComponents.Designer.cs b/ShipyardView/FormReportShipComponents.Designer.cs
new file mode 100644
index 0000000..d6cd552
--- /dev/null
+++ b/ShipyardView/FormReportShipComponents.Designer.cs
@@ -0,0 +1,101 @@
+namespace ShipyardView
+{
+ partial class FormReportShipComponents
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ dataGridView = new DataGridView();
+ ComponentColumn = new DataGridViewTextBoxColumn();
+ ShipColumn = new DataGridViewTextBoxColumn();
+ CountColumn = new DataGridViewTextBoxColumn();
+ buttonSave = new Button();
+ ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
+ SuspendLayout();
+ //
+ // dataGridView
+ //
+ dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
+ dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ dataGridView.Columns.AddRange(new DataGridViewColumn[] { ComponentColumn, ShipColumn, CountColumn });
+ dataGridView.Location = new Point(12, 93);
+ dataGridView.Name = "dataGridView";
+ dataGridView.RowHeadersWidth = 51;
+ dataGridView.RowTemplate.Height = 29;
+ dataGridView.Size = new Size(908, 343);
+ dataGridView.TabIndex = 0;
+ //
+ // ComponentColumn
+ //
+ ComponentColumn.HeaderText = "компонент";
+ ComponentColumn.MinimumWidth = 6;
+ ComponentColumn.Name = "ComponentColumn";
+ //
+ // ShipColumn
+ //
+ ShipColumn.HeaderText = "корабль";
+ ShipColumn.MinimumWidth = 6;
+ ShipColumn.Name = "ShipColumn";
+ //
+ // CountColumn
+ //
+ CountColumn.HeaderText = "количество";
+ CountColumn.MinimumWidth = 6;
+ CountColumn.Name = "CountColumn";
+ //
+ // buttonSave
+ //
+ buttonSave.Location = new Point(352, 12);
+ buttonSave.Name = "buttonSave";
+ buttonSave.Size = new Size(189, 46);
+ buttonSave.TabIndex = 1;
+ buttonSave.Text = "сохранить в excel";
+ buttonSave.UseVisualStyleBackColor = true;
+ buttonSave.Click += SaveButton_Click;
+ //
+ // FormReportShipComponents
+ //
+ AutoScaleDimensions = new SizeF(8F, 20F);
+ AutoScaleMode = AutoScaleMode.Font;
+ ClientSize = new Size(932, 464);
+ Controls.Add(buttonSave);
+ Controls.Add(dataGridView);
+ Name = "FormReportShipComponents";
+ Text = "FormReportShipComponents";
+ Load += FormReportShipComponents_Load;
+ ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
+ ResumeLayout(false);
+ }
+
+ #endregion
+
+ private DataGridView dataGridView;
+ private Button buttonSave;
+ private DataGridViewTextBoxColumn ComponentColumn;
+ private DataGridViewTextBoxColumn ShipColumn;
+ private DataGridViewTextBoxColumn CountColumn;
+ }
+}
\ No newline at end of file
diff --git a/ShipyardView/FormReportShipComponents.cs b/ShipyardView/FormReportShipComponents.cs
new file mode 100644
index 0000000..5c4f7d1
--- /dev/null
+++ b/ShipyardView/FormReportShipComponents.cs
@@ -0,0 +1,84 @@
+using Microsoft.Extensions.Logging;
+using ShipyardContracts.BindingModels;
+using ShipyardContracts.BusinessLogicContracts;
+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 ShipyardView
+{
+ public partial class FormReportShipComponents : Form
+ {
+ private readonly ILogger _logger;
+ private readonly IReportLogic _logic;
+ public FormReportShipComponents(
+ ILogger logger, IReportLogic logic)
+ {
+ InitializeComponent();
+ _logger = logger;
+ _logic = logic;
+
+ }
+
+ private void SaveButton_Click(object sender, EventArgs e)
+ {
+ using var dialog = new SaveFileDialog
+ {
+ Filter = "xlsx|*.xlsx"
+ };
+ if (dialog.ShowDialog() == DialogResult.OK)
+ {
+ try
+ {
+ _logic.SaveShipComponentToExcelFile(
+ 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);
+ }
+ }
+ }
+
+ private void FormReportShipComponents_Load(object sender, EventArgs e)
+ {
+ try
+ {
+ var dict = _logic.GetShipComponent();
+ if (dict != null)
+ {
+ dataGridView.Rows.Clear();
+ foreach (var elem in dict)
+ {
+ dataGridView.Rows.Add(new object[] { elem.ShipName, "", "" });
+ foreach (var listElem in elem.Components)
+ {
+ dataGridView.Rows.Add(new object[] { "", listElem.Item1, listElem.Item2 });
+ }
+ dataGridView.Rows.Add(new object[] { "Итого", "", elem.TotalCount });
+ dataGridView.Rows.Add(Array.Empty