Код:
Перем Таб;
Функция Жеребьевка(ТПилотов)
КолПилотов=ТПилотов.КоличествоСтрок();
КБ=Цел(КолПилотов/4);
Остаток=КолПилотов-4*КБ;
ТПилотов.НоваяКолонка("ЗП");
ТПилотов.НоваяКолонка("ВП");
ТПилотов.НоваяКолонка("КУ");
ТПилотов.НоваяКолонка("Э");
Стр="";
Для сч=1 По КолПилотов Цикл
Стр=Стр+Симв(сч);
КонецЦикла;
ТПилотов.Заполнить(Стр,,,"ВП");
ТПилотов.Заполнить("",,,"ЗП");
Сетка=СоздатьОбъект("ТаблицаЗначений");
Сетка.НоваяКолонка("НП");
Сетка.КоличествоСтрок(КолПилотов*4);
Сетка.Заполнить(0);
ТКоманд=СоздатьОбъект("ТаблицаЗначений");
ТКоманд.Загрузить(ТПилотов);
ТКоманд.Заполнить(1,,,"КУ");
ТКоманд.Свернуть("Команда","КУ");
КолКоманд=ТКоманд.КоличествоСтрок();
Для сч=1 По КолКоманд Цикл
КУ=ТКоманд.ПолучитьЗначение(сч,"КУ");
КонецЦикла;
Для сч=1 По КолПилотов Цикл
нк=0;
ТКоманд.НайтиЗначение(тПилотов.ПолучитьЗначение(сч,"Команда"),нк,"Команда");
КУ=ТКоманд.ПолучитьЗначение(нк,"КУ");
ТПилотов.УстановитьЗначение(сч,"КУ",КУ);
КонецЦикла;
ТПилотов.Сортировать("КУ-,Команда");
КУ=ТПилотов.ПолучитьЗначение(1,"КУ");
дельта0=0;
дельта1=?(остаток=2,КБ+1,?(остаток=3,КБ+1,КБ));
дельта2=?(остаток=2,2*КБ+3,?(остаток=3,2*КБ+3,2*КБ+1));
Для сч=1 По КолПилотов Цикл
нк=(сч+дельта0-?(сч+дельта0>КолПилотов,КолПилотов+1,1))*4+1;
нж=(сч+дельта1-?(сч+дельта1>КолПилотов,КолПилотов+1,1))*4+2;
нз=(сч+дельта2-?(сч+дельта2>КолПилотов,КолПилотов+1,1))*4+3;
ТПилотов.УстановитьЗначение(сч,"Э",10-?(нк<=КолПилотов,1,?(нк<=КолПилотов*2,2,?(нк<=КолПилотов*3,3,4)))-
?(нж<=КолПилотов,1,?(нж<=КолПилотов*2,2,?(нж<=КолПилотов*3,3,4)))-
?(нз<=КолПилотов,1,?(нз<=КолПилотов*2,2,?(нз<=КолПилотов*3,3,4))));
//красный
Сетка.УстановитьЗначение(нк,"НП",сч);
//желтый
Сетка.УстановитьЗначение(нж,"НП",сч);
//зелёный
Сетка.УстановитьЗначение(нз,"НП",сч);
КонецЦикла;
Для сч=1 По КолПилотов Цикл
ном=(сч-1)*4+1;
нк=Сетка.ПолучитьЗначение(ном,"НП");
нж=Сетка.ПолучитьЗначение(ном+1,"НП");
нз=Сетка.ПолучитьЗначение(ном+2,"НП");
ТПилотов.УстановитьЗначение(нк,"ВП",СтрЗаменить(СтрЗаменить(СтрЗаменить(ТПилотов.ПолучитьЗначение(нк,"ВП"),Симв(нж),""),Симв(нз),""),Симв(нк),""));
ТПилотов.УстановитьЗначение(нж,"ВП",СтрЗаменить(СтрЗаменить(СтрЗаменить(ТПилотов.ПолучитьЗначение(нж,"ВП"),Симв(нж),""),Симв(нз),""),Симв(нк),""));
ТПилотов.УстановитьЗначение(нз,"ВП",СтрЗаменить(СтрЗаменить(СтрЗаменить(ТПилотов.ПолучитьЗначение(нз,"ВП"),Симв(нж),""),Симв(нз),""),Симв(нк),""));
КонецЦикла;
Стр="";
Для сч=1 По КолПилотов Цикл
Стр=Стр+Симв(сч);
//Проверка
Если СтрДлина(ТПилотов.ПолучитьЗначение(сч,"ВП"))+7<>КолПилотов Тогда
//Сообщить("Ошибка расстановки! " + сч);
Возврат -1;
КонецЕсли;
КонецЦикла;
ня=4;
нц=1;
Пока Стр<>"" Цикл
Э=?(ня<=КолПилотов,1,?(ня<=2*КолПилотов,2,?(ня<=3*КолПилотов,3,4)));
Ф=0;
Для сч=нц По СтрДлина(Стр) Цикл
нс=КодСимв(Сред(Стр,сч,1));
Если ТПилотов.ПолучитьЗначение(нс,"Э")<>Э Тогда
//в этом этапе уже был
продолжить;
КонецЕсли;
нк=Сетка.ПолучитьЗначение(ня-3,"НП");
нж=Сетка.ПолучитьЗначение(ня-2,"НП");
нз=Сетка.ПолучитьЗначение(ня-1,"НП");
ЗП=ТПилотов.ПолучитьЗначение(нс,"ЗП");
Если Найти(ЗП,Симв(нк))<>0 Тогда
продолжить;
КонецЕсли;
Если Найти(ЗП,Симв(нж))<>0 Тогда
продолжить;
КонецЕсли;
Если Найти(ЗП,Симв(нз))<>0 Тогда
продолжить;
КонецЕсли;
ВП=ТПилотов.ПолучитьЗначение(нс,"ВП");
Если Найти(ВП,Симв(нк))=0 Тогда
продолжить;
КонецЕсли;
Если Найти(ВП,Симв(нж))=0 Тогда
продолжить;
КонецЕсли;
Если Найти(ВП,Симв(нз))=0 Тогда
продолжить;
КонецЕсли;
Ф=1;
ТПилотов.УстановитьЗначение(нк,"ЗП",ТПилотов.ПолучитьЗначение(нк,"ЗП")+Симв(нс));
ТПилотов.УстановитьЗначение(нж,"ЗП",ТПилотов.ПолучитьЗначение(нж,"ЗП")+Симв(нс));
ТПилотов.УстановитьЗначение(нз,"ЗП",ТПилотов.ПолучитьЗначение(нз,"ЗП")+Симв(нс));
Сетка.УстановитьЗначение(ня,"НП",нс);
ня=ня+4;
нц=1;
Стр=СтрЗаменить(стр,симв(нс),"");
прервать;
КонецЦикла;
Если ф=1 Тогда
продолжить;
КонецЕсли;
//откат
ня=ня-4;
Если ня=0 Тогда
//крах
Возврат -2;
КонецЕсли;
нк=Сетка.ПолучитьЗначение(ня-3,"НП");
нж=Сетка.ПолучитьЗначение(ня-2,"НП");
нз=Сетка.ПолучитьЗначение(ня-1,"НП");
нс=Сетка.ПолучитьЗначение(ня,"НП");
ТПилотов.УстановитьЗначение(нк,"ЗП",СтрЗаменить(ТПилотов.ПолучитьЗначение(нк,"ЗП"),Симв(нс),""));
ТПилотов.УстановитьЗначение(нж,"ЗП",СтрЗаменить(ТПилотов.ПолучитьЗначение(нж,"ЗП"),Симв(нс),""));
ТПилотов.УстановитьЗначение(нз,"ЗП",СтрЗаменить(ТПилотов.ПолучитьЗначение(нз,"ЗП"),Симв(нс),""));
Сетка.УстановитьЗначение(ня,"НП",0);
сч=СтрДлина(Стр);
Пока сч>0 Цикл
Если КодСимв(Сред(Стр,сч,1))<нс Тогда
прервать;
КонецЕсли;
сч=сч-1;
КонецЦикла;
встр=Сред(Стр,1,сч)+Симв(нс)+Сред(Стр,сч+1);
стр=встр;
нц=сч+2;
КонецЦикла;
Возврат Сетка;
КонецФункции
Процедура ПриНачалеРаботыСистемы()
Таб1=СоздатьОбъект("ТаблицаЗначений");
Для йй=13 по 36 Цикл
Если йй<=25 Тогда
Таб1.Загрузить(Таб);
Таб1.КоличествоСтрок(йй);
Иначе
Таб1.НоваяСтрока();
Таб1.Пилот="Пилот "+йй;
Таб1.Команда="Команда "+йй;
КонецЕсли;
Сообщить(">>"+ТекущееВремя());
Ж=Жеребьевка(Таб1);
Сообщить("<<"+ТекущееВремя());
Если Ж=-1 Тогда
Сообщить("Ошибка предварительной расстановки пилотов="+йй);
продолжить;
ИначеЕсли Ж=-2 Тогда
Сообщить("Не могу расположить пилотов="+йй);
продолжить;
КонецЕсли;
Сообщить("Расстановка для "+йй+ "пилотов");
Для Сч=1 по Таб1.КоличествоСтрок() Цикл
КП=Ж.ПолучитьЗначение((Сч-1)*4+1,"НП");
ЖП=Ж.ПолучитьЗначение((Сч-1)*4+2,"НП");
ЗП=Ж.ПолучитьЗначение((Сч-1)*4+3,"НП");
СП=Ж.ПолучитьЗначение((Сч-1)*4+4,"НП");
Сообщить(""+Таб1.ПолучитьЗначение(КП,"Пилот")+"("+Таб1.ПолучитьЗначение(КП,"Команда")+") * "+
Таб1.ПолучитьЗначение(ЖП,"Пилот")+"("+Таб1.ПолучитьЗначение(ЖП,"Команда")+") * "+
Таб1.ПолучитьЗначение(ЗП,"Пилот")+"("+Таб1.ПолучитьЗначение(ЗП,"Команда")+") * "+
?(СП=0,"---------------------------",Таб1.ПолучитьЗначение(СП,"Пилот")+"("+Таб1.ПолучитьЗначение(СП,"Команда")+")"));
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Таб=СоздатьОбъект("ТаблицаЗначений");
Таб.НоваяКолонка("Пилот");
Таб.НоваяКолонка("Команда");
Таб.НоваяСтрока();
Таб.Пилот="Кувакин Олег";
Таб.Команда="RC-Lytkarino";
Таб.НоваяСтрока();
Таб.Пилот="Александров Сергей";
Таб.Команда="RC-Lytkarino";
Таб.НоваяСтрока();
Таб.Пилот="Карпов Игорь";
Таб.Команда="RC-Lytkarino";
Таб.НоваяСтрока();
Таб.Пилот="Шукуров Рауф";
Таб.Команда="Авиаклуб Диар-Флай";
Таб.НоваяСтрока();
Таб.Пилот="Китаев Александр";
Таб.Команда="Авиаклуб Диар-Флай";
Таб.НоваяСтрока();
Таб.Пилот="Сашин Алексей";
Таб.Команда="АК Метеор УСЦ ДОСААФ";
Таб.НоваяСтрока();
Таб.Пилот="Никулин Артем";
Таб.Команда="Алиса-Эйр";
Таб.НоваяСтрока();
Таб.Пилот="Гринжола Артем";
Таб.Команда="Алиса-Эйр";
Таб.НоваяСтрока();
Таб.Пилот="Долганов Александр";
Таб.Команда="Алиса-Эйр";
Таб.НоваяСтрока();
Таб.Пилот="Сысоев Сергей";
Таб.Команда="Алиса-Эйр";
Таб.НоваяСтрока();
Таб.Пилот="Ворфоломеев Петр";
Таб.Команда="Алиса-Эйр";
Таб.НоваяСтрока();
Таб.Пилот="Борисов Алексей";
Таб.Команда="Алиса-Эйр";
Таб.НоваяСтрока();
Таб.Пилот="Шабельский Геннадий";
Таб.Команда="Алиса-Эйр";
Таб.НоваяСтрока();
Таб.Пилот="Должиков Сергей";
Таб.Команда="Анна";
Таб.НоваяСтрока();
Таб.Пилот="Диденко Анатолий";
Таб.Команда="Волжанин";
Таб.НоваяСтрока();
Таб.Пилот="Иванов Герман";
Таб.Команда="Волжанин";
Таб.НоваяСтрока();
Таб.Пилот="Дронов Михаил";
Таб.Команда="РуПъ";
Таб.НоваяСтрока();
Таб.Пилот="Медведев Владислав";
Таб.Команда="РуПъ";
Таб.НоваяСтрока();
Таб.Пилот="Курбатов Руслан";
Таб.Команда="СТК-СЮТ Клин";
Таб.НоваяСтрока();
Таб.Пилот="Савельев Максим";
Таб.Команда="СТК-СЮТ Клин";
Таб.НоваяСтрока();
Таб.Пилот="Костенко Иван";
Таб.Команда="СТК-СЮТ Клин";
Таб.НоваяСтрока();
Таб.Пилот="Курбатов Николай";
Таб.Команда="СТК-СЮТ Клин";
Таб.НоваяСтрока();
Таб.Пилот="Нестеров Владимир";
Таб.Команда="Юпитер";
Таб.НоваяСтрока();
Таб.Пилот="Захарчук Игорь";
Таб.Команда="Юпитер";
Таб.НоваяСтрока();
Таб.Пилот="Гладченко Александр";
Таб.Команда="Юпитер";