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

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

При разработке обработок загрузки данных в 1С часто возникает ситуация, когда при попытке прочитать ТабличныйДокумент из файла, система выдает ошибку «Файл не обнаружен» или некорректно обрабатывает структуру XLSX. Давайте разберем, почему это происходит и как правильно организовать передачу и чтение файлов в архитектуре клиент-сервер.

Понимание проблемы: где находится файл?

Основная причина ошибки заключается в различии файловых систем клиента и сервера. Когда пользователь выбирает файл через ДиалогВыбораФайла, этот путь (например, C:\Users\User\Downloads\data.xlsx) является локальным для компьютера пользователя. Когда 1С пытается выполнить чтение на сервере, служба сервера 1С ищет этот файл на своем диске, не обнаруживает его и выдает ошибку.

Также важно помнить, что сервер 1С работает под специфической учетной записью (чаще всего USR1CV8). У этой учетной записи нет доступа к пользовательским папкам на других компьютерах, даже если сам пользователь является администратором в 1С.

Способ 1: Использование временного файла на сервере

Этот метод считается наиболее надежным. Суть заключается в том, чтобы передать двоичные данные файла с клиента на сервер, сохранить их там во временный файл, прочитать его и затем удалить.

Разберем процесс по шагам:

  1. Передаем ДвоичныеДанные с клиента на сервер через временное хранилище.
  2. На сервере получаем эти данные.
  3. Записываем данные во временный файл с помощью метода ПолучитьИмяВременногоФайла().
  4. Выполняем чтение ТабличногоДокумента.
  5. Обязательно удаляем временный файл для очистки диска.

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

ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);

УдалитьФайлы(ИмяВременногоФайла);

Способ 2: Чтение напрямую из потока

Более современный и «чистый» способ — использование потоков данных. Вместо создания файла на диске мы можем работать с объектом Поток, который позволяет 1С считывать данные напрямую из оперативной памяти.


// Пример работы с потоком на сервере
ДанныеФайла = ПолучитьИзВременногоХранилища(АдресФайлаВХранилище);
Поток = ДанныеФайла.ОткрытьПотокДляЧтения();

ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(Поток, СпособЧтенияЗначенийТабличногоДокумента.Значение);

Поток.Закрыть();

Обратите внимание: при использовании метода Прочитать, вы можете передать второй параметр, определяющий СпособЧтенияЗначенийТабличногоДокумента, что позволяет более гибко управлять тем, как данные из ячеек Excel попадают в ТабличныйДокумент.

На что обратить внимание при отладке

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

Теперь, используя приведенные примеры, вы сможете корректно организовать загрузку любых файлов в вашу конфигурацию, независимо от того, где находится пользователь и на каком сервере исполняется код.

← На главную