private EtlPackageMonitorModel RefreshModel(EtlPackageMonitorModel model)
        {
            // обновляем модель или создаем заново
            var refresh = true;

            if (model == null)
            {
                model = new EtlPackageMonitorModel();

                model.ItemsByColumns = new List<EtlPackageMonitorItem>[SiteConfiguration.MaxCoulmnsToShow];
                for (var columnIndex = 0; columnIndex < SiteConfiguration.MaxCoulmnsToShow; columnIndex++)
                {
                    model.ItemsByColumns[columnIndex] = new List<EtlPackageMonitorItem>();
                }

                refresh = false;
            }

            model.ColumnCount = SiteConfiguration.MaxCoulmnsToShow;

            IEnumerable<EtlPackage> packages = new EtlPackage[0];
            if (model.Items.Count() > 0)
            {
                // идентификаторы пакетов из модели которые необходимо обновить
                var packageIds = model.Items.Where(i => i.ForceRefresh || i.EtlPackageStatus != EtlPackageMonitorItemStatus.Succeeded).Select(i => i.EtlPackageId);
                // сами пакеты
                packages = GetEtlPackages().Where(p => packageIds.Contains(p.Id, StringComparer.OrdinalIgnoreCase));
            }
            else
            {
                packages = GetEtlPackages();
            }

            var agent = SiteConfiguration.GetEtlAgent();
            var logParser = agent.GetEtlLogParser();
            var sessions = logParser.GetLatestEtlSessions(packages.Select(p => p.Id).ToArray());

            model.HasErrors = false;

            var packageIndex = 0;
            foreach (var package in packages)
            {
                var item = new EtlPackageMonitorItem();
                item.EtlPackageId = package.Id;
                item.RunIntervalSeconds = package.RunIntervalSeconds;
                item.EtlPackageName = package.Name;
                item.CanInvoke = true;

                var session = sessions.Where(s => s.EtlPackageId == package.Id).FirstOrDefault();

                if (session != null)
                {
                    item.EtlSessionId = session.EtlSessionId;
                    item.EtlSessionDateTime = session.EndDateTime;
                    item.EtlPackageStatus = EtlPackageMonitorItemStatuses.GetMonitorItemStatus(session, package.RunIntervalSeconds);

                    item.Counters = logParser.GetEtlCounters(package.Id, session.EtlSessionId);

                    var messages = logParser.GetEtlMessages(package.Id, session.EtlSessionId);
                    if (item.EtlPackageStatus == EtlPackageMonitorItemStatus.Failed)
                    {
                        var errorMessage = messages.OrderByDescending(m => m.SequentialId).FirstOrDefault(m => m.MessageType == EtlMessageType.Error);
                        item.StatusMessage = errorMessage == null ? DEFAULT_ERROR_MSG : errorMessage.Text;
                    }

                    if (item.EtlPackageStatus == EtlPackageMonitorItemStatus.TooFar && session.Status == EtlStatus.Started)
                    {
                        item.StatusMessage = PACKAGE_CURRENTLY_RUNNING;
                    }
                }
                else
                {
                    item.EtlPackageStatus = EtlPackageMonitorItemStatus.Never;
                }

                if (item.EtlPackageStatus != EtlPackageMonitorItemStatus.Succeeded)
                {
                    model.HasErrors = true;
                }

                if (refresh)
                {
                    var pack = model.Items.FirstOrDefault(i => String.Equals(i.EtlPackageId, package.Id, StringComparison.OrdinalIgnoreCase));
                    if (pack != null)
                    {
                        pack.UpdateFromItem(item);
                    }
                }
                else
                {
                    var columnIndex = packageIndex % SiteConfiguration.MaxCoulmnsToShow;
                    model.ItemsByColumns[columnIndex].Add(item);
                }

                packageIndex++;
            }

            for (var columnIndex = 0; columnIndex < model.ItemsByColumns.Length; columnIndex++)
            {
                if (model.MaxItemCountInColumn < model.ItemsByColumns[columnIndex].Count)
                {
                    model.MaxItemCountInColumn = model.ItemsByColumns[columnIndex].Count;
                }
            }

            model.LastUpdated = DateTime.Now;

            return model;
        }