При разработке внешних обработок для загрузки данных из Excel программисты часто сталкиваются с ошибкой: «Ошибка при выполнении файловой операции... Доступ к файлу не может быть получен». Эта ситуация особенно характерна для клиент-серверного варианта работы платформы 1С:Предприятия. Рассмотрим подробно, почему возникает эта проблема, и разберем по шагам правильный алгоритм её решения.
Проанализируем ситуацию, описанную в сообщениях форума. Проблема возникает в момент вызова метода ТабличныйДокумент.Прочитать(). В коде это выглядит примерно так:
ТабличныйДокумент.Прочитать(Параметры.ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Основная причина кроется в разнице контекстов исполнения кода. Когда ваша обработка работает в клиент-серверном режиме, код, отвечающий за загрузку (процедуры с директивой &НаСервере), выполняется не на вашем компьютере, а на сервере приложений 1С. Чтобы лучше понять, как взаимодействуют эти уровни, можно изучить механизмы, через которые осуществляется копирование файлов и каталогов между Клиентом и Сервером.
Рассмотрим, что происходит в этот момент:
C:\Users\Admin\Desktop\file.xls).USR1CV8), у него нет доступа к папкам пользователей на их персональных компьютерах. Более того, папки C:\Users\Admin\... на сервере просто не существует или она пуста.Даже если вы скопируете файл непосредственно на диск сервера, ошибка может сохраниться, так как у службы rphost.exe (рабочий процесс 1С) может не быть прав на чтение конкретной пользовательской папки.
Чтобы сервер смог прочитать файл, его необходимо сначала физически передать с клиентского компьютера в специальную область памяти сервера — Временное хранилище. Рассмотрим этот процесс по шагам.
Шаг 1. Выбор файла и помещение во временное хранилище на клиенте
Вместо того чтобы передавать на сервер строку с путем, мы передаем объект в виде двоичных данных. Для этого в управляемых формах используется метод ПоместитьФайлНаСервер().
&НаКлиенте
Асинхронная Процедура ЗагрузитьФайл(Команда)
// Параметры выбора файла
ПараметрыВыбора = Новый ПараметрыДиалогаВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ПараметрыВыбора.Фильтр = "Excel (*.xls, *.xlsx)|*.xls;*.xlsx";
// Помещаем файл во временное хранилище
ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинхронно(,,, ПараметрыВыбора, УникальныйИдентификатор);
Если ОписаниеФайла <> Неопределено Тогда
// Передаем адрес во временном хранилище на серверную процедуру
ОбработатьФайлНаСервере(ОписаниеФайла.Адрес);
КонецЕсли;
КонецПроцедуры
Шаг 2. Обработка файла на стороне сервера
На сервере мы получаем данные по адресу из хранилища. Однако метод ТабличныйДокумент.Прочитать() требует именно путь к файлу на диске. Поэтому нам нужно создать временный файл уже на диске сервера, записать в него данные и только потом прочитать.
&НаСервере
Процедура ОбработатьФайлНаСервере(АдресХранилища)
// Получаем двоичные данные из хранилища
ДанныеФайла = ПолучитьИзВременногоХранилища(АдресХранилища);
// Создаем имя временного файла на сервере с нужным расширением
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xls");
// Записываем данные во временный файл
ДанныеФайла.Записать(ИмяВременногоФайла);
// Теперь читаем файл, к которому у сервера ТОЧНО есть доступ
ТабДок = Новый ТабличныйДокумент;
Попытка
ТабДок.Прочитать(ИмяВременногоФайла);
// Далее идет логика разбора Табличного Документа
Сообщить("Файл успешно прочитан!");
Исключение
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка чтения: " + ОписаниеОшибки());
КонецПопытки;
// Важно: удаляем временный файл после использования
УдалитьФайлы(ИмяВременногоФайла);
КонецПроцедуры
Посмотрим на дополнительные факторы, которые могут влиять на доступ к файлу. Если вам нужна универсальная загрузка из Excel в любой справочник «одним нажатием» (поможет универсальный импорт из Excel в 1С), учитывайте, что при использовании старого формата .xls платформа 1С может использовать внутренние библиотеки или компоненты Excel для конвертации. В этом случае:
C:\Windows\Temp или профильная папка пользователя службы).Excel.Application для чтения, это может вызвать ошибку. Метод ТабличныйДокумент.Прочитать() лишен этого недостатка. Для получения данных напрямую в таблицу можно также использовать портативную обработку чтения файла в таблицу значений.Проанализируем ситуацию, если даже при использовании временного хранилища ошибка сохраняется. Это может свидетельствовать о специфических настройках безопасности сервера. В таких случаях для отладки часто применяется универсальная обработка для загрузки файлов Excel и CSV, которая позволяет проверить корректность чтения всех листов файла.
rphost.exe в папках временных файлов. Стоит проверить карантин или журналы мониторинга антивируса.LocalSystem, что небезопасно и может вызывать конфликты при обращении к сетевым ресурсам. Рекомендуется использовать специально созданную доменную или локальную учетную запись с корректно настроенными правами.Таким образом, для успешного решения задачи мы должны отказаться от передачи прямых путей к файлам между клиентом и сервером. Для полноценной работы с данными лучше использовать простые в использовании инструменты импорта данных, поддерживающие форматы от XLS до ODS и CSV (удобно через универсальный загрузчик XLS, ODS и CSV для 1С). Использование ДвоичныеДанные и ВременноеХранилище — это стандарт разработки на платформе 8.3, который гарантирует стабильную работу обработки независимо от прав доступа к конкретным папкам пользователей.