Как прочитать файл Excel на сервере 1С и исправить ошибку «Нет доступа к файлу»?

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

При попытке открыть книгу Excel через COM-соединение непосредственно в серверном контексте 1С разработчики часто сталкиваются с ошибкой: «Нет доступа к файлу». При этом файл физически присутствует на диске сервера, не заблокирован другими программами, а проверка через Файл.Существует() возвращает положительный результат. Разберем детально, почему серверный процесс не может открыть файл, как правильно настроить операционную систему и DCOM, а также какие более надежные альтернативы чтению через COM существуют в платформе 1С:Предприятие.

Причина 1. Специфика системного профиля Windows и папка Desktop

Проанализируем механизм запуска Microsoft Excel службой сервера. Служба 1С (обычно под учетной записью usr1cv8 или системной учетной записью) функционирует в неинтерактивной сессии Windows (Session 0). Для инициализации COM-объекта приложению Excel обязательно требуется наличие каталога рабочего стола в системном профиле. Если папка отсутствует, Excel завершает открытие книги с ошибкой прав доступа.

Для исправления создадим необходимые служебные каталоги вручную:

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

Причина 2. Права учетной записи службы сервера 1С

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

Разберем по шагам проверку и назначение прав:

  1. Откроем оснастку служб Windows (services.msc) и найдем службу «Агент сервера 1С:Предприятия». Проверим, какой пользователь указан на вкладке «Вход в систему».
  2. В свойствах каталога с файлом на вкладке «Безопасность» явно добавим пользователя службы (например, .\usr1cv8) и предоставим ему права на чтение, запись и изменение.
  3. Убедимся, что права не блокируются вышестоящими папками и наследование разрешений работает корректно.

Причина 3. Настройка параметров DCOM для Microsoft Excel

Посмотрим на настройки компонента DCOM. По умолчанию приложение Microsoft Excel не настроено для запуска из-под системных сервисов. Настроим параметры безопасности компонента:

  1. Запустим утилиту настройки компонентов: нажмем Win + R и введем dcomcnfg.exe. Если сервер 1С 64-битный, а установленный Microsoft Office 32-битный, откроем 32-разрядную консоль командой: mmc comexp.msc /32.
  2. Перейдем по дереву: Службы компонентов -> Компьютеры -> Мой компьютер -> Настройка DCOM.
  3. Найдем в списке элемент Microsoft Excel Application, откроем его свойства правой кнопкой мыши.
  4. На вкладке Удостоверение (Identity) обратим внимание: если выбран вариант «Интерактивный пользователь», то Excel сможет запускаться только тогда, когда администратор вошел на сервер под своей сессией. Надежнее выбрать вариант «Указанный пользователь» (This user), явно задать учетную запись с правами локального администратора и предварительно хотя бы один раз войти под ней интерактивно в Windows, чтобы сформировался профиль Office.
  5. На вкладке Безопасность (Security) в разделах «Разрешения на запуск и активацию» и «Разрешения на доступ» выберем «Настроить», нажмем «Изменить» и добавим учетную запись пользователя службы сервера 1С (например, usr1cv8), выдав полные локальные права.

Причина 4. Проблема путей и сетевых дисков

Проанализируем, как передан путь к файлу. Служба сервера 1С изолирована от сеансов пользователей. Если путь к файлу указан через букву подключенного сетевого диска (например, Z:\import\file.xlsx), сервер 1С этот диск не увидит, так как монтирование дисков выполняется только внутри интерактивного сеанса конкретного пользователя. Путь должен быть строго локальным (например, D:\Exchange\file.xlsx) либо задаваться в формате UNC (сетевого пути): \\ServerName\ShareName\file.xlsx.

Ограничения использования COM на сервере

Запуск клиентских офисных приложений через COM-объекты на стороне сервера официально не рекомендуется разработчиками. Фоновые процессы EXCEL.EXE могут «зависать» в памяти при возникновении модальных предупреждений, исчерпывать системный пул памяти и блокировать файлы при некорректном завершении работы.

Альтернативное решение: чтение файла штатным объектом 1С

Рассмотрим гораздо более надежный, производительный и кроссплатформенный вариант, не требующий установки Microsoft Office на сервере и настройки прав DCOM. Платформа 1С:Предприятие умеет напрямую загружать файлы Excel с помощью встроенного объекта ТабличныйДокумент.

Посмотрим на пример кода, выполняемого на стороне сервера:


&НаСервере
Процедура ПрочитатьФайлExcelНаСервере(ПутьКФайлу)
    ТабДок = Новый ТабличныйДокумент;
    Попытка
        ТабДок.Прочитать(ПутьКФайлу);
    Исключение
        ВызватьИсключение "Не удалось прочитать файл: " + ОписаниеОшибки();
    КонецПопытки;

    // Обходим прочитанные строки и колонки
    ВсегоСтрок = ТабДок.ВысотаТаблицы;
    ВсегоКолонок = ТабДок.ШиринаТаблицы;

    Для НомерСтроки = 1 По ВсегоСтрок Цикл
        Для НомерКолонки = 1 По ВсегоКолонок Цикл
            ЗначениеЯчейки = ТабДок.Область(НомерСтроки, НомерКолонки).Текст;
            // Обработка полученного значения
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры

Альтернативное решение: чтение через ADODB

Если требуется работать с таблицами больших объемов, разберем чтение файла Excel как реляционной базы данных с помощью провайдера OLE DB. В этом случае экземпляр Excel в памяти не создается, а данные извлекаются через стандартные SQL-запросы:


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

Правильная передача файла с клиента на сервер

Передавать строковый путь с клиента на сервер некорректно, если файл находится на пользовательском компьютере. В архитектуре клиент-сервер файл сначала необходимо поместить во временное хранилище на клиенте, после чего на сервере извлечь двоичные данные, сохранить их во временный файл и передать на обработку:


&НаСервере
Процедура ОбработатьФайлИзХранилища(АдресВоВременномХранилище)
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВоВременномХранилище);
    ВременныйФайл = ПолучитьИмяВременногоФайла("xlsx");
    ДвоичныеДанные.Записать(ВременныйФайл);

    ТабДок = Новый ТабличныйДокумент;
    ТабДок.Прочитать(ВременныйФайл);

    // Удаляем временный файл после прочтения
    УдалитьФайлы(ВременныйФайл);
КонецПроцедуры
← На главную