Как программно из 1С включить отслеживание исправлений в файле Excel?

Программист IT и автоматизация бизнеса
← На главную

В процессе автоматизации работы с документами часто возникает задача управлять файлами Microsoft Excel непосредственно из кода 1С. Одна из таких задач — включить встроенный в Excel механизм отслеживания исправлений (рецензирования), не требуя от пользователя выполнять эти действия вручную. Рассмотрим по шагам, как это сделать с помощью COMОбъект.

Основная цель — программно активировать для книги Excel опцию, которая позволяет видеть историю изменений, вносимых разными пользователями. Для этого нам потребуется не только изменить свойство книги, но и сохранить ее в специальном режиме.

Основной принцип: включение истории и сохранение в общем доступе

Чтобы функция отслеживания исправлений заработала, необходимо выполнить два ключевых действия:

  1. Установить свойство книги KeepChangeHistory в значение Истина (True). Это "включает" сам механизм хранения истории изменений.
  2. Сохранить книгу в режиме общего доступа (Shared Workbook). Это обязательное условие, без которого отслеживание работать не будет. В объектной модели Excel за это отвечает параметр AccessMode со значением xlShared (числовое значение 2).

Просто установить свойство KeepChangeHistory недостаточно. Файл должен быть физически пересохранен с указанием, что он является общим. Давайте разберем, как это реализовать в коде 1С.

Пошаговый пример кода на 1С

Проанализируем готовый рабочий пример, который полностью решает поставленную задачу. Он включает в себя создание COM-объекта, открытие файла, установку необходимых свойств и корректное сохранение.


// Путь - это переменная, содержащая полный путь к вашему файлу Excel
Путь = "C:\Temp\МойФайл.xlsx";

// 1. Создаем COM-объект для взаимодействия с Excel
Excel = Новый COMОбъект("Excel.Application");
// Отключаем стандартные оповещения Excel, чтобы они не мешали выполнению кода
Excel.DisplayAlerts = Ложь;

// 2. Открываем нужную книгу
Workbook = Excel.Workbooks.Open(Путь);

// 3. Устанавливаем ключевые свойства
// Разрешаем хранить персональную информацию, если это необходимо
Workbook.RemovePersonalInformation = Ложь; 
// Включаем хранение истории изменений
Workbook.KeepChangeHistory = Истина;

// 4. Подготавливаем параметры для метода SaveAs
FileName = Путь;
FileFormat = 51; // 51 соответствует формату xlOpenXMLWorkbook (для .xlsx)
Password = Неопределено;
WriteResPassword = Неопределено;
ReadOnlyRecommended = Неопределено;
CreateBackup = Ложь;
AccessMode = 2; // Это константа xlShared, включающая режим общего доступа. Ключевой параметр!
ConflictResolution = 2; // xlLocalSessionChanges, определяет, чьи изменения приоритетны при конфликте
AddToMru = Неопределено;
TextCodepage = Неопределено;
TextVisualLayout = Неопределено;
Local = Неопределено;

// 5. Пересохраняем книгу с новыми параметрами
Workbook.SaveAs(
    FileName, 
    FileFormat, 
    Password, 
    WriteResPassword, 
    ReadOnlyRecommended, 
    CreateBackup, 
    AccessMode, 
    ConflictResolution, 
    AddToMru, 
    TextCodepage, 
    TextVisualLayout, 
    Local);

// 6. Завершаем работу и освобождаем ресурсы
Excel.Quit();
Excel = Неопределено;

Разберем код подробнее:

Настройка отображения изменений: почему не сохраняется опция "Все"?

В процессе работы был поднят важный дополнительный вопрос: как программно установить, чтобы Excel по умолчанию показывал все исправления, а не только "с момента последнего сохранения"?

Исследование показало, что настройки отображения исправлений (например, фильтр по времени "Все" или "Непросмотренные") являются сеансовыми. Это означает, что они не сохраняются внутри файла .xlsx, а применяются только для текущей сессии текущего пользователя. Когда другой пользователь или ваша программа откроет файл заново, эти настройки сбросятся к значениям по умолчанию.

Что это значит на практике? Если вам нужно для какой-то программной обработки или анализа увидеть все изменения, вам придется каждый раз при открытии файла применять эти настройки заново.

Для этого используется метод HighlightChangesOptions. Чтобы установить фильтр "Все изменения", нужно передать параметр When со значением xlAllChanges (числовое значение 1).

Примерно так это будет выглядеть в коде 1С после открытия книги:


// ... после строки Workbook = Excel.Workbooks.Open(Путь);
// Устанавливаем опцию отображения всех изменений
// When:=xlAllChanges (1), Who:="Everyone" (1), Where:=...
Workbook.HighlightChangesOptions(1); 
Workbook.HighlightChangesOnScreen = Истина;

Запомните: эта настройка не "запишется" в файл при сохранении. Она лишь временно изменит вид отображения для текущего сеанса работы с COM-объектом.

Важное замечание: устаревшая технология и современная альтернатива

Следует понимать, что функция "Общие книги" (Shared Workbooks), на которой основано отслеживание исправлений, считается устаревшей технологией в современных версиях Excel (начиная с Excel 2016 и Microsoft 365).

Ее использование накладывает серьезные ограничения:

Современной и рекомендуемой Microsoft альтернативой является функция "Совместное редактирование" (Co-authoring). Она работает для файлов, сохраненных в облачных хранилищах OneDrive или SharePoint, и позволяет нескольким пользователям одновременно редактировать один и тот же документ. История версий и просмотр изменений реализованы там более надежно и удобно через опцию "Показать изменения" на вкладке "Рецензирование". Однако управление этой функцией из 1С через COM-объект может быть затруднительно или невозможно.

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

← На главную