При разработке механизмов загрузки данных из внешних файлов (Excel, CSV, XML) программисты часто сталкиваются с ситуацией, когда код идеально работает в файловом варианте или на локальном компьютере, но выдает ошибку «Доступ к файлу не может быть получен» при выполнении на сервере. Рассмотрим подробнее, почему это происходит, и проанализируем правильные способы организации загрузки файлов в клиент-серверной архитектуре 1С:Предприятие.
Разберем типичную ситуацию: пользователь выбирает файл на своем рабочем столе (например, по пути C:\Users\Ivanov\Desktop\price.xlsx) и нажимает кнопку «Загрузить». Если программный код чтения файла выполняется в серверной процедуре (директива &НаСервере), то система пытается найти этот путь на физическом сервере, где установлен кластер 1С, а не на компьютере пользователя.
Даже если файл физически лежит на диске сервера, возникают две основные проблемы:
C:\... для него в принципе невозможны.USR1CV8). У этой учетной записи по умолчанию нет прав на доступ к папкам пользователей, рабочим столам или сетевым дискам. Она имеет доступ только к своим программным каталогам и временным папкам.Проанализируем три основных способа решения этой задачи: от простого (но ненадежного) до профессионального.
Это наиболее универсальный и правильный метод. Мы не заставляем сервер искать файл по путям, а «передаем» само содержимое файла с клиента на сервер. Рассмотрим этот алгоритм по шагам.
Шаг 1. На клиенте: Сначала мы выбираем файл и помещаем его во временное хранилище. Система считывает двоичные данные файла и сохраняет их в специальной области памяти (или временном файле) на сервере, возвращая нам уникальный адрес.
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
// Выбираем файл на компьютере пользователя
Диалог = Новый ДиалогВыбора Файла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите файл для загрузки";
Диалог.Фильтр = "Excel (*.xlsx)|*.xlsx";
Если Диалог.Выбрать() Тогда
// Помещаем файл во временное хранилище
АдресХранилища = "";
ДанныеФайла = Новый ДвоичныеДанные(Диалог.ПолноеИмяФайла);
АдресХранилища = ПоместитьВоВременноеХранилище(ДанныеФайла, УникальныйИдентификатор);
// Передаем адрес на сервер для обработки
ОбработатьФайлНаСервере(АдресХранилища);
КонецЕсли;
КонецПроцедуры
Шаг 2. На сервере: Получаем данные из хранилища, сохраняем их во временный файл (к которому у сервера 1С точно есть права) и читаем с помощью ТабличныйДокумент.
&НаСервере
Процедура ОбработатьФайлНаСервере(АдресХранилища)
// Получаем двоичные данные из хранилища
Данные = ПолучитьИзВременногоХранилища(АдресХранилища);
// Создаем имя временного файла на сервере
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
// Записываем данные в файл на диске сервера
Данные.Записать(ИмяВременногоФайла);
// Теперь читаем файл штатным средством
ТДсXLS = Новый ТабличныйДокумент;
Попытка
ТДсXLS.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
// Далее идет логика обработки таблицы...
// Обязательно удаляем временный файл после работы
УдалитьФайлы(ИмяВременногоФайла);
Исключение
Сообщить("Ошибка при чтении файла: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Если файлы для загрузки выкладываются в определенную папку (например, автоматическая выгрузка из другой системы), мы можем настроить прямой доступ сервера к ней. Однако помним: сервер 1С не увидит сетевой диск Z:\, подключенный в сессии пользователя. Нужно использовать полные UNC-пути вида \\ServerName\ShareFolder\file.xlsx.
Чтобы этот способ заработал, выполним следующие настройки:
Как было замечено в обсуждении, иногда помогает простое перемещение файла в корень диска D: на сервере. Это сработает только в том случае, если вы работаете в режиме терминального доступа (RDP) непосредственно на сервере и права на корень диска позволяют службе 1С читать файлы. Рассмотрим, почему это плохая практика: это нарушает безопасность системы и делает код зависимым от конкретной структуры дисков сервера. При любом обновлении или переезде на другой сервер загрузка сломается.
При использовании метода Прочитать() объекта ТабличныйДокумент, важно учитывать формат файла. Если вы загружаете современные файлы .xlsx, 1С справляется с ними без стороннего ПО. Однако, если вы используете старые методы через COMОбъект("Excel.Application"), помните, что на сервере этот объект работать не будет, если там не установлен Microsoft Excel и не настроены права DCOM. Поэтому использование ТабличныйДокумент — это самый стабильный путь для серверного кода.
Подведем итог: для стабильной работы загрузки всегда используйте схему с Временным хранилищем. Это гарантирует, что файл будет прочитан независимо от того, где он находился у пользователя, какая операционная система установлена на сервере и какие права доступа настроены на сетевые папки.