Почему возникает ошибка «Доступ к файлу не может быть получен» при чтении файла на сервере 1С и как её исправить?

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

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

Выясним причину: почему сервер «не видит» файл?

Разберем типичную ситуацию: пользователь выбирает файл на своем рабочем столе (например, по пути C:\Users\Ivanov\Desktop\price.xlsx) и нажимает кнопку «Загрузить». Если программный код чтения файла выполняется в серверной процедуре (директива &НаСервере), то система пытается найти этот путь на физическом сервере, где установлен кластер 1С, а не на компьютере пользователя.

Даже если файл физически лежит на диске сервера, возникают две основные проблемы:

  1. Разные файловые системы: Путь, существующий у пользователя, может отсутствовать на сервере. Если сервер работает на ОС Linux, пути вида C:\... для него в принципе невозможны.
  2. Права доступа службы: Сервер 1С запускается от имени специальной системной учетной записи (обычно это USR1CV8). У этой учетной записи по умолчанию нет прав на доступ к папкам пользователей, рабочим столам или сетевым дискам. Она имеет доступ только к своим программным каталогам и временным папкам.

Проанализируем три основных способа решения этой задачи: от простого (но ненадежного) до профессионального.

Способ 1. Передача файла через временное хранилище (Рекомендуемый)

Это наиболее универсальный и правильный метод. Мы не заставляем сервер искать файл по путям, а «передаем» само содержимое файла с клиента на сервер. Рассмотрим этот алгоритм по шагам.

Шаг 1. На клиенте: Сначала мы выбираем файл и помещаем его во временное хранилище. Система считывает двоичные данные файла и сохраняет их в специальной области памяти (или временном файле) на сервере, возвращая нам уникальный адрес.


&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
    
    // Выбираем файл на компьютере пользователя
    Диалог = Новый ДиалогВыбора Файла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Заголовок = "Выберите файл для загрузки";
    Диалог.Фильтр = "Excel (*.xlsx)|*.xlsx";
    
    Если Диалог.Выбрать() Тогда
        
        // Помещаем файл во временное хранилище
        АдресХранилища = "";
        ДанныеФайла = Новый ДвоичныеДанные(Диалог.ПолноеИмяФайла);
        АдресХранилища = ПоместитьВоВременноеХранилище(ДанныеФайла, УникальныйИдентификатор);
        
        // Передаем адрес на сервер для обработки
        ОбработатьФайлНаСервере(АдресХранилища);
        
    КонецЕсли;
    
КонецПроцедуры

Шаг 2. На сервере: Получаем данные из хранилища, сохраняем их во временный файл (к которому у сервера 1С точно есть права) и читаем с помощью ТабличныйДокумент.


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

Способ 2. Использование общего сетевого ресурса

Если файлы для загрузки выкладываются в определенную папку (например, автоматическая выгрузка из другой системы), мы можем настроить прямой доступ сервера к ней. Однако помним: сервер 1С не увидит сетевой диск Z:\, подключенный в сессии пользователя. Нужно использовать полные UNC-пути вида \\ServerName\ShareFolder\file.xlsx.

Чтобы этот способ заработал, выполним следующие настройки:

Способ 3. Использование локальных путей сервера (Диск D:, X: и т.д.)

Как было замечено в обсуждении, иногда помогает простое перемещение файла в корень диска D: на сервере. Это сработает только в том случае, если вы работаете в режиме терминального доступа (RDP) непосредственно на сервере и права на корень диска позволяют службе 1С читать файлы. Рассмотрим, почему это плохая практика: это нарушает безопасность системы и делает код зависимым от конкретной структуры дисков сервера. При любом обновлении или переезде на другой сервер загрузка сломается.

Особенности работы с Табличным Документом

При использовании метода Прочитать() объекта ТабличныйДокумент, важно учитывать формат файла. Если вы загружаете современные файлы .xlsx, 1С справляется с ними без стороннего ПО. Однако, если вы используете старые методы через COMОбъект("Excel.Application"), помните, что на сервере этот объект работать не будет, если там не установлен Microsoft Excel и не настроены права DCOM. Поэтому использование ТабличныйДокумент — это самый стабильный путь для серверного кода.

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

← На главную