При автоматизации загрузки данных из внешних файлов Microsoft Excel программисты 1С часто сталкиваются с ситуацией, когда метод Workbooks.Open вызывает исключение. Ошибка сопровождается сообщением: «Система office обнаружила проблему с этим файлом. Чтобы обеспечить защиту компьютера этот файл не будет открыт». При этом интерактивно (простым кликом) файл может открываться, но с пометкой «Защищенный просмотр».
Эта проблема связана с механизмами безопасности Microsoft Office (Office File Validation — OFV), которые проверяют структуру двоичных файлов (особенно старых форматов .xls) на соответствие спецификациям. Если файл сформирован сторонней программой или получен из интернета, Excel блокирует его программное открытие через COM-интерфейс. Рассмотрим подробнее все способы решения этой задачи, от простых программных правок до глубокой настройки системы. При работе с документами от торговых площадок используется загрузка отчётов о продажах маркетплейсов в БП 3 из Excel, которая автоматизирует перенос сведений из файлов в информационную базу.
Проанализируем наиболее эффективный метод, который позволяет решить проблему непосредственно в коде 1С без изменения настроек безопасности каждого компьютера. У объекта Excel.Application существует свойство FileValidation, которое определяет режим валидации файлов. По умолчанию оно установлено в значение msoFileValidationDefault (0), что заставляет систему блокировать подозрительные документы.
Для обхода блокировки нам необходимо установить это свойство в значение msoFileValidationSkip (1) сразу после инициализации COM-объекта. Разберем пример кода:
Попытка
ExcelПриложение = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Не удалось создать COM-объект Excel: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Отключаем проверку структуры файла (Office File Validation)
// 1 = msoFileValidationSkip
ExcelПриложение.FileValidation = 1;
// Дополнительно можно отключить валидацию сводных таблиц, если они есть в файле
// 1 = msoFileValidationPivotSkip
// ExcelПриложение.FileValidationPivot = 1;
Попытка
Книга = ExcelПриложение.Workbooks.Open(ПутьКФайлу, , Истина); // Открываем только на чтение
Исключение
Сообщить("Ошибка при открытии файла: " + ОписаниеОшибки());
ExcelПриложение.Quit();
КонецПопытки;
Этот метод хорош тем, что он не снижает общую безопасность системы на постоянной основе, а действует только в рамках созданного нами сеанса COM-соединения. В случаях, когда традиционные методы программного открытия файлов блокируются системой безопасности, может применяться платформа One RPA для роботизации действий пользователя в интерфейсе приложений.
Если предыдущий метод не помог (что бывает в некоторых версиях Office), рассмотрим использование свойства AutomationSecurity. Это свойство определяет, как Excel будет обрабатывать настройки безопасности при программном запуске. Мы можем принудительно установить самый низкий уровень безопасности для конкретного процесса.
Выясним, какие значения может принимать это свойство:
msoAutomationSecurityLow (значение 1) — включает все макросы и отключает большинство проверок безопасности.msoAutomationSecurityByUI (значение 2) — использует настройки, заданные в интерфейсе пользователя.msoAutomationSecurityForceDisable (значение 3) — отключает все макросы без уведомления.Применим установку низкого уровня безопасности в коде 1С:
ExcelПриложение = Новый COMОбъект("Excel.Application");
// Устанавливаем минимальный уровень безопасности для автоматизации
ExcelПриложение.AutomationSecurity = 1;
Попытка
Книга = ExcelПриложение.Workbooks.Open(ПутьКФайлу);
Исключение
// Обработка ошибки
КонецПопытки;
Часто причиной ошибки является «метка вещания» (Zone.Identifier), которую Windows присваивает файлам, полученным из внешних источников (интернет, почта, локальная сеть). Проанализируем ситуацию: если в свойствах файла на вкладке «Общие» вы видите надпись «Этот файл был получен с другого компьютера и, возможно, был заблокирован с целью защиты компьютера», то COM-объект может не открывать его даже с программными ухищрениями. Для автоматизации процесса получения документов может использоваться сбор прайс-листов с почты, FTP, HTTP, их обработку и выгрузку, обеспечивающий регулярный забор файлов без участия пользователя.
Для автоматизации процесса можно программно «разблокировать» файл перед его открытием в 1С. Это делается путем удаления альтернативного потока данных файла. Рассмотрим вариант использования системной команды:
// Пример для разблокировки файла через выполнение команды PowerShell
КомандаРазблокировки = "powershell -Command ""Unblock-File -Path '" + ПутьКФайлу + "'""";
ЗапуститьПриложение(КомандаРазблокировки, , Истина);
После выполнения этой команды атрибут блокировки будет снят, и Excel откроет файл без лишних вопросов.
Если у вас есть доступ к настройкам компьютера, где выполняется код (особенно это актуально для клиентских рабочих мест), стоит настроить сам Microsoft Excel. Посмотрим на последовательность действий:
C:\Temp\), и установите галочку «Также доверять всем вложенным папкам».Это позволит Excel доверять файлам в указанных папках, даже если их структура кажется ему подозрительной.
Иногда поставщики присылают файлы с расширением .xls, которые внутри на самом деле являются текстовыми документами в формате HTML или XML. Microsoft Excel 2010 и выше блокирует такие файлы из-за несоответствия расширения содержимому (функция Extension Hardening). Разберем, как это отключить через реестр.
Необходимо создать или изменить параметр в реестре Windows по следующему пути (номер версии Office 14.0 соответствует Office 2010, 15.0 — Office 2013, 16.0 — 2016/2019/365):
HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel\Security
Создайте параметр типа DWORD с именем ExtensionHardening и значением 0. Это разрешит открытие файлов с несовпадающим расширением без вывода предупреждения.
Также можно полностью отключить Office File Validation через реестр, создав параметр EnableOnLoad со значением 0 в ключе:
HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel\Security\FileValidation
Если ваш код 1С выполняется на сервере (в серверном модуле), проблема может усугубляться отсутствием необходимых системных папок или прав у службы 1С:Предприятия. Проанализируем технический нюанс: для работы COM-объекта Excel под системной учетной записью в Windows должны существовать специальные папки Desktop.
Проверьте наличие следующих директорий и создайте их вручную, если они отсутствуют:
C:\Windows\SysWOW64\config\systemprofile\DesktopC:\Windows\System32\config\systemprofile\DesktopБез этих пустых папок Excel часто не может инициализировать окружение при запуске от имени пользователя USR1CV8 (или аналогичного), что приводит к невнятным ошибкам открытия файлов.
Если ни один из способов настройки Excel не помогает, или вы не хотите зависеть от установленного офиса и его капризных настроек безопасности, рассмотрим альтернативный метод чтения данных через ADODB.Connection. Этот метод обращается к файлу как к базе данных и игнорирует настройки «Защищенного просмотра».
Пример подключения к файлу Excel:
ПутьКФайлу = "C:\Files\Price.xls";
СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ПутьКФайлу + ";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1"";";
Connection = Новый COMОбъект("ADODB.Connection");
Попытка
Connection.Open(СтрокаПодключения);
Recordset = Новый COMОбъект("ADODB.Recordset");
// [Лист1$] - имя листа в файле Excel
Recordset.Open("SELECT * FROM [Лист1$]", Connection);
Пока НЕ Recordset.EOF Цикл
Сообщить(Recordset.Fields.Item(0).Value); // Читаем значение первой колонки
Recordset.MoveNext();
КонецЦикла;
Recordset.Close();
Connection.Close();
Исключение
Сообщить("Ошибка чтения через ADO: " + ОписаниеОшибки());
КонецПопытки;
Использование ADO часто работает быстрее и стабильнее при простом чтении плоских таблиц, так как не требует запуска полноценного приложения Excel.exe в памяти сервера. Для готового переноса информации без использования офисных программ можно применить обработку для универсальной загрузки данных из Excel в 1С.
Для решения проблемы в первую очередь рекомендуется использовать программную установку ExcelПриложение.FileValidation = 1;. Если это не помогает, следует проверить блокировку самого файла операционной системой и настройки «Защищенного просмотра» в Центре управления безопасностью Office. Сочетание этих методов позволяет гарантированно автоматизировать загрузку данных из любых «проблемных» Excel-файлов.