// расчёт времени, вычисление времени завершения процеса
 private string СalculationTime(Machine_tools machine, Nomenclatures item, ObservableCollection <Times> times)
 {
     // перебор времен
     for (int i = 0; i < times.Count; i++)
     {
         // совпадение по ид машины и номенклатуры
         if (times[i].machine_tool_id == machine.id && times[i].nomenclature_id == item.Id)
         {
             // перебор машин
             for (int k = 0; k < machine_Tools.Count; k++)
             {
                 // совпадение по ид
                 if (machine_Tools[k].id == machine.id)
                 {
                     machine.time += int.Parse(times[i].operation_time);
                     return(machine.time.ToString());
                 }
             }
             break;
         }
     }
     return(null);
 }
        // по номенклатуре, списку машин и времени получаем нужную машину (ближайшую свободную)
        private Machine_tools GetMachine(Nomenclatures nomenclatures, ObservableCollection <Machine_tools> machine_Tools, ObservableCollection <Times> times)
        {
            // поиск ид возможных машин
            ObservableCollection <string> posMachines = new ObservableCollection <string>();

            foreach (var item in times)
            {
                if (nomenclatures.Id == item.nomenclature_id)
                {
                    posMachines.Add(item.machine_tool_id);
                }
            }

            Machine_tools result = null;
            int           min    = int.MaxValue;

            foreach (var item in posMachines)
            {
                Machine_tools buff = null;
                foreach (var o in machine_Tools)
                {
                    if (o.id == item)
                    {
                        buff = o;
                        break;
                    }
                }

                if (min > buff.time)
                {
                    min    = buff.time;
                    result = buff;
                }
            }

            return(result);
        }
        // распределение
        private void Distribution()
        {
            // партия -> номенклатура -> машина -> вычисление -> расписание
            while (party.Count > 0)
            {
                // берём следующую партию и возвращаем оставшиеся
                Parties current_party = GetParties(party, out var newParties);

                // определяем номенклатуру
                Nomenclatures current_nomenclature = GetNomenclature(current_party, nomenclatures);

                // выбираем для номенклатуры машину
                Machine_tools current_machine = GetMachine(current_nomenclature, machine_Tools, times);

                string partyName     = current_nomenclature.Nomenclature;
                string equipmentName = current_machine.name;
                string tStart        = current_machine.time.ToString();
                string tStop         = СalculationTime(current_machine, current_nomenclature, times);

                Raspisanies.Add(new Raspisanie {
                    Party = partyName, Equipment = equipmentName, TStart = tStart, TStop = tStop
                });
            }
        }