/// <summary>
        /// Возвращает заполненный шаблон дня и список используемых картинок для вставки в итоговый документ
        /// </summary>
        /// <param name="dayRep"></param>
        /// <param name="typiconId"></param>
        /// <param name="day"></param>
        /// <returns></returns>
        private Result <GetDayTemplateResponse> GetFilledDayElements(PrintTemplateRepository dayRep, int typiconId, FilteredOutputDay day)
        {
            var dayTemplate = dayRep.GetDayTemplate(typiconId, day.Header?.SignNumber);

            if (dayTemplate == null)
            {
                return(Result.Fail <GetDayTemplateResponse>($"Ошибка: печатный шаблон дня не был найден"));
            }

            //заменяем дату - обязательно
            var dateReplacement = dayTemplate.XmlElements.ReplaceElementsByText(OutputTemplateConstants.Date, day.Date.ToString("dd MMMM yyyy г."));

            //заменяем день недели - не обязательно
            var dayOfWeekReplacement = dayTemplate.XmlElements.ReplaceElementsByText(OutputTemplateConstants.DayOfWeek, day.Date.ToString("dddd"));

            //заменяем имя дня - не обязательно
            string dayName            = (day.Header != null) ? day.Header.Name.Text : string.Empty;
            var    dayNameReplacement = dayTemplate.XmlElements.ReplaceElementsByText(OutputTemplateConstants.DayName, dayName);

            //вставляем службы
            var worshipsAppending = AppendWorships(dayTemplate.XmlElements, day.Worships);

            var res = Result.Combine(dateReplacement
                                     //, dayOfWeekReplacement
                                     //, dayNameReplacement
                                     , worshipsAppending);

            return((res.Success)
                ? Result.Ok(dayTemplate)
                : Result.Fail <GetDayTemplateResponse>(res.Error));
        }
        private Result <byte[]> PerformWork(int typiconId, FilteredOutputWeek week)
        {
            var weekTemplate = _queryProcessor.Process(new PrintWeekTemplateQuery(typiconId));

            if (weekTemplate == null)
            {
                return(Result.Fail <byte[]>($"Печатный шаблон седмицы для Устава с Id={typiconId} не был найден."));
            }

            using (MemoryStream stream = new MemoryStream())
            {
                stream.Write(weekTemplate.PrintFile, 0, weekTemplate.PrintFile.Length);

                var errors = new StringBuilder();

                using (WordprocessingDocument weekDoc = WordprocessingDocument.Open(stream, true))
                {
                    SetWeekName(weekDoc, week);

                    var placeToPasteSchedule = weekDoc.MainDocumentPart.Document.Body
                                               .FindElementsByText(OutputTemplateConstants.DaysPlacement)
                                               .FirstOrDefault();

                    if (placeToPasteSchedule == null)
                    {
                        return(Result.Fail <byte[]>("Ошибка: в шаблоне седмицы не определено место для вставки дней."));
                    }
                    //находим элемент, после которого можно вставлять шаблоны дней
                    var parentToPasteSchedule = GetParentToPasteSchedule(placeToPasteSchedule);
                    /*var */ parentToPasteSchedule = weekDoc.MainDocumentPart.Document.Body.LastChild;

                    int d = week.Days.Count % weekTemplate.DaysPerPage;

                    using (var dayRep = new PrintTemplateRepository(_queryProcessor))
                    {
                        for (int i = week.Days.Count - 1; i >= 0; i--)
                        {
                            var day = week.Days[i];

                            var modDayTemplate = GetFilledDayElements(dayRep, typiconId, day);

                            if (modDayTemplate.Success)
                            {
                                //добавляем в конечный документ ссылочные объекты (изображения)
                                CopyRelativeElements(weekDoc, modDayTemplate.Value.DocumentPart, modDayTemplate.Value.XmlElements);

                                foreach (var ins in modDayTemplate.Value.XmlElements)
                                {
                                    parentToPasteSchedule.InsertAfterSelf(ins);
                                    //ins.CopyRelativeElements(weekDoc, modDayTemplate.Value.DocumentPart);
                                }

                                d--;
                                if (d == 0 && i > 0)
                                {
                                    //вставляем разрыв страницы
                                    parentToPasteSchedule.InsertAfterSelf(PageBreak);
                                    d = weekTemplate.DaysPerPage;
                                }
                            }
                            else
                            {
                                errors.AppendLine(modDayTemplate.Error);
                            }
                        }
                    }

                    RemovePlaceToPaste(placeToPasteSchedule);

                    weekDoc.MainDocumentPart.Document.Save();

                    weekDoc.Close();
                }

                return((errors.Length == 0)
                        ? Result.Ok(stream.ToArray())
                        : Result.Fail <byte[]>(errors.ToString()));
            }
        }