From cf54a61f9e31520a9b27559752ad6ed3a7ecf3fb Mon Sep 17 00:00:00 2001 From: Vladislav_396ntk Date: Mon, 20 May 2024 11:57:21 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BD=D0=B0=D1=8F=207?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MassiveGenericObjects.cs | 66 +++--- .../StorageCollection.cs | 31 ++- .../Exceptions/CollectionOverflowException.cs | 17 ++ .../Exceptions/FileDoesNotExistException.cs | 16 ++ .../Exceptions/FileEmptyException.cs | 16 ++ .../Exceptions/ObjectNotFoundException.cs | 17 ++ .../PositionOutOfCollectionException.cs | 17 ++ .../FormLocomotiveCollection.cs | 216 ++++++++++++------ .../LocomotiveProject.csproj | 10 + .../LocomativeProject/Program.cs | 29 ++- LocomativeProject/LocomativeProject/log.txt | 8 + 11 files changed, 322 insertions(+), 121 deletions(-) create mode 100644 LocomativeProject/LocomativeProject/Exceptions/CollectionOverflowException.cs create mode 100644 LocomativeProject/LocomativeProject/Exceptions/FileDoesNotExistException.cs create mode 100644 LocomativeProject/LocomativeProject/Exceptions/FileEmptyException.cs create mode 100644 LocomativeProject/LocomativeProject/Exceptions/ObjectNotFoundException.cs create mode 100644 LocomativeProject/LocomativeProject/Exceptions/PositionOutOfCollectionException.cs create mode 100644 LocomativeProject/LocomativeProject/log.txt diff --git a/LocomativeProject/LocomativeProject/CollectionGenericObjects/MassiveGenericObjects.cs b/LocomativeProject/LocomativeProject/CollectionGenericObjects/MassiveGenericObjects.cs index 12d20d0..d64b6ef 100644 --- a/LocomativeProject/LocomativeProject/CollectionGenericObjects/MassiveGenericObjects.cs +++ b/LocomativeProject/LocomativeProject/CollectionGenericObjects/MassiveGenericObjects.cs @@ -1,4 +1,5 @@ -using System; +using LocomativeProject.Exceptions; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -58,56 +59,49 @@ public class MassiveGenericObjects : ICollectionGenericObjects public int Insert(T obj) { + // TODO вставка в свободное место набора for (int i = 0; i < Count; i++) { - if (_collection[i] == null ) - { - _collection[i] = obj; - return i; - } + if (InsertingElementCollection(i, obj)) return i; } - return -1; + + throw new CollectionOverflowException("Превышение лимита Count"); } public int Insert(T obj, int position) { - if (_collection[position]== null) + // TODO проверка позиции + // TODO проверка, что элемент массива по этой позиции пустой, если нет, то + // ищется свободное место после этой позиции и идет вставка туда + // если нет после, ищем до + // TODO вставка + if (!(position >= 0 && position < Count)) throw new PositionOutOfCollectionException(position); + if (InsertingElementCollection(position, obj)) return position; + + for (int i = position + 1; i < Count; i++) { - _collection[position] = obj; - return position; + if (InsertingElementCollection(i, obj)) return i; } - else + + for (int i = position - 1; i >= 0; i--) { - for (int i = position; i < Count; i++) - { - if (_collection[i] == null) - { - _collection[i] = obj; - return i; - } - } - for (int i = Count -1; i > 0; i--) - { - if (_collection[i] == null) - { - _collection[i] = obj; - return i; - } - } + if (InsertingElementCollection(i, obj)) return i; } - return -1; + + throw new CollectionOverflowException("Нет свободного места для вставки"); } public T? Remove(int position) { - if (position >= Count || position < 0) return null; - if (_collection[position] != null) - { - T obj = _collection[position]; - _collection[position] = null; - return obj; - } - return null; + // TODO проверка позиции + // TODO удаление объекта из массива, присвоив элементу массива значение null + + if (!(position >= 0 && position < Count) || _collection[position] == null) throw new ObjectNotFoundException(position); + + T obj = _collection[position]; + _collection[position] = null; + + return obj; } private bool InsertingElementCollection(int index, T obj) diff --git a/LocomativeProject/LocomativeProject/CollectionGenericObjects/StorageCollection.cs b/LocomativeProject/LocomativeProject/CollectionGenericObjects/StorageCollection.cs index bb54eaa..3dd86d4 100644 --- a/LocomativeProject/LocomativeProject/CollectionGenericObjects/StorageCollection.cs +++ b/LocomativeProject/LocomativeProject/CollectionGenericObjects/StorageCollection.cs @@ -1,4 +1,6 @@ using LocomativeProject.Drawnings; +using LocomativeProject.Exceptions; +using System; using System.Text; namespace LocomotiveProject.CollectionGenericObjects @@ -108,7 +110,7 @@ namespace LocomotiveProject.CollectionGenericObjects { if (_storages.Count == 0) { - return false; + throw new Exception("Storage is empty"); } if (File.Exists(filename)) { @@ -155,11 +157,11 @@ namespace LocomotiveProject.CollectionGenericObjects /// /// Путь и имя файла /// true - загрузка прошла успешно, false - ошибка при загрузке данных - public bool LoadData(string filename) + public void LoadData(string filename) { if (!File.Exists(filename)) { - return false; + throw new FileDoesNotExistException("Файл не существует " + filename); } using (StreamReader streamRader = File.OpenText(filename)) @@ -168,12 +170,12 @@ namespace LocomotiveProject.CollectionGenericObjects if (inputString == null || inputString.Length == 0) { - return false; + throw new FileEmptyException("Файл пустой " + filename); } if (!inputString.StartsWith(_collectionKey)) { - return false; + throw new ObjectNotFoundException(); } _storages.Clear(); @@ -189,7 +191,7 @@ namespace LocomotiveProject.CollectionGenericObjects ICollectionGenericObjects? collection = StorageCollection.CreateCollection(collectionType); if (collection == null) { - return false; + throw new ObjectNotFoundException(); } collection.MaxCount = Convert.ToInt32(record[2]); string[] set = record[3].Split(_separatorItems, StringSplitOptions.RemoveEmptyEntries); @@ -199,17 +201,16 @@ namespace LocomotiveProject.CollectionGenericObjects { if (collection.Insert(ship) == -1) { - return false; + throw new PositionOutOfCollectionException(); } } } _storages.Add(record[0], collection); } - return true; } } - private static ICollectionGenericObjects? CreateCollection(CollectionType collectionType) + private static ICollectionGenericObjects? CreateCollection(CollectionType collectionType) { return collectionType switch { @@ -218,5 +219,17 @@ namespace LocomotiveProject.CollectionGenericObjects _ => null, }; } + + public T? this[int index] + { + get + { + if (index >= 0 && index < Keys.Count && Keys[index] != null) + { + return (T)_storages[Keys[index]]; + } + return null; + } + } } } \ No newline at end of file diff --git a/LocomativeProject/LocomativeProject/Exceptions/CollectionOverflowException.cs b/LocomativeProject/LocomativeProject/Exceptions/CollectionOverflowException.cs new file mode 100644 index 0000000..2ddddd9 --- /dev/null +++ b/LocomativeProject/LocomativeProject/Exceptions/CollectionOverflowException.cs @@ -0,0 +1,17 @@ +using System.Runtime.Serialization; + +namespace LocomativeProject.Exceptions +{ + /// + /// Класс, описывающий ошибку переполнения коллекции + /// + [Serializable] + public class CollectionOverflowException : ApplicationException + { + public CollectionOverflowException(int count) : base("В коллекции превышено допустимое количество: " + count) { } + public CollectionOverflowException() : base() { } + public CollectionOverflowException(string message) : base(message) { } + public CollectionOverflowException(string message, Exception exception) : base(message, exception) { } + protected CollectionOverflowException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } + } +} diff --git a/LocomativeProject/LocomativeProject/Exceptions/FileDoesNotExistException.cs b/LocomativeProject/LocomativeProject/Exceptions/FileDoesNotExistException.cs new file mode 100644 index 0000000..00be560 --- /dev/null +++ b/LocomativeProject/LocomativeProject/Exceptions/FileDoesNotExistException.cs @@ -0,0 +1,16 @@ +using System.Runtime.Serialization; + +namespace LocomativeProject.Exceptions +{ + /// + /// Класс, описывающий ошибку, что файл пустой + /// + [Serializable] + public class FileDoesNotExistException : ApplicationException + { + public FileDoesNotExistException() : base() { } + public FileDoesNotExistException(string message) : base(message) { } + public FileDoesNotExistException(string message, Exception exception) : base(message, exception) { } + protected FileDoesNotExistException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } + } +} diff --git a/LocomativeProject/LocomativeProject/Exceptions/FileEmptyException.cs b/LocomativeProject/LocomativeProject/Exceptions/FileEmptyException.cs new file mode 100644 index 0000000..1c92b76 --- /dev/null +++ b/LocomativeProject/LocomativeProject/Exceptions/FileEmptyException.cs @@ -0,0 +1,16 @@ +using System.Runtime.Serialization; + +namespace LocomativeProject.Exceptions +{ + /// + /// Класс, описывающий ошибку, что по указанной позиции нет элемента + /// + [Serializable] + public class FileEmptyException : ApplicationException + { + public FileEmptyException() : base() { } + public FileEmptyException(string message) : base(message) { } + public FileEmptyException(string message, Exception exception) : base(message, exception) { } + protected FileEmptyException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } + } +} diff --git a/LocomativeProject/LocomativeProject/Exceptions/ObjectNotFoundException.cs b/LocomativeProject/LocomativeProject/Exceptions/ObjectNotFoundException.cs new file mode 100644 index 0000000..e598358 --- /dev/null +++ b/LocomativeProject/LocomativeProject/Exceptions/ObjectNotFoundException.cs @@ -0,0 +1,17 @@ +using System.Runtime.Serialization; + +namespace LocomativeProject.Exceptions +{ + /// + /// Класс, описывающий ошибку, что по указанной позиции нет элемента + /// + [Serializable] + public class ObjectNotFoundException : ApplicationException + { + public ObjectNotFoundException(int i) : base("Не найден объект по позиции " + i) { } + public ObjectNotFoundException() : base() { } + public ObjectNotFoundException(string message) : base(message) { } + public ObjectNotFoundException(string message, Exception exception) : base(message, exception) { } + protected ObjectNotFoundException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } + } +} diff --git a/LocomativeProject/LocomativeProject/Exceptions/PositionOutOfCollectionException.cs b/LocomativeProject/LocomativeProject/Exceptions/PositionOutOfCollectionException.cs new file mode 100644 index 0000000..4877195 --- /dev/null +++ b/LocomativeProject/LocomativeProject/Exceptions/PositionOutOfCollectionException.cs @@ -0,0 +1,17 @@ +using System.Runtime.Serialization; + +namespace LocomativeProject.Exceptions +{ + /// + /// Класс, описывающий ошибку выхода за границы коллекции + /// + [Serializable] + public class PositionOutOfCollectionException : ApplicationException + { + public PositionOutOfCollectionException(int i) : base("Выход за границы коллекции.Позиция " + i) { } + public PositionOutOfCollectionException() : base() { } + public PositionOutOfCollectionException(string message) : base(message) { } + public PositionOutOfCollectionException(string message, Exception exception) : base(message, exception) { } + protected PositionOutOfCollectionException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } + } +} diff --git a/LocomativeProject/LocomativeProject/FormLocomotiveCollection.cs b/LocomativeProject/LocomativeProject/FormLocomotiveCollection.cs index 194e801..a0ce9c0 100644 --- a/LocomativeProject/LocomativeProject/FormLocomotiveCollection.cs +++ b/LocomativeProject/LocomativeProject/FormLocomotiveCollection.cs @@ -1,6 +1,8 @@ using LocomativeProject.Drawnings; +using LocomativeProject.Exceptions; using LocomotiveProject.CollectionGenericObjects; -using LocomotiveProject.Drawnings; +using Microsoft.Extensions.Logging; + namespace LocomotiveProject { /// @@ -13,6 +15,11 @@ namespace LocomotiveProject /// private readonly StorageCollection _storageCollection; + /// + /// Логер + /// + private readonly ILogger _logger; + /// /// Компания /// @@ -21,10 +28,12 @@ namespace LocomotiveProject /// /// Конструктор /// - public FormLocomotiveCollection() + public FormLocomotiveCollection(ILogger logger) { InitializeComponent(); _storageCollection = new StorageCollection(); + _logger = logger; + _logger.LogInformation("Форма загрузилась"); } /// @@ -49,37 +58,75 @@ namespace LocomotiveProject form.AddEventListener_Locomotive(SetLocomotive); } - private void SetLocomotive(DrawningBaseLocomotive Locomotive) + private void SetLocomotive(DrawningBaseLocomotive locomotive) { - if (Locomotive == null || _company == null) return; - - if (_company + Locomotive != -1) + try { - MessageBox.Show("Объект добавлен"); - pictureBox.Image = _company.Show(); + if (locomotive == null || _company == null) return; + + if (_company + locomotive != -1) + { + MessageBox.Show("Объект добавлен"); + pictureBox.Image = _company.Show(); + _logger.LogInformation("Объект добавлен"); + } + } + catch (Exception ex) + { + MessageBox.Show("Не удалось добавить объект"); + LogException(ex); + } + } + + private void LogException(Exception ex) + { + if (ex is CollectionOverflowException) + { + _logger.LogError("Ошибка {Message}", ((CollectionOverflowException)ex).Message); + } + else if (ex is FileEmptyException) + { + _logger.LogError("Ошибка {Message}", ((FileEmptyException)ex).Message); + } + else if (ex is FileDoesNotExistException) + { + _logger.LogError("Ошибка {Message}", ((FileDoesNotExistException)ex).Message); + } + else if (ex is ObjectNotFoundException) + { + _logger.LogError("Ошибка {Message}", ((ObjectNotFoundException)ex).Message); + } + else if (ex is PositionOutOfCollectionException) + { + _logger.LogError("Ошибка {Message}", ((PositionOutOfCollectionException)ex).Message); } else { - MessageBox.Show("Не удалось добавить объект"); + _logger.LogError("Ошибка {Message}", ex.Message); } } private void buttonRemoveLocomotive_Click(object sender, EventArgs e) { - if (string.IsNullOrEmpty(maskedTextBox.Text) || _company == null) return; - - if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return; - - int position = Convert.ToInt32(maskedTextBox.Text); - - if (_company - position != null) + try { - MessageBox.Show("Объект удален"); - pictureBox.Image = _company.Show(); + if (string.IsNullOrEmpty(maskedTextBox.Text) || _company == null) throw new Exception("Входные дынне пустые"); + + if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return; + + int position = Convert.ToInt32(maskedTextBox.Text); + + if (_company - position != null) + { + MessageBox.Show("Объект удален"); + pictureBox.Image = _company.Show(); + _logger.LogInformation("Объект удален"); + } } - else + catch (Exception ex) { MessageBox.Show("Не удалось удалить объект"); + LogException(ex); } } @@ -133,23 +180,30 @@ namespace LocomotiveProject /// private void ButtonCollectionAdd_Click(object sender, EventArgs e) { - if (string.IsNullOrEmpty(textBoxCollectionName.Text) || (!radioButtonList.Checked && !radioButtonMassive.Checked)) + try { - MessageBox.Show("Не все данные заполнены", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; + if (string.IsNullOrEmpty(textBoxCollectionName.Text) || (!radioButtonList.Checked && !radioButtonMassive.Checked)) + { + MessageBox.Show("Не все данные заполнены", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + throw new Exception("Не все данные заполнены"); + } + CollectionType collectionType = CollectionType.None; + if (radioButtonMassive.Checked) + { + collectionType = CollectionType.Massive; + } + else if (radioButtonList.Checked) + { + collectionType = CollectionType.List; + } + _storageCollection.AddCollection(textBoxCollectionName.Text, collectionType); + _logger.LogInformation("Коллекция добавлена " + textBoxCollectionName.Text); + RerfreshListBoxItems(); } - CollectionType collectionType = CollectionType.None; - if (radioButtonMassive.Checked) + catch (Exception ex) { - collectionType = CollectionType.Massive; + LogException(ex); } - else if (radioButtonList.Checked) - { - collectionType = CollectionType.List; - } - _storageCollection.AddCollection(textBoxCollectionName.Text, - collectionType); - RerfreshListBoxItems(); } /// @@ -159,18 +213,26 @@ namespace LocomotiveProject /// private void ButtonCollectionDelete_Click(object sender, EventArgs e) { - // TODO прописать логику удаления элемента из коллекции - // нужно убедиться, что есть выбранная коллекция - // спросить у пользователя через MessageBox, что он подтверждает, что хочет удалить запись - // удалить и обновить ListBox - if (listBoxCollection.SelectedItem == null || listBoxCollection.SelectedIndex < 0) + try { - MessageBox.Show("Коллекция для удаления не выбрана"); - return; + // TODO прописать логику удаления элемента из коллекции + // нужно убедиться, что есть выбранная коллекция + // спросить у пользователя через MessageBox, что он подтверждает, что хочет удалить запись + // удалить и обновить ListBox + if (listBoxCollection.SelectedItem == null || listBoxCollection.SelectedIndex < 0) + { + MessageBox.Show("Коллекция для удаления не выбрана"); + return; + } + if (MessageBox.Show("Удалить коллекцию?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return; + _storageCollection.DelCollection(listBoxCollection.SelectedItem.ToString()); + _logger.LogInformation("Коллекция с название: " + listBoxCollection.SelectedItem.ToString() + " удалена"); + RerfreshListBoxItems(); + } + catch (Exception ex) + { + LogException(ex); } - if (MessageBox.Show("Удалить коллекцию?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return; - _storageCollection.DelCollection(listBoxCollection.SelectedItem.ToString()); - RerfreshListBoxItems(); } /// @@ -180,27 +242,33 @@ namespace LocomotiveProject /// private void ButtonCreateCompany_Click(object sender, EventArgs e) { - if (listBoxCollection.SelectedIndex < 0 || listBoxCollection.SelectedItem == null) + try { - MessageBox.Show("Коллекция не выбрана"); - return; + if (listBoxCollection.SelectedIndex < 0 || listBoxCollection.SelectedItem == null) + { + MessageBox.Show("Коллекция не выбрана"); + throw new Exception("Коллекция не выбрана"); + } + ICollectionGenericObjects? collection = + _storageCollection[listBoxCollection.SelectedItem.ToString() ?? string.Empty]; + if (collection == null) + { + MessageBox.Show("Коллекция не проинициализирована"); + throw new Exception("Коллекция не проинициализирована"); + } + switch (comboBoxSelectorCompany.Text) + { + case "Хранилище": + _company = new LocomotiveSharingService(pictureBox.Width, pictureBox.Height, collection); + break; + } + panelCompanyTools.Enabled = true; + RerfreshListBoxItems(); } - ICollectionGenericObjects? collection = - _storageCollection[listBoxCollection.SelectedItem.ToString() ?? string.Empty]; - if (collection == null) + catch (Exception ex) { - MessageBox.Show("Коллекция не проинициализирована"); - return; + LogException(ex); } - switch (comboBoxSelectorCompany.Text) - { - case "Хранилище": - _company = new LocomotiveSharingService(pictureBox.Width, - pictureBox.Height, (ICollectionGenericObjects)collection); - break; - } - panelCompanyTools.Enabled = true; - RerfreshListBoxItems(); } /// @@ -210,16 +278,19 @@ namespace LocomotiveProject /// private void SaveToolStripMenuItem_Click(object sender, EventArgs e) { - if (saveFileDialog.ShowDialog() == DialogResult.OK) + try { - if (_storageCollection.SaveData(saveFileDialog.FileName)) + if (saveFileDialog.ShowDialog() == DialogResult.OK) { + _storageCollection.SaveData(saveFileDialog.FileName); MessageBox.Show("Сохранение прошло успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + _logger.LogInformation("Сохранение прошло успешно в файл {filename}", saveFileDialog.FileName); } - else - { - MessageBox.Show("Не сохранилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); - } + } + catch (Exception ex) + { + MessageBox.Show("Не сохранилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + LogException(ex); } } @@ -230,17 +301,20 @@ namespace LocomotiveProject /// private void LoadToolStripMenuItem_Click(object sender, EventArgs e) { - if (openFileDialog.ShowDialog() == DialogResult.OK) + try { - if (_storageCollection.LoadData(openFileDialog.FileName)) + if (openFileDialog.ShowDialog() == DialogResult.OK) { + _storageCollection.LoadData(openFileDialog.FileName); MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); RerfreshListBoxItems(); + _logger.LogInformation("Загрузка успешна завершена"); } - else - { - MessageBox.Show("Не загрузилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); - } + } + catch (Exception ex) + { + MessageBox.Show("Не загрузилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + LogException(ex); } } } diff --git a/LocomativeProject/LocomativeProject/LocomotiveProject.csproj b/LocomativeProject/LocomativeProject/LocomotiveProject.csproj index 629ec08..d048348 100644 --- a/LocomativeProject/LocomativeProject/LocomotiveProject.csproj +++ b/LocomativeProject/LocomativeProject/LocomotiveProject.csproj @@ -8,6 +8,16 @@ enable + + + + + + + + + + True diff --git a/LocomativeProject/LocomativeProject/Program.cs b/LocomativeProject/LocomativeProject/Program.cs index 3d8c3c8..9acffd8 100644 --- a/LocomativeProject/LocomativeProject/Program.cs +++ b/LocomativeProject/LocomativeProject/Program.cs @@ -1,4 +1,7 @@ -using LocomativeProject; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using NLog.Extensions.Logging; +using Serilog; namespace LocomotiveProject { @@ -8,12 +11,28 @@ namespace LocomotiveProject /// The main entry point for the application. /// [STAThread] - static void Main() + private static void Main() { - // To customize application configuration such as set high DPI settings or default font, - // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - Application.Run(new FormLocomotiveCollection()); + + ServiceCollection services = new ServiceCollection(); + ConfigureServices(services); + using ServiceProvider serviceProvider = services.BuildServiceProvider(); + + Application.Run(serviceProvider.GetRequiredService()); + } + + /// + /// DI + /// + /// + private static void ConfigureServices(ServiceCollection services) + { + services.AddSingleton() + .AddLogging(option => option.AddSerilog(dispose: true)); + + Log.Logger = new LoggerConfiguration() + .MinimumLevel.Debug().WriteTo.File("C:\\Users\\79603\\Desktop\\ 11 (2)\\ 11\\LocomativeProject\\LocomativeProject\\log.txt").CreateLogger(); } } } \ No newline at end of file diff --git a/LocomativeProject/LocomativeProject/log.txt b/LocomativeProject/LocomativeProject/log.txt new file mode 100644 index 0000000..8974c29 --- /dev/null +++ b/LocomativeProject/LocomativeProject/log.txt @@ -0,0 +1,8 @@ +2024-05-20 11:53:12.373 +04:00 [INF] Форма загрузилась +2024-05-20 11:53:15.800 +04:00 [INF] Коллекция добавлена dsfdsf +2024-05-20 11:53:22.306 +04:00 [INF] Объект добавлен +2024-05-20 11:53:29.080 +04:00 [INF] Объект добавлен +2024-05-20 11:55:31.262 +04:00 [INF] Форма загрузилась +2024-05-20 11:55:34.488 +04:00 [INF] Коллекция добавлена dfgdfg +2024-05-20 11:55:40.963 +04:00 [INF] Объект добавлен +2024-05-20 11:55:43.055 +04:00 [ERR] Ошибка Входные дынне пустые