/// <summary>
        ///   Создание отказов для логов.
        /// </summary>
        /// <param name="session">Сессия Nhibernate</param>
        /// <param name="log">Лог, о получении документа</param>
        /// <param name="metaForRedmineErrorIssueList"></param>
        private static void ProcessReject(ISession session, DocumentReceiveLog log, List <MetadataOfLog> metaForRedmineErrorIssueList)
        {
            RejectHeader reject;
            //если есть назначенные поставщику правила разбора
            var parsers = session.Query <RejectDataParser>().Where(x => x.Supplier.Id == log.Supplier.Id).ToList();

            //попытка распарсить ими
            reject = RejectDataParser.Parse(log, parsers);
            //иначе, выбор из имеющихся парсеров
            if (reject == null)
            {
                var parser = GetRejectParser(log);
                if (parser == null)
                {
                    if (log.DocumentType == DocType.Reject)
                    {
                        //создаем задачу на Redmine, прикрепляя файлы
                        Redmine.CreateIssueForLog(ref metaForRedmineErrorIssueList, log);
                    }
                    return;
                }
                reject = parser.CreateReject(log);
                if (reject == null)
                {
                    if (log.DocumentType == DocType.Reject)
                    {
                        //создаем задачу на Redmine, прикрепляя файлы
                        Redmine.CreateIssueForLog(ref metaForRedmineErrorIssueList, log);
                    }
                    return;
                }
            }
            if (reject.Lines.Count > 0)
            {
                try {
                    reject.Normalize(session);
                } catch (Exception e) {
                    _log.Error(string.Format("Не удалось идентифицировать товары отказа {0}", log.GetFileName()), e);
                }
                session.Save(reject);
            }
        }
        private IEnumerable <Document> ParseWaybills(List <DocumentReceiveLog> logs)
        {
            var metaForRedmineErrorIssueList = new List <MetadataOfLog>();
            var rejects = logs.Where(l => l.DocumentType == DocType.Reject).ToArray();

            foreach (var reject in rejects)
            {
                if (WaybillExcludeFile(reject))
                {
                    continue;
                }

                try {
                    SessionHelper.WithSession(s => ProcessReject(s, reject, metaForRedmineErrorIssueList));
                } catch (Exception e) {
                    _log.Error(string.Format("Не удалось разобрать отказ {0}", reject.FileName), e);
                    //создаем задачу на Redmine, прикрепляя файлы
                    Redmine.CreateIssueForLog(ref metaForRedmineErrorIssueList, reject);
                }
            }

            var docsForParsing = MultifileDocument.Merge(logs);
            var docs           = docsForParsing.Select(d => {
                try {
                    if (WaybillExcludeFile(d.DocumentLog))
                    {
                        return(null);
                    }

                    var docToReturn = ProcessWaybill(d.DocumentLog, d.FileName);
                    //если не получилось распарсить документ
                    if (docToReturn == null && d.DocumentLog?.DocumentType == DocType.Waybill)
                    {
                        //создаем задачу на Redmine, прикрепляя файлы
                        Redmine.CreateIssueForLog(ref metaForRedmineErrorIssueList, d.DocumentLog);
                    }
                    return(docToReturn);
                } catch (Exception e) {
                    var filename   = d.FileName;
                    var errorTitle = string.Format("Не удалось разобрать накладную {0}", filename);
                    _log.Error(errorTitle, e);
                    SaveWaybill(filename);

                    if (d.DocumentLog?.DocumentType == DocType.Waybill)
                    {
                        //создаем задачу на Redmine, прикрепляя файлы
                        Redmine.CreateIssueForLog(ref metaForRedmineErrorIssueList, d.DocumentLog);
                    }
                    return(null);
                }
            }).Where(d => d != null).ToList();

            MultifileDocument.DeleteMergedFiles(docsForParsing);

            docs.Each(d => {
                if (d.Log.IsFake)
                {
                    d.Log.Save();
                }
                d.Save();
                d.CreateCertificateTasks();
            });
            return(docs);
        }