При параллельном согласовании документа возникает необходимость редактирования несколькими пользователями одновременно одного и того же документа. Вариантов по одновременному согласованию документа существует много (от редактирования каждым пользователем своего абзаца, с последующим сведением таких абзацев в единый документ, до одновременного редактирования документа в браузере (Google Docs, MS Office 365, облако МойОфис)). Подробнее об основных кейсах одновременного согласования можно почитать в этой статье.
Одним из способов решения проблемы одновременного редактирования документа является создание для каждого согласующего пользователя отдельной версии (или копии документа) на основе оригинала, а затем слияния всех созданных версий (копий документов) в одну, с учетом проведенных пользователями правок.
При этом есть различные вариации:
Какую из вариаций выбрать, нужно решать в каждом случае индивидуально. Если предполагается, что согласующих будет много и инициатор документа будет сводить все замечания согласующих, то возможно, инициатору проще будет учитывая все пожелания согласующих, самому доработать документ. Т.е. в этом случае у согласующих будет возможность только добавлять примечания к тексту, без возможности редактирования текста. А инициатору не придется думать, что же делать со словосочетанием, которое исправили все согласующие и каждый из них изменил его по-своему.
В этой статье рассмотрен вариант программной реализации кейса по одновременному согласованию документа с использованием объектной модели MS Word (ОМ). При этом можно использовать все три вариации на выбор (слияние версий, слияние примечаний или смешанный вариант).
В MS Word существует возможность выполнить объединение исправлений из копий документа в один документ. Как это сделать видно на скриншоте ниже:
Аналогичный функционал можно реализовать, используя ОМ. Для этого в ОМ начиная с MS Word 2010 появился метод по слиянию документов MergeDocuments. Метод позволяет слить два документа в один.
Для того, чтобы слить несколько копий документов можно воспользоваться следующей схемой:
Сначала сливаются первые две копии документа, затем сливаются полученный документ со следующей копией и т.д. пока не сольются все копии в один документ.
Для реализации получен примерно такой код:
// в SourceFileList - содержится список имен файлов копий документа
Count = SourceFileList.Count
if Count > 0
wdCompareDestinationNew = 2 // в новый файл
wdGranularityWordLevel = 1 // по словам
wdFormatDocumentDefault = 16 // DOCX - по умолчанию
WordApplication = CreateObject("Word.Application")
FirstFile = SourceFileList.Values(0)
Ext = ExtractFileExt(FirstFile)
TmpFolder = GetTempFolder()
MergeFileTemplate = TmpFolder & "merge_%s_%s" & Ext
MergeFile = ''
Idx = 1 // сразу со второго файла
while Idx < Count
SecondFile = SourceFileList.Values(Idx)
FirstDoc = WordApplication.Documents.Open(FirstFile)
SecondDoc = WordApplication.Documents.Open(SecondFile)
MergeDoc = WordApplication.MergeDocuments(FirstDoc; SecondDoc; wdCompareDestinationNew; wdGranularityWordLevel)
FirstDoc.Close
SecondDoc.Close
if MergeFile <<>> ''
DeleteFile(MergeFile)
endif
MergeFile = Format(MergeFileTemplate; ArrayOf(Idx; NewID()))
MergeDoc.SaveAs2(MergeFile; wdFormatDocumentDefault)
MergeDoc.Close
FirstFile = MergeFile
Idx = Idx + 1
endwhile
WordApplication.Quit
WordApplication = nil
FirstDoc = nil
SecondDoc = nil
MergeDoc = nil
if Assigned(ResultFile)
MoveFile(MergeFile; ResultFile)
else
ResultFile = MergeFile
endif
Result = ResultFile
endif
Пусть согласование документа проводят Иванов, Петров, Сидоров. Инициатор подготавливает документ и отправляет согласующим. Для каждого согласующего создается своя копия документа и приходит задание с вложенной индивидуальной копией документа.
Иванов решил, что никакие изменения не нужны, а Петров и Сидоров внесли изменения в текст документа, а также добавили примечания:
Копия документа Иванова:
Копия документа Петрова:
Копия документа Сидорова:
После внесения изменений, согласующие выполняют задание на согласование. Проводится слияние копий документов. В результате чего получается итоговый документ, который получит инициатор:
Если необходимо, чтобы согласующие могли добавлять только примечания к тексту (без возможности его правки), то предварительно каждую копию документа необходимо защитить от редактирования методом Protect.
Применять данное решение рекомендуется только, если одновременных процессов по согласованию будет мало, так как при увеличении "процессов слияния документов" увеличивается количество запускаемых процессов Word. А они, в большом количестве, не позволяют системе чувствовать себя хорошо (зависают, некорректно завершаются). Необходимо убедиться, что при завершении слияния процесс Word корректно завершился (а если это не так, то спроектировать механизм, позволяющий это сделать наподобие того, как сделано тут). Также стоит учитывать, что при большом объеме документа процесс Word может работать долго.
Плюсы описанного решения
- Относительно нетрудоёмко;
- Не нужно разрабатывать специальных алгоритмов по слиянию документов.
Минусы
- Нестабильная работа при большом количестве одновременных процессов по слиянию документов или при больших объемах документа.
Авторизуйтесь, чтобы написать комментарий