Как исправить ошибку доступа при открытии файла Excel на сервере 1С:Предприятие

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

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

Причина возникновения ошибки при серверном вызове 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: Создание каталогов Desktop в системных профилях Windows

Рассмотрим основной и самый быстрый способ исправления ошибки, если служба сервера 1С работает под учетной записью Local System. На сервере, где установлена служба 1С:Предприятия, необходимо вручную создать папки Desktop в системных профилях разрядности Windows:

  1. Для 64-разрядных версий операционной системы создадим каталог: C:\Windows\SysWOW64\config\systemprofile\Desktop
  2. Для 32-разрядных процессов и служб создадим каталог: C:\Windows\System32\config\systemprofile\Desktop

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

Решение 2: Настройка окружения при запуске службы под пользователем usr1cv8

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

  1. Перейдем в каталог профиля пользователя службы 1С по пути C:\Users\<ИмяПользователяСлужбы1С>\ и проверим наличие папки Desktop. Если папка отсутствует, создадим ее вручную.
  2. Настроим права DCOM. Откроем системную оснастку «Службы компонентов» (команда dcomcnfg в окне «Выполнить»). Перейдем по ветке Компьютеры -> Мой компьютер -> Настройка DCOM, найдем пункт Microsoft Excel Application и откроем его свойства.
  3. На вкладке «Безопасность» в разделах «Разрешения на запуск и активацию» и «Разрешения на доступ» выберем «Настроить» и предоставим учетной записи пользователя службы сервера 1С полные права.
  4. На вкладке «Удостоверение» выберем вариант запуска от имени конкретного пользователя (учетной записи с правами на сервере) вместо «Интерактивного пользователя», так как при фоновых заданиях сеанс пользователя на сервере отсутствует.

Альтернативное решение: Отказ от COM-объекта в пользу ТабличногоДокумента

Использование COM-объектов Microsoft Office на сервере официально не поддерживается и не рекомендуется компанией Microsoft из-за частых утечек памяти, зависания процессов EXCEL.EXE и блокировок файлов. Платформа 1С:Предприятие 8.3 предоставляет нативный инструмент для прямого чтения файлов Excel без установленного Microsoft Office — объект ТабличныйДокумент.

Посмотрим на пример универсального чтения файла Excel на сервере:


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

КонецПроцедуры

Преимущества данного метода:

  1. Полная независимость от установленного на сервере офисного пакета Microsoft Office и его разрядности.
  2. Гарантированная работа как на операционных системах семейства Windows, так и на серверах под управлением Linux.
  3. Отсутствие риска зависания неуправляемых фоновых процессов EXCEL.EXE в диспетчере задач.
  4. Высокая скорость чтения данных без затрат ресурсов на инициализацию интерфейса DCOM.

Чтение данных на клиенте с передачей структуры на сервер

Если специфика обработки жестко привязана к COM-объектам (например, используются сложные макросы или форматирование ячеек), перенесем чтение файла целиком на сторону клиента с помощью директивы &НаКлиенте. В интерактивном клиентском сеансе пользователя окружение Windows и рабочий стол всегда инициализированы корректно. После считывания документа на клиенте сформируем массив структур или таблицу и передадим на сервер уже готовые чистые данные для записи в базу 1С.

← На главную