Как в 1С программно снять общий доступ с книги Excel и обойти защиту листа?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

В результате при попытке программно снять защиту листа методом Unprotect в 1С возникает ошибка COM-объекта:

«Метод Unprotect из класса Worksheet завершен неверно»

Выясним причину такого поведения: в режиме совместного доступа (Shared Workbook / MultiUserEditing) Microsoft Excel блокирует операции изменения структуры и управление защитой листов. Разберем по шагам, как решить эту проблему несколькими способами.

Способ 1. Программное отключение общего доступа через COM-объект

Если для интеграции используется COM-соединение с приложением Excel, необходимо проверить, находится ли книга в режиме общего доступа, и перевести ее в монопольный режим с помощью метода ExclusiveAccess.

Рассмотрим подробнее реализацию этого алгоритма на платформе 1С:


// Создаем COM-объект для работы с Excel
Попытка
    ExcelПриложение = Новый COMОбъект("Excel.Application");
Исключение
    ВызватьИсключение "Не удалось инициализировать Microsoft Excel: " + ОписаниеОшибки();
КонецПопытки;

ExcelПриложение.DisplayAlerts = Ложь;
ExcelПриложение.Visible = Ложь;

Попытка
    // Открываем книгу в режиме для чтения и записи
    Книга = ExcelПриложение.Workbooks.Open(ПутьКФайлу, , Ложь);
    
    // Проверяем, включен ли режим совместного доступа
    Если Книга.MultiUserEditing Тогда
        // Переводим книгу в монопольный режим
        Книга.ExclusiveAccess();
        Книга.Save();
    КонецЕсли;
    
    // Теперь можно безопасно снять защиту листа при необходимости
    Лист = Книга.Sheets(1);
    Лист.Unprotect("ТутМегаПароль!!!!!");
    
    // Обработка данных книги...
    
    Книга.Close(Ложь);
Исключение
    ExcelПриложение.Quit();
    ВызватьИсключение "Ошибка обработки книги Excel: " + ОписаниеОшибки();
КонецПопытки;

ExcelПриложение.Quit();

Проанализируем важные нюансы работы с методом ExclusiveAccess:

  1. Права на запись: Метод ExclusiveAccess() корректно выполняется только в том случае, если файл открыт с возможностью редактирования (параметр ReadOnly в Workbooks.Open должен быть равен Ложь).
  2. Очистка журнала изменений: При отключении общего доступа Excel автоматически удаляет журнал изменений (Change History). Чтобы изменения зафиксировались, обязательно вызывайте метод Save().
  3. Подавление диалоговых окон: Свойство DisplayAlerts = Ложь предотвращает появление интерактивных окон с подтверждением отключения совместного доступа.

Способ 2. Чтение данных без снятия защиты листа

В большинстве задач по загрузке заказов или прайс-листов в 1С нет реальной необходимости снимать защиту листа. Защита листа (Protect) в Excel разработана для ограничения интерактивных действий пользователя через графический интерфейс. Программное чтение данных через COM-модель выполняется независимо от наличия пароля на листе.

Посмотрим на пример быстрого чтения заполненных колонок без вызова Unprotect:


ExcelПриложение = Новый COMОбъект("Excel.Application");
ExcelПриложение.Visible = Ложь;
Книга = ExcelПриложение.Workbooks.Open(ПутьКФайлу, , Истина); // Открываем только для чтения
Лист = Книга.Sheets(1);

// Получаем общее количество строк на листе
ВсегоСтрок = Лист.UsedRange.Rows.Count;

Для НомерСтроки = 2 По ВсегоСтрок Цикл
    Артикул = СокрЛП(Лист.Cells(НомерСтроки, 1).Value);
    Количество = Число(Лист.Cells(НомерСтроки, 2).Value);
    
    Если Не ПустаяСтрока(Артикул) И Количество > 0 Тогда
        // Заполняем табличную часть документа в 1С
    КонецЕсли;
КонецЦикла;

Книга.Close(Ложь);
ExcelПриложение.Quit();

Способ 3. Загрузка через штатный объект ТабличныйДокумент (без Excel)

Если на сервере 1С не установлен Microsoft Office или требуется исключить зависимость от COM-технологии, самым надежным решением является чтение файла через встроенный объект платформы ТабличныйДокумент.

Штатный механизм 1С напрямую разбирает структуру файлов .xlsx и .xls, полностью игнорируя защиту отдельных листов, пароли ячеек и статус совместного доступа.


ТабДок = Новый ТабличныйДокумент;
Попытка
    ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
    ВызватьИсключение "Не удалось прочитать файл: " + ОписаниеОшибки();
КонецПопытки;

ВсегоСтрок = ТабДок.ВысотаТаблицы;
Для НомерСтроки = 2 По ВсегоСтрок Цикл
    НоменклатураНаименование = ТабДок.Область(НомерСтроки, 1).Текст;
    Количество = ТабДок.Область(НомерСтроки, 2).Значение;
    
    // Перенос полученных данных в структуру 1С
КонецЦикла;

Способ 4. Снятие защиты через прямое редактирование XML внутри архива XLSX

Файлы формата .xlsx представляют собой обычные ZIP-архивы, содержащие XML-файлы с разметкой книги. Если требуется снять защиту листа без запуска Microsoft Excel, можно модифицировать XML-структуру средствами платформы 1С:

  1. Распакуйте файл книги с помощью объекта ЧтениеZipФайла во временный каталог.
  2. Найдите файл описания нужного листа (например, xl/worksheets/sheet1.xml).
  3. Откройте файл через ЧтениеXML или как текст и удалите тег <sheetProtection ... />.
  4. Упакуйте измененные файлы обратно в архив с расширением .xlsx объектом ЗаписьZipФайла.

Данный подход полностью очищает информацию о защите листа и позволяет получить готовый файл для последующей стандартной обработки.

← На главную