Что делать, если не загружается Excel-файл в 1С и возникает ошибка метода Open?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Работа с файлами Microsoft Excel через механизм COM-объектов является классическим, но довольно капризным способом интеграции. Часто возникают ситуации, когда после обновления программного обеспечения на сервере или при попытке прочитать новый файл система выдает ошибку: «Произошла исключительная ситуация (Microsoft Office Excel): Метод Open из класса Workbooks завершен неверно». Проанализируем причины этой проблемы и разберем пошагово способы ее решения.

Проверка целостности и доступности файла

Прежде чем приступать к сложным системным настройкам, нам необходимо исключить самую простую причину — повреждение самого файла. Рассмотрим ситуацию, когда файл открывается в интерактивном режиме с предупреждением. Если при открытии документа вручную Microsoft Excel выдает сообщение: «Обнаружено содержимое, которое не удалось прочитать», то программный метод Open закономерно завершится ошибкой, так как он не может самостоятельно обработать модальное окно восстановления данных.

Выясним, нет ли других блокировок:

  1. Проверим, не запущены ли в системе «зависшие» процессы excel.exe. Это можно сделать через диспетчер задач. Если под учетной записью, от которой работает сервер 1С, висит старый процесс, он может блокировать доступ к книге.
  2. Убедимся, что файл не открыт другим пользователем или программой в эксклюзивном режиме.
  3. Попробуем открыть файл вручную непосредственно на сервере под той же учетной записью, под которой запущен «Агент сервера 1С».

Исправление окружения системы (создание папок Desktop)

Одной из специфических особенностей работы Microsoft Excel как COM-объекта на стороне сервера является необходимость наличия определенных системных папок. Если Excel запускается неинтерактивно (службой), он ищет папку рабочего стола в профиле системы. Проанализируем, созданы ли необходимые директории. Если их нет, их нужно создать вручную:

Важно: после создания папок иногда требуется перезагрузка сервера или службы 1С, чтобы изменения вступили в силу.

Настройка прав DCOM

Если создание папок не помогло, разберем настройку службы компонентов. Проблема может заключаться в недостатке прав у пользователя USR1CV8 (или того, под кем запущен сервер 1С) на запуск приложения Excel. Выполним следующие действия:

  1. Запустим команду dcomcnfg.
  2. Перейдем в Службы компонентов — Компьютеры — Мой компьютер — Настройка DCOM.
  3. Найдем в списке Microsoft Excel Application.
  4. В свойствах на вкладке Удостоверение попробуем установить Интерактивный пользователь (если сервер позволяет) или укажем конкретную учетную запись администратора.
  5. На вкладке Безопасность в разделах «Разрешения на запуск и активацию» добавим пользователя, от которого работает сервер 1С, и предоставим ему полные права.

Программные способы решения и альтернативы

Иногда стандартный код вызова требует небольшой корректировки для более стабильной работы. Посмотрим на правильную последовательность обращения к объектам:


Попытка
    Excel = Новый COMОбъект("Excel.Application");
    // Отключаем лишние уведомления Excel, которые могут блокировать поток
    Excel.DisplayAlerts = Ложь;
    Excel.Visible = Ложь;
    
    Книга = Excel.WorkBooks.Open(ИмяФайла);
    Лист = Книга.Sheets(1);
    
    // Код обработки данных
    
    Книга.Close(Ложь); // Закрываем без сохранения
    Excel.Quit();
Исключение
    ТекстОшибки = ОписаниеОшибки();
    // Обязательно освобождаем COM-объект в случае ошибки
    Если Excel <> Неопределено Тогда
        Excel.Quit();
    КонецЕсли;
КонецПопытки;

Однако современная платформа 1С позволяет во многих случаях полностью отказаться от использования нестабильного COM-соединения. Рассмотрим более надежные методы чтения данных.

Метод ТабличныйДокумент.Прочитать()

Начиная с последних версий платформы 8.3, 1С умеет нативно читать файлы формата .xlsx без установленного Microsoft Office. Это самый быстрый и безопасный способ для сервера. Разберем пример кода:


ТабДок = Новый ТабличныйДокумент;
Попытка
    // Используем способ чтения "Значение", чтобы получить чистые данные
    ТабДок.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
    
    // Теперь мы можем обходить строки и колонки ТабДока
    Для НомерСтроки = 1 По ТабДок.ВысотаТаблицы Цикл
        Значение = ТабДок.Область(НомерСтроки, 1).Текст;
        // Обработка данных
    КонецЦикла;
Исключение
    Сообщить("Ошибка чтения файла: " + ОписаниеОшибки());
КонецПопытки;

Использование ADO (Microsoft.ACE.OLEDB)

Если нам нужно прочитать огромный объем данных очень быстро, проанализируем возможность использования технологии ADO. Этот метод работает с листом Excel как с таблицей базы данных. Рассмотрим пример формирования строки соединения:


Connection = Новый COMОбъект("ADODB.Connection");
ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ИмяФайла + ";Extended Properties=""Excel 12.0 Xml;HDR=YES"";";
Попытка
    Connection.Open(ConnectionString);
    Recordset = Connection.Execute("SELECT * FROM [Лист1$]");
    Пока НЕ Recordset.EOF() Цикл
        // Обработка Recordset.Fields.Item(0).Value
        Recordset.MoveNext();
    КонецЦикла;
    Connection.Close();
Исключение
    // Обработка ошибок
КонецПопытки;

Дополнительные факторы: принтер и разрядность

Выясним еще два неочевидных момента, которые часто мешают методу Open:

Таким образом, если вы столкнулись с ошибкой метода Open, сначала проверьте сам файл на повреждения, затем убедитесь в наличии системных папок Desktop, и, если задача позволяет, переходите на использование встроенных средств платформы 1С для чтения файлов Excel.

← На главную