Работа с файлами Microsoft Excel через механизм COM-объектов является классическим, но довольно капризным способом интеграции. Часто возникают ситуации, когда после обновления программного обеспечения на сервере или при попытке прочитать новый файл система выдает ошибку: «Произошла исключительная ситуация (Microsoft Office Excel): Метод Open из класса Workbooks завершен неверно». Проанализируем причины этой проблемы и разберем пошагово способы ее решения.
Прежде чем приступать к сложным системным настройкам, нам необходимо исключить самую простую причину — повреждение самого файла. Рассмотрим ситуацию, когда файл открывается в интерактивном режиме с предупреждением. Если при открытии документа вручную Microsoft Excel выдает сообщение: «Обнаружено содержимое, которое не удалось прочитать», то программный метод Open закономерно завершится ошибкой, так как он не может самостоятельно обработать модальное окно восстановления данных.
Выясним, нет ли других блокировок:
excel.exe. Это можно сделать через диспетчер задач. Если под учетной записью, от которой работает сервер 1С, висит старый процесс, он может блокировать доступ к книге.Одной из специфических особенностей работы Microsoft Excel как COM-объекта на стороне сервера является необходимость наличия определенных системных папок. Если Excel запускается неинтерактивно (службой), он ищет папку рабочего стола в профиле системы. Проанализируем, созданы ли необходимые директории. Если их нет, их нужно создать вручную:
C:\Windows\SysWOW64\config\systemprofile\DesktopC:\Windows\System32\config\systemprofile\DesktopВажно: после создания папок иногда требуется перезагрузка сервера или службы 1С, чтобы изменения вступили в силу.
Если создание папок не помогло, разберем настройку службы компонентов. Проблема может заключаться в недостатке прав у пользователя USR1CV8 (или того, под кем запущен сервер 1С) на запуск приложения Excel. Выполним следующие действия:
dcomcnfg.Иногда стандартный код вызова требует небольшой корректировки для более стабильной работы. Посмотрим на правильную последовательность обращения к объектам:
Попытка
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. Этот метод работает с листом 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.