Одновременное согласование документа. Реализация с использованием объектной модели MS Word

27 0

При параллельном согласовании документа возникает необходимость редактирования несколькими пользователями одновременно одного и того же документа. Вариантов по одновременному согласованию документа существует много (от редактирования каждым пользователем своего абзаца, с последующим сведением таких абзацев в единый документ, до одновременного редактирования документа в браузере (Google Docs, MS Office 365, облако МойОфис)). Подробнее об основных кейсах одновременного согласования можно почитать в этой статье.

Одним из способов решения проблемы одновременного редактирования документа является создание для каждого согласующего пользователя отдельной версии (или копии документа) на основе оригинала, а затем слияния всех созданных версий (копий документов) в одну, с учетом проведенных пользователями правок.

При этом есть различные вариации:

  1. "Слияние версий". Согласующие пользователи вносят правки в текст своего документа. Тексты документов сводятся в один. Инициатор документа, учитывая правки согласующих в тексте, редактирует документ и отправляет его на повторное согласование;
  2. "Слияние примечаний". Согласующие пользователи добавляют примечания к тексту, не изменяя при этом сам текст. Примечания к документу сводятся. Инициатор документа, учитывая примечания согласующих, редактирует документ и отправляет его на повторное согласование;
  3. "Смешанный вариант". Пользователи могут изменять текст и добавлять примечания.

Какую из вариаций выбрать, нужно решать в каждом случае индивидуально. Если предполагается, что согласующих будет много и инициатор документа будет сводить все замечания согласующих, то возможно, инициатору проще будет учитывая все пожелания согласующих, самому доработать документ. Т.е. в этом случае у согласующих будет возможность только добавлять примечания к тексту, без возможности редактирования текста. А инициатору не придется думать, что же делать со словосочетанием, которое исправили все согласующие и каждый из них изменил его по-своему. 

В этой статье рассмотрен вариант программной реализации кейса по одновременному согласованию документа с использованием объектной модели 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 может работать долго.

Плюсы описанного решения

- Относительно нетрудоёмко;

- Не нужно разрабатывать специальных алгоритмов по слиянию документов.

Минусы

- Нестабильная работа при большом количестве одновременных процессов по слиянию документов или при больших объемах документа.

 

27
Авторизуйтесь, чтобы оценить материал.
5
Пока комментариев нет.

Авторизуйтесь, чтобы написать комментарий