При выполнении серверных процедур загрузки данных из файлов Microsoft Excel разработчики и системные администраторы часто сталкиваются с ошибкой: «Не удалось открыть файл эксель, эксель не может получить доступ к файлу». При этом локально на рабочем месте пользователя обработка отрабатывает без нареканий, а непосредственно на сервере файл без проблем открывается интерактивно через графический интерфейс. Разберем по шагам, почему возникает эта проблема, как ее быстро устранить и какие альтернативные способы чтения таблиц являются более надежными.
Выясним причину такого поведения операционной системы. Когда вызов COM-объекта Excel.Application выполняется на стороне сервера 1С (в контексте &НаСервере или в фоновом задании), процесс Microsoft Excel запускается от имени системной службы 1C:Enterprise 8.3 Server Agent.
Служба сервера 1С обычно выполняется в неинтерактивной сессии Windows под учетной записью SYSTEM (Local System) или специальным пользователем (например, usr1cv8). Офисный пакет Microsoft Excel исторически проектировался как клиентское приложение с графическим интерфейсом. При запуске и открытии книги через COM-интерфейс Excel обязательно требует наличия рабочей папки рабочего стола (Desktop) в системном профиле учетной записи, от имени которой стартовал процесс. Если данный каталог отсутствует, Excel аварийно завершает попытку доступа к файлу с ошибкой безопасности или прав.
Рассмотрим основной и самый быстрый способ исправления ошибки, если служба сервера 1С работает под учетной записью Local System. На сервере, где установлена служба 1С:Предприятия, необходимо вручную создать папки Desktop в системных профилях разрядности Windows:
C:\Windows\SysWOW64\config\systemprofile\DesktopC:\Windows\System32\config\systemprofile\DesktopРекомендуется создать обе папки вне зависимости от разрядности самого сервера 1С, так как разрядность службы 1С и установленного пакета Microsoft Office может различаться.
Проанализируем ситуацию, когда служба сервера 1С запускается не под системной учетной записью, а под выделенным доменным или локальным пользователем (например, usr1cv8). В этом случае создания каталогов в systemprofile недостаточно. Выполним следующие действия:
C:\Users\<ИмяПользователяСлужбы1С>\ и проверим наличие папки Desktop. Если папка отсутствует, создадим ее вручную.dcomcnfg в окне «Выполнить»). Перейдем по ветке Компьютеры -> Мой компьютер -> Настройка DCOM, найдем пункт Microsoft Excel Application и откроем его свойства.Использование COM-объектов Microsoft Office на сервере официально не поддерживается и не рекомендуется компанией Microsoft из-за частых утечек памяти, зависания процессов EXCEL.EXE и блокировок файлов. Платформа 1С:Предприятие 8.3 предоставляет нативный инструмент для прямого чтения файлов Excel без установленного Microsoft Office — объект ТабличныйДокумент.
Посмотрим на пример универсального чтения файла Excel на сервере:
&НаСервере
Процедура ПрочитатьФайлExcelНаСервере(ПутьКФайлу)
ТабДок = Новый ТабличныйДокумент;
Попытка
// Чтение файла XLS или XLSX напрямую платформой 1С
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
ВызватьИсключение "Не удалось прочитать файл Excel: " + ОписаниеОшибки();
КонецПопытки;
КоличествоСтрок = ТабДок.ВысотаТаблицы;
КоличествоКолонок = ТабДок.ШиринаТаблицы;
Для НомерСтроки = 1 По КоличествоСтрок Цикл
// Считываем значения ячеек нужной строки
ЗначениеКолонки1 = ТабДок.ПолучитьОбласть(НомерСтроки, 1).ТекущийОбъект.Текст;
ЗначениеКолонки2 = ТабДок.ПолучитьОбласть(НомерСтроки, 2).ТекущийОбъект.Текст;
// Обработка полученных данных...
КонецЦикла;
КонецПроцедуры
Преимущества данного метода:
EXCEL.EXE в диспетчере задач.Если специфика обработки жестко привязана к COM-объектам (например, используются сложные макросы или форматирование ячеек), перенесем чтение файла целиком на сторону клиента с помощью директивы &НаКлиенте. В интерактивном клиентском сеансе пользователя окружение Windows и рабочий стол всегда инициализированы корректно. После считывания документа на клиенте сформируем массив структур или таблицу и передадим на сервер уже готовые чистые данные для записи в базу 1С.