При разработке обработок загрузки данных в 1С часто возникает ситуация, когда при попытке прочитать ТабличныйДокумент из файла, система выдает ошибку «Файл не обнаружен» или некорректно обрабатывает структуру XLSX. Давайте разберем, почему это происходит и как правильно организовать передачу и чтение файлов в архитектуре клиент-сервер.
Основная причина ошибки заключается в различии файловых систем клиента и сервера. Когда пользователь выбирает файл через ДиалогВыбораФайла, этот путь (например, C:\Users\User\Downloads\data.xlsx) является локальным для компьютера пользователя. Когда 1С пытается выполнить чтение на сервере, служба сервера 1С ищет этот файл на своем диске, не обнаруживает его и выдает ошибку.
Также важно помнить, что сервер 1С работает под специфической учетной записью (чаще всего USR1CV8). У этой учетной записи нет доступа к пользовательским папкам на других компьютерах, даже если сам пользователь является администратором в 1С.
Этот метод считается наиболее надежным. Суть заключается в том, чтобы передать двоичные данные файла с клиента на сервер, сохранить их там во временный файл, прочитать его и затем удалить.
Разберем процесс по шагам:
ДвоичныеДанные с клиента на сервер через временное хранилище.ПолучитьИмяВременногоФайла().ТабличногоДокумента.
// Пример на сервере
АдресФайлаВХранилище = ...; // Получили из клиента
ДанныеФайла = ПолучитьИзВременногоХранилища(АдресФайлаВХранилище);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ДанныеФайла.Записать(ИмяВременногоФайла);
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
УдалитьФайлы(ИмяВременногоФайла);
Более современный и «чистый» способ — использование потоков данных. Вместо создания файла на диске мы можем работать с объектом Поток, который позволяет 1С считывать данные напрямую из оперативной памяти.
// Пример работы с потоком на сервере
ДанныеФайла = ПолучитьИзВременногоХранилища(АдресФайлаВХранилище);
Поток = ДанныеФайла.ОткрытьПотокДляЧтения();
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(Поток, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Поток.Закрыть();
Обратите внимание: при использовании метода Прочитать, вы можете передать второй параметр, определяющий СпособЧтенияЗначенийТабличногоДокумента, что позволяет более гибко управлять тем, как данные из ячеек Excel попадают в ТабличныйДокумент.
Если после применения этих способов ошибка сохраняется, проанализируйте следующие моменты:
XLSX по своей структуре является ZIP-архивом. Если 1С «видит» первые байты файла (например, 50 4B 03 04 — сигнатура ZIP), но не может его открыть, это почти всегда означает, что файл не был корректно передан или прочитан как поток данных.Excel.Application на сервере. Это требует установки полного пакета Microsoft Office на сервер, что негативно сказывается на стабильности и производительности системы. Метод ТабличныйДокумент.Прочитать() справляется с этой задачей автономно.Теперь, используя приведенные примеры, вы сможете корректно организовать загрузку любых файлов в вашу конфигурацию, независимо от того, где находится пользователь и на каком сервере исполняется код.