public static PlayersRatingList GetPlayersRating(int gameTypeId, DateTime date)
        {
            PlayersRatingList players      = new PlayersRatingList();
            CompetitionsList  competitions = new CompetitionsList();

            BuildRatingSystem(gameTypeId, players, competitions, date);
#if FEDITION
            foreach (PlayerRating player in players.Values)
            {
                if (player.LastRatingDate != DateTime.MinValue)
                {
                    player.Rating -= (RatingSystem.GetMonthCount(player.LastRatingDate, date) / 3) * 25;
                }
            }
#endif
            return(players);
        }
        /// <summary>
        /// Посторение рейтинговой системы и расчет рейтинга
        /// </summary>
        public static void BuildRatingSystem(int gameTypeId, PlayersRatingList players, CompetitionsList competitions, DateTime date)
        {
            // Загрузить список игроков с начальным рейтингом
            TA.DB.Manager.DatabaseManager.CurrentDb.ReadPlayerRatingList(gameTypeId, players);
#if FEDITION
            // Загрузить результаты по порядку возрастания даты
            TA.DB.Manager.DatabaseManager.CurrentDb.ReadRatingCompetitionList(gameTypeId, competitions, date);
            // Пересчитать рейтинги для каждого турнира по мере возрастания даты
            foreach (CompetitionInfo comp in competitions)
            {
                if (comp.IsRating)
                {
                    int avg_rating = 0;
                    foreach (PlayersCompetitionResult result in comp.Results.Values)
                    {
                        PlayerRating player = players[result.PlayerId];
                        // 1 - Посчитать штрафы за пропуск в зависимости от даты турнира и даты из списка игроков
                        if (player.LastRatingDate != DateTime.MinValue)
                        {
                            result.Penalty = (RatingSystem.GetMonthCount(player.LastRatingDate, comp.Date) / 3) * 25;
                        }
                        // 2 - Расчитать начальный рейтинг (Рейтинг из списка - штраф)
                        result.RatingBegin = player.Rating - result.Penalty;
                        avg_rating        += result.RatingBegin;
                    }
                    foreach (PlayersCompetitionResult result in comp.Results.Values)
                    {
                        PlayerRating player = players[result.PlayerId];
                        // 4 - Расчитать дельту для кажого игрока
                        result.Delta = Convert.ToInt32(Math.Round(10.0 * (result.Points - result.OpponentsCount * RatingSystem.Pexp(result.RatingBegin - result.AvgOppRating(comp.Results)))));
                        // 5 - Обновить рейтинг и дату в списке игроков
                        player.Rating         = result.RatingBegin + result.Delta;
                        player.LastRatingDate = comp.Date;
                    }
                }
            }
#endif
        }