При организации обмена данными между 1С и внешними клиентами нередко используется формат электронных таблиц Microsoft Excel. Распространенный сценарий: организация отправляет покупателю прайс-лист или форму заказа с защитой ячеек от редактирования, оставляя доступной только колонку для ввода количества. Однако при возврате заполненного файла клиенты могут включить режим совместной работы («Разрешить изменять файл нескольким пользователям одновременно»).
В результате при попытке программно снять защиту листа методом Unprotect в 1С возникает ошибка COM-объекта:
«Метод Unprotect из класса Worksheet завершен неверно»
Выясним причину такого поведения: в режиме совместного доступа (Shared Workbook / MultiUserEditing) Microsoft Excel блокирует операции изменения структуры и управление защитой листов. Разберем по шагам, как решить эту проблему несколькими способами.
Если для интеграции используется 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:
ExclusiveAccess() корректно выполняется только в том случае, если файл открыт с возможностью редактирования (параметр ReadOnly в Workbooks.Open должен быть равен Ложь).Save().DisplayAlerts = Ложь предотвращает появление интерактивных окон с подтверждением отключения совместного доступа.В большинстве задач по загрузке заказов или прайс-листов в 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();
Если на сервере 1С не установлен Microsoft Office или требуется исключить зависимость от COM-технологии, самым надежным решением является чтение файла через встроенный объект платформы ТабличныйДокумент.
Штатный механизм 1С напрямую разбирает структуру файлов .xlsx и .xls, полностью игнорируя защиту отдельных листов, пароли ячеек и статус совместного доступа.
ТабДок = Новый ТабличныйДокумент;
Попытка
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
ВызватьИсключение "Не удалось прочитать файл: " + ОписаниеОшибки();
КонецПопытки;
ВсегоСтрок = ТабДок.ВысотаТаблицы;
Для НомерСтроки = 2 По ВсегоСтрок Цикл
НоменклатураНаименование = ТабДок.Область(НомерСтроки, 1).Текст;
Количество = ТабДок.Область(НомерСтроки, 2).Значение;
// Перенос полученных данных в структуру 1С
КонецЦикла;
Файлы формата .xlsx представляют собой обычные ZIP-архивы, содержащие XML-файлы с разметкой книги. Если требуется снять защиту листа без запуска Microsoft Excel, можно модифицировать XML-структуру средствами платформы 1С:
ЧтениеZipФайла во временный каталог.xl/worksheets/sheet1.xml).ЧтениеXML или как текст и удалите тег <sheetProtection ... />..xlsx объектом ЗаписьZipФайла.Данный подход полностью очищает информацию о защите листа и позволяет получить готовый файл для последующей стандартной обработки.