При выгрузке отчетов и печатных форм из 1С в Excel часто требуется защитить итоговые данные или формулы от изменений, оставив при этом пользователю возможность заполнять отдельные поля (например, выбирать значения из списка), а также пользоваться автофильтром и регулировать ширину колонок под свой экран.
Если применить стандартную защиту листа без дополнительных параметров, Excel блокирует любые манипуляции со столбцами и фильтрацией. Разберем по шагам, как правильно настроить свойства ячеек и применить метод защиты через COM-объект напрямую из 1С.
Выясним причину, почему при включении защиты блокируются ячейки, которые планировалось оставить доступными. В табличном процессоре Excel действует следующее базовое правило:
Locked установлен в значение Истина (True).Protect, флаг Locked не оказывает видимого эффекта — пользователь может свободно редактировать любые данные.Locked равно Истина.Таким образом, для выборочной защиты диапазона правильнее использовать один из двух подходов:
Locked = Ложь), затем установить Locked = Истина только на защищаемый диапазон.Locked = Ложь только для тех ячеек, которые разрешено редактировать пользователю. Второй вариант предпочтителен для больших таблиц, так как массовое изменение свойств всех ячеек листа через Cells может приводить к избыточному потреблению памяти.Проанализируем две важные детали, без которых защита не даст нужного результата:
Password:="..." или AllowFiltering:=True. Все параметры метода Protect необходимо передавать строго по порядку их следования.Рассмотрим порядок следования основных параметров метода Protect для листа Excel:
Password — пароль защиты (строка).DrawingObjects — защита графических фигур и объектов (булево).Contents — защита содержимого заблокированных ячеек (булево).Scenarios — защита сценариев (булево).UserInterfaceOnly — включение защиты только для интерфейса пользователя (булево).AllowFormattingCells — разрешение форматирования ячеек (булево).AllowFormattingColumns — разрешение изменения ширины и форматирования колонок (булево).AllowFormattingRows — разрешение изменения высоты и форматирования строк (булево).AllowInsertingColumns — разрешение вставки колонок (булево).AllowInsertingRows — разрешение вставки строк (булево).AllowInsertingHyperlinks — разрешение добавления гиперссылок (булево).AllowDeletingColumns — разрешение удаления колонок (булево).AllowDeletingRows — разрешение удаления строк (булево).AllowSorting — разрешение сортировки незаблокированных диапазонов (булево).AllowFiltering — разрешение использования автофильтра (булево).AllowUsingPivotTables — разрешение работы со сводными таблицами (булево).Посмотрим на пример кода 1С, в котором создается или открывается книга Excel, разблокируются конкретные ячейки для заполнения, накладывается автофильтр и включается защита с сохранением возможности фильтровать данные и менять ширину столбцов:
// Создаем экземпляр COM-объекта Excel
Попытка
Эксель = Новый COMОбъект("Excel.Application");
Исключение
ВызватьИсключение "Не удалось инициализировать Excel. Проверьте установку MS Office.";
КонецПопытки;
Эксель.Visible = Ложь;
Эксель.DisplayAlerts = Ложь;
// Открываем существующую книгу или создаем новую
Книга = Эксель.Workbooks.Add();
Лист = Книга.Worksheets(1);
// 1. Снимаем блокировку со всех ячеек листа
Лист.Cells.Locked = Ложь;
Лист.Cells.FormulaHidden = Ложь;
// 2. Блокируем только защищаемую область (например, шапку и формулы в диапазоне A1:D50)
ОбластьЗащиты = Лист.Range("A1:D50");
ОбластьЗащиты.Locked = Истина;
ОбластьЗащиты.FormulaHidden = Истина;
// 3. Устанавливаем автофильтр на таблицу ДО применения защиты
Лист.Range("A1:H1").AutoFilter();
// 4. Задаем параметры метода Protect:
// 1. Password = "МойПароль"
// 2. DrawingObjects = Истина
// 3. Contents = Истина
// 4. Scenarios = Ложь
// 5. UserInterfaceOnly = Ложь
// 6. AllowFormattingCells = Истина
// 7. AllowFormattingColumns = Истина (разрешает менять ширину колонок)
// 8. AllowFormattingRows = Истина
// 9. AllowInsertingColumns = Ложь
// 10. AllowInsertingRows = Ложь
// 11. AllowInsertingHyperlinks = Ложь
// 12. AllowDeletingColumns = Ложь
// 13. AllowDeletingRows = Ложь
// 14. AllowSorting = Истина
// 15. AllowFiltering = Истина (разрешает использовать автофильтр)
// 16. AllowUsingPivotTables = Ложь
Лист.Protect(
"МойПароль", // 1. Password
Истина, // 2. DrawingObjects
Истина, // 3. Contents
Ложь, // 4. Scenarios
Ложь, // 5. UserInterfaceOnly
Истина, // 6. AllowFormattingCells
Истина, // 7. AllowFormattingColumns
Истина, // 8. AllowFormattingRows
Ложь, // 9. AllowInsertingColumns
Ложь, // 10. AllowInsertingRows
Ложь, // 11. AllowInsertingHyperlinks
Ложь, // 12. AllowDeletingColumns
Ложь, // 13. AllowDeletingRows
Истина, // 14. AllowSorting
Истина, // 15. AllowFiltering
Ложь // 16. AllowUsingPivotTables
);
// Сохраняем файл и корректно освобождаем COM-объект
Книга.SaveAs("C:\Reports\ProtectedReport.xlsx");
Книга.Close(Ложь);
Эксель.Quit();
Эксель = Неопределено;
Рассмотрим случай, когда выгружаемый документ содержит десятки тысяч строк. Обращение к Лист.Cells.Locked = Ложь переопределяет свойство для всех 17 миллиардов ячеек листа, что может приводить к зависанию процесса 1С.
В таких ситуациях рекомендуется действовать от обратного:
Locked у всех ячеек листа.Лист.Range("E2:E1000").Locked = Ложь.Protect с нужными позиционными аргументами.Такой подход обеспечивает минимальное время формирования файла и корректно распределяет права на редактирование ячеек в Excel.