Защищённый лист Excel после выгрузки из 1С: четыре способа вернуть редактирование
Содержание
Если пароль известен или его нет, снять защиту с листа Excel можно вручную: вкладка Рецензирование → Снять защиту листа. Из кода 1С то же самое делает одна строка через COM: Лист.Unprotect(Пароль). Для файлов, которые 1С выгружает сама, проще убрать защиту ещё до записи — свойство Защита табличного документа.
Частое заблуждение: «файл из 1С заблокирован, Excel не даёт править». На деле за этим стоят три разных механизма — защита листа, режим защищённого просмотра и пароль на открытие. Снимаются они по-разному, и путать их значит терять время.
Почему лист из 1С приходит защищённым
Сначала определите, что именно мешает. Таблица ниже помогает сделать это за минуту.
| Что видит пользователь | Механизм | Как снять |
|---|---|---|
Жёлтая полоса сверху и кнопка Разрешить редактирование | Защищённый просмотр Excel: файл скачан из браузера или почты | Нажать кнопку; на защиту листа это не влияет |
| Сообщение о том, что ячейка находится на защищённом листе | Защита листа (Protect) | Снять защиту листа или Unprotect из кода |
| Нельзя добавить, удалить или переименовать лист | Защита структуры книги | Рецензирование → Защитить книгу (кнопка работает как переключатель) |
| Excel просит пароль ещё до открытия | Шифрование файла паролем на открытие | Только знание пароля |
| В заголовке окна «Только для чтения» | Атрибут файла или файл открыт другим пользователем | Свойства файла в Проводнике, закрыть копию у коллеги |
Откуда защита листа берётся в выгрузках из 1С:
- 🔒 Защита табличного документа. Если отчёт или печатная форма сформированы с
ТабличныйДокумент.Защита = Истина, при записи в xlsx лист может оказаться защищённым без пароля. - 📄 Шаблон Excel. Обработка заполняет готовый файл-шаблон, а в нём автор шаблона включил защиту, чтобы не сломали формулы.
- 🧩 Внешние обработки и интеграции. Код сам вызывает
Protectпосле заполнения: так защищают бланки, которые потом рассылают контрагентам. - 📥 Файл пришёл со стороны. Контрагент защитил лист, а вам нужно загрузить данные в 1С.
Защита листа — это не шифрование. Данные лежат в файле открыто, Excel просто запрещает их менять через интерфейс. Поэтому читать значения ячеек из 1С можно и не снимая защиту.
Снятие защиты листа Excel через COM-объект из 1С
Самый гибкий способ: 1С запускает Excel в фоне, открывает книгу и снимает защиту со всех листов. Формулы, форматы и макросы сохраняются.
Что нужно для работы
- На компьютере, где выполняется код, установлен Microsoft Excel.
- Код выполняется на клиенте под Windows: тонкий или толстый клиент. В веб-клиенте и на Linux
COMОбъектнедоступен. - Известен пароль на листы. Если его нет, передавайте пустую строку.
Код обработки
&НаКлиенте
Процедура СнятьЗащитуКниги(ПутьКФайлу, Пароль = "")
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
Как подключить вручную:
- Откройте книгу и нажмите
Alt+F11— откроется редактор VBA. - В меню редактора выберите
Insert→Moduleи вставьте текст. - Запустите макрос через
Alt+F8. - Сохраните книгу в формате
.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.
Порядок действий:
- Сделайте копию файла: работайте только с ней.
- Переименуйте копию из
.xlsxв.zipи распакуйте. - Откройте
xl/worksheets/sheetN.xmlв текстовом редакторе, найдите тегsheetProtectionи удалите его целиком, от<до/>. - Упакуйте содержимое обратно так, чтобы папки
xl,_rels,docPropsи файл[Content_Types].xmlлежали в корне архива, а не во вложенной папке. - Верните расширение
.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С из защищённого листа, не снимая защиту?
Прочитать табличного документа и чтение ячеек через COM получают значения без снятия защиты.Снимает ли Unprotect защиту отдельных диапазонов?
Unprotect весь лист становится редактируемым, отдельно снимать ничего не нужно.Как снова защитить лист после правок из 1С?
Лист.Protect(Пароль) перед сохранением книги. Без пароля передайте пустую строку — защита включится, но снять её сможет любой.