При переносе базы данных 1С на новый сервер под управлением современной операционной системы Windows Server и пакета Microsoft Office 2016 (или более поздних версий) пользователи часто сталкиваются с неприятной проблемой. При попытке программно импортировать данные из файлов Excel серверная служба 1С аварийно завершает операцию, возвращая ошибку: "Error calling context method (Open): An exception has occurred (Microsoft Excel): Office has detected a problem with this file. To help protect your computer this file cannot be opened.".
В этой статье мы подробно разберем, почему возникает эта ошибка, проанализируем механизмы безопасности операционной системы и пакета Microsoft Office, а также рассмотрим несколько эффективных способов решения проблемы — от простых системных настроек до корректировки программного кода в 1С.
Для начала проанализируем ситуацию. Когда вы запускаете импорт файла Excel, находясь в сеансе под своей учетной записью (интерактивно), система безопасности Microsoft Office в случае подозрений на небезопасный формат файла просто выводит предупреждение — желтую или красную плашку "Защищенный просмотр" (Protected View) или "Проверка файлов Office" (Office File Validation). Вы можете вручную нажать кнопку "Разрешить редактирование", и файл откроется.
Однако сервер 1С работает как фоновая служба Windows (обычно под специальной учетной записью, например, USR1CV8 или NetworkService). При программном обращении через COM-соединение Excel инициализируется в неинтерактивном (скрытом) режиме. Сервисный процесс не имеет доступа к рабочему столу пользователя и не может отобразить диалоговое окно или предупреждающую плашку. Не получив ответа от пользователя, Excel блокирует открытие файла из соображений безопасности и аварийно завершает свою работу, выбрасывая исключение в платформу 1С.
Ниже мы рассмотрим пошаговые сценарии устранения этой проблемы.
Это классическое решение, которое упоминалось на форуме и помогает в большинстве случаев, когда Excel запускается под системной учетной записью Windows. Для корректной инициализации COM-объекта Excel требует обязательного наличия папки рабочего стола в профиле пользователя, под которым запускается процесс.
Давайте проверим наличие этих папок на вашем новом сервере и при необходимости создадим их вручную. Выполним следующие шаги:
C:\Windows\System32\config\systemprofile\.Desktop. Если его нет, создадим пустую папку и назовем ее Desktop.C:\Windows\SysWOW64\config\systemprofile\.Desktop в этом каталоге. Если она отсутствует, обязательно создадим её.После создания этих папок рекомендуется перезапустить службу 1С:Предприятие и проверить работу загрузки. Во многих случаях этого простого действия оказывается достаточно для восстановления штатной работы импорта.
Если у нас есть доступ к изменению кода конфигурации или обработке загрузки, мы можем решить проблему на уровне кода платформы 1С. Объектная модель Microsoft Excel предоставляет разработчикам свойство FileValidation, которое отвечает за валидацию структуры загружаемых файлов. Мы можем временно отключить эту проверку для создаваемого COM-объекта.
Рассмотрим пример программного кода, который решает эту задачу:
Excel = Новый COMОбъект("Excel.Application");
// Значение 1 соответствует константе msoFileValidationSkip (пропустить валидацию)
Excel.FileValidation = 1;
// Отключаем отображение любых диалоговых окон и предупреждений Excel
Excel.DisplayAlerts = 0;
// Открываем книгу Excel
Книга = Excel.Workbooks.Open(ИмяФайла);
Использование свойства FileValidation = 1 позволяет принудительно открыть файл в обход системных проверок структуры, предотвращая аварийное закрытие фонового процесса Excel.
По умолчанию запуск Excel через COM-соединение выполняется от лица "Запускающего пользователя" (Launching User). Это означает, что Excel наследует права службы 1С. Поскольку служба 1С не имеет полноценного пользовательского профиля, параметры безопасности "Защищенного просмотра", настроенные в системе, для нее не действуют.
Мы можем настроить запуск приложения Excel через службу DCOM от имени специально выделенного локального пользователя (или администратора), под которым настройки безопасности предварительно уже были отключены вручную.
Разберем этот процесс по шагам:
Win + R, введите команду dcomcnfg и нажмите Enter.USR1CV8), предоставлены права на локальный запуск и локальную активацию.Поскольку служба 1С работает в контексте своей учетной записи, изменения настроек безопасности через графический интерфейс Excel под вашей учетной записью записываются в ветку текущего пользователя реестра (HKEY_CURRENT_USER). Служба сервера 1С не имеет к ней доступа. Для глобального отключения системных блокировок нам потребуется внести изменения в ветку реестра для всех пользователей компьютера — HKEY_LOCAL_MACHINE (HKLM).
Рассмотрим, какие параметры необходимо настроить в реестре для пакета Microsoft Office 2016 (в ветках реестра он обозначается как версия 16.0):
Для отключения механизмов "Защищенного просмотра" (Protected View) перейдем в следующий раздел реестра (если разделы отсутствуют, их необходимо создать вручную):
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\16.0\Excel\Security\Protected View
Внутри этого раздела создадим три параметра типа DWORD (32-бит) со значением 1:
DisableInternetFilesInPV (отключает защиту для файлов, скачанных из глобальной сети Internet)DisableUnsafeLocationsInPV (отключает блокировку для файлов из небезопасных папок)DisableAttachmentsInPV (отключает защиту для вложений электронной почты)Для полного отключения механизма "Проверки файлов" (File Validation) перейдем в раздел:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\16.0\Excel\Security\FileValidation
И создадим там параметр типа DWORD (32-бит):
EnableOnLoad со значением 0 (это полностью деактивирует валидацию структуры документов при их загрузке)Дополнительно мы можем зарегистрировать доверенное расположение (Trusted Location) на диске сервера, куда 1С сохраняет временные файлы перед их обработкой:
Перейдем в раздел реестра: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\16.0\Excel\Security\Trusted Locations
Создадим новый подраздел с произвольным именем (например, Location100) и пропишем в нем следующие параметры:
Path, в значении которого укажем путь к папке (например, C:\1C_Temp\).AllowSubfolders со значением 1 (чтобы разрешить использование вложенных папок).Важное примечание: Если у вас используется 64-разрядная операционная система Windows, а пакет Microsoft Office или платформа 1С установлены в 32-разрядной редакции, указанные ветки реестра могут находиться в узле совместимости: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\16.0\Excel\Security\.... В таком случае настройки рекомендуется продублировать и там.
Когда файлы выгружаются из внешних источников (например, скачиваются из почты или переносятся с локальных компьютеров пользователей по сети), операционная система Windows помечает их специальной меткой безопасности во вторичном потоке данных NTFS. Данная метка называется Zone.Identifier. Наличие этой метки заставляет Excel открывать файл исключительно в режиме ограниченной функциональности, что приводит к краху фонового процесса.
Мы можем программно разблокировать файл перед тем, как передавать его путь в COM-объект Excel. Для этого воспользуемся вызовом утилиты PowerShell напрямую из кода 1С:
ИмяФайла = "C:\1C_Temp\import.xlsx";
КомандаЗапуска = "powershell -Command ""Unblock-File -Path '" + ИмяФайла + "'""";
ЗапуститьПриложение(КомандаЗапуска, , Истина);
Параметр Истина в методе ЗапуститьПриложение указывает системе дождаться завершения выполнения команды. PowerShell мгновенно сотрет метку блокировки NTFS, после чего файл будет распознаваться операционной системой как доверенный локальный документ и успешно откроется в Excel.
Проанализировав все рассмотренные способы, мы можем сделать вывод, что наиболее комплексным и безопасным решением является комбинация создания системных папок Desktop на сервере и программной разблокировки файлов перед их открытием.