Защищённый лист Excel после выгрузки из 1С: четыре способа вернуть редактирование

· 9 мин

Содержание

Если пароль известен или его нет, снять защиту с листа Excel можно вручную: вкладка Рецензирование → Снять защиту листа. Из кода 1С то же самое делает одна строка через COM: Лист.Unprotect(Пароль). Для файлов, которые 1С выгружает сама, проще убрать защиту ещё до записи — свойство Защита табличного документа.

Частое заблуждение: «файл из 1С заблокирован, Excel не даёт править». На деле за этим стоят три разных механизма — защита листа, режим защищённого просмотра и пароль на открытие. Снимаются они по-разному, и путать их значит терять время.

Почему лист из 1С приходит защищённым

Сначала определите, что именно мешает. Таблица ниже помогает сделать это за минуту.

Что видит пользовательМеханизмКак снять
Жёлтая полоса сверху и кнопка Разрешить редактированиеЗащищённый просмотр Excel: файл скачан из браузера или почтыНажать кнопку; на защиту листа это не влияет
Сообщение о том, что ячейка находится на защищённом листеЗащита листа (Protect)Снять защиту листа или Unprotect из кода
Нельзя добавить, удалить или переименовать листЗащита структуры книгиРецензирование → Защитить книгу (кнопка работает как переключатель)
Excel просит пароль ещё до открытияШифрование файла паролем на открытиеТолько знание пароля
В заголовке окна «Только для чтения»Атрибут файла или файл открыт другим пользователемСвойства файла в Проводнике, закрыть копию у коллеги

Откуда защита листа берётся в выгрузках из 1С:

  • 🔒 Защита табличного документа. Если отчёт или печатная форма сформированы с ТабличныйДокумент.Защита = Истина, при записи в xlsx лист может оказаться защищённым без пароля.
  • 📄 Шаблон Excel. Обработка заполняет готовый файл-шаблон, а в нём автор шаблона включил защиту, чтобы не сломали формулы.
  • 🧩 Внешние обработки и интеграции. Код сам вызывает Protect после заполнения: так защищают бланки, которые потом рассылают контрагентам.
  • 📥 Файл пришёл со стороны. Контрагент защитил лист, а вам нужно загрузить данные в 1С.

Защита листа — это не шифрование. Данные лежат в файле открыто, Excel просто запрещает их менять через интерфейс. Поэтому читать значения ячеек из 1С можно и не снимая защиту.

Снятие защиты листа Excel через COM-объект из 1С

Самый гибкий способ: 1С запускает Excel в фоне, открывает книгу и снимает защиту со всех листов. Формулы, форматы и макросы сохраняются.

Что нужно для работы

  1. На компьютере, где выполняется код, установлен Microsoft Excel.
  2. Код выполняется на клиенте под Windows: тонкий или толстый клиент. В веб-клиенте и на Linux COMОбъект недоступен.
  3. Известен пароль на листы. Если его нет, передавайте пустую строку.

Код обработки

&НаКлиенте
Процедура СнятьЗащитуКниги(ПутьКФайлу, Пароль = "")

    Excel = Неопределено;
    Попытка
        Excel = Новый COMОбъект("Excel.Application");
        Excel.DisplayAlerts = Ложь;
        Excel.Visible = Ложь;

        Книга = Excel.Workbooks.Open(ПутьКФайлу);

        Для Н = 1 По Книга.Worksheets.Count Цикл
            Лист = Книга.Worksheets(Н);
            Если Лист.ProtectContents Тогда
                Лист.Unprotect(Пароль);
            КонецЕсли;
        КонецЦикла;

        Если Книга.ProtectStructure Тогда
            Книга.Unprotect(Пароль);
        КонецЕсли;

        Книга.Save();
        Книга.Close(Ложь);
    Исключение
        Сообщить("Не удалось снять защиту: " + ОписаниеОшибки());
    КонецПопытки;

    Если Excel <> Неопределено Тогда
        Excel.Quit();
        Excel = Неопределено;
    КонецЕсли;

КонецПроцедуры

Что здесь важно:

  • ПутьКФайлу — полный путь, например C:\Выгрузка\Отчет.xlsx. Относительный путь Excel будет искать в своей рабочей папке.
  • DisplayAlerts = Ложь гасит диалоги Excel. Без этого фоновый процесс может ждать ответа на вопрос, которого никто не видит.
  • ProtectContents показывает, защищено ли содержимое листа. Проверка нужна, чтобы не трогать незащищённые листы.
  • Excel.Quit() стоит после КонецПопытки, поэтому Excel закрывается и при ошибке.

Если у листов разные пароли

Бывает, что бланк собран из листов разных авторов. Тогда перебирайте известные пароли для каждого листа:

Функция СнятьЗащитуЛиста(Лист, СписокПаролей)

    Для Каждого Пароль Из СписокПаролей Цикл
        Попытка
            Лист.Unprotect(Пароль);
            Если Не Лист.ProtectContents Тогда
                Возврат Истина;
            КонецЕсли;
        Исключение
            // Пароль не подошёл, пробуем следующий
        КонецПопытки;
    КонецЦикла;

    Возврат Ложь;

КонецФункции

СписокПаролей — массив строк. Первым элементом удобно положить пустую строку: так снимается защита без пароля.

Перебор работает только по паролям, которые вам выдали. Подбирать чужой пароль к чужому файлу — не задача для учётной системы, и в справочнике мы такие приёмы не разбираем.

Обработка целой папки

Когда защищённых файлов десятки, не запускайте Excel заново для каждого: это медленно и плодит процессы. Создайте один COMОбъект, а внутри цикла по файлам открывайте и закрывайте книги:

Файлы = НайтиФайлы("C:\Выгрузка", "*.xlsx");
Для Каждого Файл Из Файлы Цикл
    Книга = Excel.Workbooks.Open(Файл.ПолноеИмя);
    Для Н = 1 По Книга.Worksheets.Count Цикл
        Лист = Книга.Worksheets(Н);
        Если Лист.ProtectContents Тогда
            Лист.Unprotect(Пароль);
        КонецЕсли;
    КонецЦикла;
    Книга.Save();
    Книга.Close(Ложь);
КонецЦикла;

НайтиФайлы выполняется на клиенте и возвращает массив объектов Файл; свойство ПолноеИмя даёт полный путь, который нужен Excel. Временные файлы Excel с именем, начинающимся на ~$, лучше пропускать проверкой имени.

Макрос VBA для снятия защиты со всех листов

Макрос удобен, когда защиту снимает сам пользователь, без участия 1С, или когда одна и та же книга обрабатывается регулярно.

Текст макроса

Sub UnprotectAllSheets(Optional pwd As String = "")
    Dim ws As Worksheet
    For Each ws In ActiveWorkbook.Worksheets
        If ws.ProtectContents Then ws.Unprotect Password:=pwd
    Next ws
    If ActiveWorkbook.ProtectStructure Then ActiveWorkbook.Unprotect Password:=pwd
End Sub

Как подключить вручную:

  1. Откройте книгу и нажмите Alt+F11 — откроется редактор VBA.
  2. В меню редактора выберите Insert → Module и вставьте текст.
  3. Запустите макрос через Alt+F8.
  4. Сохраните книгу в формате .xlsm: в .xlsx макросы не сохраняются.

Вызов макроса из 1С

Если макрос лежит в самой книге, после Workbooks.Open вызовите его через Run:

Excel.Run("'Отчет.xlsm'!UnprotectAllSheets", Пароль);

Тонкость, на которой спотыкаются: при запуске Excel через COM личная книга макросов PERSONAL.XLSB и надстройки из автозагрузки не открываются. Макрос, который вручную «всегда под рукой», из 1С окажется недоступен. Откройте файл личной книги явно через Workbooks.Open или держите макрос в отдельной служебной книге.

Если нужен только результат, макрос избыточен: тот же цикл на COM из предыдущего раздела не требует ни .xlsm, ни настроек безопасности макросов.

Выгрузка без защиты через табличный документ

Когда файл формирует ваша же 1С, защиту проще не создавать, чем потом снимать.

Убрать защиту перед записью

Перед вызовом Записать сбросьте два свойства табличного документа:

ТабДок.Защита = Ложь;
ТабДок.ТолькоПросмотр = Ложь;
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);

Свойство Защита запрещает менять ячейки, ТолькоПросмотр — редактировать документ целиком. В типовых формах, открытых пользователем, сохранить отчёт в Excel можно и через команду сохранения в командной панели табличного документа. Но если защита задана в коде формирования, лучше поправить код: обычно в расширении конфигурации, чтобы не снимать типовую с поддержки.

Пересохранить готовый файл через 1С

Если на компьютере нет Excel, книгу можно прочитать в табличный документ и записать заново. Этот вариант работает и на сервере, и на Linux:

&НаСервере
Процедура ПересохранитьБезЗащиты(ПутьИсходный, ПутьНовый)

    ТабДок = Новый ТабличныйДокумент;
    ТабДок.Прочитать(ПутьИсходный);
    ТабДок.Защита = Ложь;
    ТабДок.ТолькоПросмотр = Ложь;
    ТабДок.Записать(ПутьНовый, ТипФайлаТабличногоДокумента.XLSX);

КонецПроцедуры

Плата за простоту:

  • ❌ формулы превращаются в значения;
  • ❌ часть оформления теряется: условное форматирование, проверка данных, диаграммы;
  • ❌ макросы не переносятся.

Для загрузки данных в 1С это обычно не мешает. Для бланка, который дальше заполняют люди, — мешает.

Правка xlsx как архива: способ без Excel

Файл .xlsx — это zip-архив с XML-файлами внутри. Защита каждого листа записана одним тегом <sheetProtection ... /> в файле xl/worksheets/sheet1.xml (и далее по номерам листов). Защита структуры книги — тег <workbookProtection ... /> в xl/workbook.xml.

Порядок действий:

  1. Сделайте копию файла: работайте только с ней.
  2. Переименуйте копию из .xlsx в .zip и распакуйте.
  3. Откройте xl/worksheets/sheetN.xml в текстовом редакторе, найдите тег sheetProtection и удалите его целиком, от < до />.
  4. Упакуйте содержимое обратно так, чтобы папки xl, _rels, docProps и файл [Content_Types].xml лежали в корне архива, а не во вложенной папке.
  5. Верните расширение .xlsx и откройте файл.

Из 1С этот путь автоматизируется объектами ЧтениеZipФайла и ЗаписьZipФайла: распаковать во временный каталог, поправить XML, упаковать обратно. Excel для этого не нужен.

Способ подходит только для своих файлов или файлов, которые вам разрешено менять. Он не работает со старым форматом .xls и с книгами, зашифрованными паролем на открытие: там содержимое архива недоступно без пароля.

Ошибки при снятии защиты и как с ними справиться

Большинство сбоев при работе с Excel из 1С связаны не с самой защитой, а с окружением: где выполняется код, под каким пользователем, кто держит файл.

Диагностика: выберите симптом

Почему не стоит запускать Excel на сервере 1С

Код с COMОбъект можно вызвать и в серверной процедуре, но это плохая идея:

  • ⚙️ служба сервера 1С работает под отдельной учётной записью, у которой нет профиля Excel и прав на интерактивные окна;
  • 🧱 любой диалог Excel повесит рабочий процесс, и пользователь будет ждать без ответа;
  • 📜 Microsoft не поддерживает автоматизацию Office из серверных служб.

Если обработка должна работать на сервере, выбирайте пересохранение через табличный документ или правку архива.

Какой способ выбрать

СпособКогда подходитЧто теряетсяНужен Excel
Кнопка Снять защиту листаРазовый файл, пароль известенНичегоДа
COM из 1СРегулярная обработка на клиенте WindowsНичегоДа, на клиенте
Макрос VBAПользователь сам обрабатывает книгиНичего, но нужен .xlsmДа
Защита = Ложь до записиФайл формирует ваша 1СНичегоНет
Пересохранение через табличный документСервер, Linux, нужны только данныеФормулы, часть оформленияНет
Правка XML в архивеСвой файл, пароль утерян, Excel нетНичегоНет

Короткое правило: если файл делаете вы — уберите защиту в коде выгрузки. Если файл чужой и пароль есть — COM. Если нужен только набор данных для загрузки — читайте в табличный документ, защита этому не мешает.

Частые вопросы

Можно ли загрузить данные в 1С из защищённого листа, не снимая защиту?
Да. Защита листа запрещает только редактирование в Excel. Метод Прочитать табличного документа и чтение ячеек через COM получают значения без снятия защиты.
Снимает ли Unprotect защиту отдельных диапазонов?
Диапазоны, разрешённые для изменения, работают только поверх защищённого листа. После Unprotect весь лист становится редактируемым, отдельно снимать ничего не нужно.
Как снова защитить лист после правок из 1С?
Вызовите Лист.Protect(Пароль) перед сохранением книги. Без пароля передайте пустую строку — защита включится, но снять её сможет любой.
Работает ли код COM с LibreOffice Calc?
Нет. У LibreOffice другая объектная модель и другое имя COM-объекта. Для таких рабочих мест надёжнее пересохранение через табличный документ.
Что делать с файлом, который требует пароль при открытии?
Это шифрование, а не защита листа. Без пароля законного способа открыть такой файл нет: запросите пароль у автора или исходные данные в другом виде.