diff --git a/laba1Loco/ExtentionDrawingTrain.java b/laba1Loco/ExtentionDrawingTrain.java
new file mode 100644
index 0000000..83bfaba
--- /dev/null
+++ b/laba1Loco/ExtentionDrawingTrain.java
@@ -0,0 +1,74 @@
+package laba1Loco;
+
+import java.awt.Color;
+
+public class ExtentionDrawingTrain {
+    /// <summary>
+    /// Создание объекта из строки
+    /// </summary>
+    /// <param name="info">Строка с данными для создания объекта</param>
+    /// <param name="separatorForObject">Разделитель даннных</param>
+    /// <param name="width">Ширина</param>
+    /// <param name="height">Высота</param>
+    /// <returns>Объект</returns>
+    public static DrawingTrain CreateDrawingTrain(String info, String separatorForObject, int width, int height)
+    {
+        String[] strs = info.split(separatorForObject);
+        if (strs.length == 4)
+        {
+            String[] colorValues = strs[2].split(",");
+
+            return new DrawingTrain(Integer.parseInt(strs[0]), (double)Integer.parseInt(strs[1]),
+            new Color(
+                Integer.parseInt(colorValues[0]),
+                Integer.parseInt(colorValues[1]),
+                Integer.parseInt(colorValues[2])
+                ),
+            Integer.parseInt(strs[3]), width, height);
+        }
+        if (strs.length == 8)
+        {
+            String[] colorValues = strs[2].split(",");
+            String[] colorValues2 = strs[4].split(",");
+            return new DrawingLoco(
+            Integer.parseInt(strs[0]),
+            (double)Integer.parseInt(strs[1]),
+            new Color(
+                Integer.parseInt(colorValues[0].replaceAll("\\D", "")),
+                Integer.parseInt(colorValues[1].replaceAll("\\D", "")),
+                Integer.parseInt(colorValues[2].replaceAll("\\D", ""))
+                ),
+            Integer.parseInt(strs[3]),
+            new Color(
+                Integer.parseInt(colorValues2[0].replaceAll("\\D", "")),
+                Integer.parseInt(colorValues2[1].replaceAll("\\D", "")),
+                Integer.parseInt(colorValues2[2].replaceAll("\\D", ""))
+                ),
+            strs[5].equals("True"),
+            strs[6].equals("True"),
+            strs[7].equals("True"),
+            width, height);
+        }
+        return null;
+    }
+    /// <summary>
+    /// Получение данных для сохранения в файл
+    /// </summary>
+    /// <param name="drawningtrain">Сохраняемый объект</param>
+    /// <param name="separatorForObject">Разделитель даннных</param>
+    /// <returns>Строка с данными по объекту</returns>
+    public static String GetDataForSave(DrawingTrain drawningTrain, String separatorForObject)
+    {
+        EntityTrain train = drawningTrain.EntityTrain;
+        if (train == null)
+        {
+            return null;
+        }
+        String str = "" + train.Speed + separatorForObject + (int)train.Weight + separatorForObject + train.BodyColor + separatorForObject + train.numWheel;
+        if (!(train instanceof EntityLoco))
+        {
+            return str;
+        }
+        return str+separatorForObject+((EntityLoco)train).AdditionalColor.toString()+separatorForObject+((EntityLoco)train).Tube+separatorForObject+((EntityLoco)train).FuelTank+separatorForObject+((EntityLoco)train).LocoLine;
+    }
+}
diff --git a/laba1Loco/FormTrainCollecltion.java b/laba1Loco/FormTrainCollecltion.java
index a134a55..2c8350e 100644
--- a/laba1Loco/FormTrainCollecltion.java
+++ b/laba1Loco/FormTrainCollecltion.java
@@ -4,18 +4,24 @@ import java.awt.Graphics;
 import java.awt.Graphics2D;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.io.File;
 import java.util.LinkedList;
 
 import javax.swing.DefaultListModel;
 import javax.swing.JButton;
 import javax.swing.JComboBox;
 import javax.swing.JComponent;
+import javax.swing.JFileChooser;
 import javax.swing.JFrame;
 import javax.swing.JList;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
 import javax.swing.JOptionPane;
 import javax.swing.JTextField;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
+import javax.swing.filechooser.FileNameExtensionFilter;
 
 public class FormTrainCollecltion {
     private class Canvas extends JComponent{
@@ -243,6 +249,65 @@ public class FormTrainCollecltion {
             }
         );
 
+        // Создаем панель меню
+        JMenuBar menuBar = new JMenuBar();
+
+        // Создаем меню
+        JMenu fileMenu = new JMenu("File");
+
+        // Создаем пункты меню
+        JMenuItem openItem = new JMenuItem("Open");
+        openItem.addActionListener(
+            new ActionListener() {
+                public void actionPerformed(ActionEvent e){
+                    JFileChooser fileChooser = new JFileChooser();
+
+                    fileChooser.setDialogTitle("Выберите файл для загрузки данных");
+
+                    // Установка фильтра для файлов с определенным расширением (например, .txt)
+                    fileChooser.setFileFilter(new FileNameExtensionFilter("Текстовые файлы (*.txt)", "txt"));
+
+                    fileChooser.setDialogTitle("Выберите файл для загрузки данных");
+                    if (fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
+                        File selectedFile = fileChooser.getSelectedFile();
+                        if (_storage.loadData(selectedFile.getAbsolutePath())) {
+                            JOptionPane.showMessageDialog(null, "Загрузка прошла успешно", "Результат", JOptionPane.INFORMATION_MESSAGE);
+                        } else {
+                            JOptionPane.showMessageDialog(null, "Не загрузилось", "Результат", JOptionPane.ERROR_MESSAGE);
+                        }
+                    }
+                    ReloadObjects();
+                }   
+            }
+        );
+        JMenuItem saveItem = new JMenuItem("Save");
+        saveItem.addActionListener(
+            new ActionListener() {
+                public void actionPerformed(ActionEvent e){
+                    JFileChooser fileChooser = new JFileChooser();
+                    fileChooser.setDialogTitle("Выберите файл для сохранения данных");
+
+                    // Установка фильтра для файлов с определенным расширением (например, .txt)
+                    fileChooser.setFileFilter(new FileNameExtensionFilter("Текстовые файлы (*.txt)", "txt"));
+
+                    if (fileChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
+                        File selectedFile = fileChooser.getSelectedFile();
+                        if (_storage.SaveData(selectedFile.getAbsolutePath()))
+                            JOptionPane.showMessageDialog(null, "Сохранение прошло успешно", "Результат", JOptionPane.INFORMATION_MESSAGE);
+                        else
+                            JOptionPane.showMessageDialog(null, "Не сохранилось", "Результат", JOptionPane.ERROR_MESSAGE);
+                    }
+                }
+            }
+        );
+
+        // Добавляем пункты в меню
+        fileMenu.add(openItem);
+        fileMenu.add(saveItem);
+
+        // Добавляем меню в панель меню
+        menuBar.add(fileMenu);
+
         w.setSize (1000, 600);
         w.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
         w.setLayout(null);
@@ -260,6 +325,8 @@ public class FormTrainCollecltion {
 
         buttonGetRemoved.setBounds(pictureBoxWidth, 330, 160, 20);
 
+        menuBar.setBounds(pictureBoxWidth, 360, 160, 20);
+
         w.add(canv);
         w.add(ButtonAddTrain);
         w.add(ButtonRemoveTrain);
@@ -274,6 +341,8 @@ public class FormTrainCollecltion {
 
         w.add(buttonGetRemoved);
 
+        w.add(menuBar);
+
         w.setVisible(true);
     }
 }
diff --git a/laba1Loco/TrainsGenericCollection.java b/laba1Loco/TrainsGenericCollection.java
index 5063084..bdded48 100644
--- a/laba1Loco/TrainsGenericCollection.java
+++ b/laba1Loco/TrainsGenericCollection.java
@@ -5,6 +5,10 @@ import java.awt.Graphics2D;
 import java.awt.image.BufferedImage;
 
 public class TrainsGenericCollection<T extends DrawingTrain, U extends IMoveableObject>{
+    /// <summary>
+    /// Получение объектов коллекции
+    /// </summary>
+    public Iterable<T> getTrains(final Integer maxTrains) { return _collection.GetTrains(maxTrains); }
     /// <summary>
     /// Ширина окна прорисовки
     /// </summary>
diff --git a/laba1Loco/TrainsGenericStorage.java b/laba1Loco/TrainsGenericStorage.java
index 114a486..b38d5a4 100644
--- a/laba1Loco/TrainsGenericStorage.java
+++ b/laba1Loco/TrainsGenericStorage.java
@@ -1,10 +1,111 @@
 package laba1Loco;
 
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 public class TrainsGenericStorage {
+    /// <summary>
+    /// Разделитель для записи ключа и значения элемента словаря
+    /// </summary>
+    private static String _separatorForKeyValueWR = "|";
+    private static String _separatorForKeyValue = "\\|";
+    /// <summary>
+    /// Разделитель для записей коллекции данных в файл
+    /// </summary>
+    private String _separatorRecordsWR = ";";
+    private String _separatorRecords = "\\;";
+    /// <summary>
+    /// Разделитель для записи информации по объекту в файл
+    /// </summary>
+    private static String _separatorForObjectWR = ":";
+    private static String _separatorForObject = "\\:";
+
+    /// <summary>
+    /// Сохранение информации по автомобилям в хранилище в файл
+    /// </summary>
+    /// <param name="filename">Путь и имя файла</param>
+    /// <returns>true - сохранение прошло успешно, false - ошибка при cохранении данных</returns>
+    public boolean SaveData(String filename)
+    {
+        if (new File(filename).exists()) {
+            new File(filename).delete();
+        }
+
+        StringBuilder data = new StringBuilder();
+
+        for (Map.Entry<String, TrainsGenericCollection<DrawingTrain, DrawningObjectTrain>> record : _trainStorages.entrySet()) {
+            StringBuilder records = new StringBuilder();
+            for (DrawingTrain elem : record.getValue().getTrains(100)) {
+                records.append(elem != null ? ExtentionDrawingTrain.GetDataForSave(elem, _separatorForObjectWR) + _separatorRecordsWR : "");
+            }
+            data.append(record.getKey()).append(_separatorForKeyValueWR).append(records).append("\n");
+        }
+
+        if (data.length() == 0)
+            return false;
+
+        try (BufferedWriter writer = new BufferedWriter(new FileWriter(filename))) {
+            writer.write("TrainStorage" + System.lineSeparator() + data.toString());
+        } catch (IOException e) {
+            e.printStackTrace();
+            return false;
+        }
+
+        return true;
+    }
+    /// <summary>
+    /// Загрузка информации по автомобилям в хранилище из файла
+    /// </summary>
+    /// <param name="filename">Путь и имя файла</param>
+    /// <returns>true - загрузка прошла успешно, false - ошибка призагрузке данных</returns>
+    public boolean loadData(String filename) {
+        if (!new File(filename).exists()) {
+            return false;
+        }
+        
+        try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
+            String s = reader.readLine();
+            if (s == null || s.length() == 0)
+                return false;
+
+            if (!s.startsWith("TrainStorage"))
+                return false;
+            
+            _trainStorages.clear();
+            s = reader.readLine();
+            while (s != null && s.length() != 0) {
+                String[] record = s.split(_separatorForKeyValue);
+                s = reader.readLine();
+                if (record.length != 2) {
+                    continue;
+                }
+                TrainsGenericCollection<DrawingTrain, DrawningObjectTrain> collection = new TrainsGenericCollection<>(_pictureWidth, _pictureHeight);
+                String[] set = record[1].split(_separatorRecords);
+                List<String> reversedSet = Arrays.asList(set);
+                Collections.reverse(reversedSet);
+                for (String elem : reversedSet) {
+                    DrawingTrain train = ExtentionDrawingTrain.CreateDrawingTrain(elem, _separatorForObject, _pictureWidth, _pictureHeight);
+                    if (train == null || collection.Add(train) == -1)
+                            return false;
+                }
+                _trainStorages.put(record[0], collection);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+            return false;
+        }
+        return true;
+    }
     /// <summary>
     /// Словарь (хранилище)
     /// </summary>