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

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При разработке обработок загрузки данных из табличных документов разработчики часто используют встроенный метод ТабличныйДокумент.Прочитать(). Нередко возникает ситуация, когда на локальном компьютере или в файловой базе код отрабатывает штатно, но при переносе на сервер или в клиент-серверный режим выполнения возникает исключение: Ошибка при выполнении файловой операции. Разберем по шагам причины такого поведения платформы и рассмотрим надежные способы решения проблемы.

Анализ контекста выполнения и доступности пути к файлу

Первая и самая распространенная причина ошибки — разрыв контекста между клиентом и сервером. Проанализируем типичную ситуацию:

  1. Пользователь выбирает файл через диалог выбора на своем рабочем месте (например, по пути D:\Files\import.xlsx).
  2. Код чтения файла выполняется в серверном контексте (на сервере 1С:Предприятия или в общем модуле с признаком выполнения на сервере).
  3. Сервер 1С пытается обратиться к пути D:\Files\import.xlsx, однако на физическом диске сервера такой файл отсутствует либо путь указывает на локальный диск рабочей станции пользователя.

Если файл открыт в другой программе в монопольном режиме, платформа также не сможет получить к нему доступ на чтение, что приведет к аналогичной файловой ошибке.

Передача файла через временное хранилище на сервер

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

Рассмотрим пример кода:


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

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

Несоответствие формата файла и явное указание способа чтения

Метод ТабличныйДокумент.Прочитать() крайне чувствителен к содержимому файла. Выясним частые проблемы с исходными данными:

  1. Файл не является нативным Excel: многие сторонние системы выгружают HTML-таблицы, CSV или XML-документы с расширением .xls. Excel открывает такие файлы без предупреждений, но парсер 1С выдает ошибку файловой операции. Проверить это можно, открыв файл в обычном текстовом редакторе (наличие тегов <html> или <?xml подтверждает подмену формата).
  2. Ошибки определения типов ячеек: при разборе формул или сложных стилей встроенный механизм платформы может аварийно завершать операцию. Для стабильного чтения рекомендуется явно передавать второй параметр — СпособЧтенияЗначенийТабличногоДокумента.Текст.
  3. Файлы устаревших форматов: платформа 1С не поддерживает чтение файлов формата Excel 95 (BIFF5) и более ранних версий.

Ошибки платформы и права системной учетной записи

Проанализируем системные факторы, влияющие на операцию чтения:

  1. Ошибки конкретных релизов платформы: в некоторых версиях (например, в релизе 8.3.5.1383) присутствовали зарегистрированные ошибки работы встроенного парсера табличных документов при чтении определенных структур XLSX. В таких случаях решением является обновление технологической платформы 1С до актуального стабильного релиза.
  2. Права учетной записи сервера: при распаковке файлов формата XLSX платформа создает временные файлы в системном каталоге %TEMP%. Учетная запись, от имени которой запущена служба сервера 1С (обычно USR1CV8), должна обладать полными правами на чтение, запись и удаление файлов в каталоге временных файлов.
  3. Длина пути к файлу: если суммарная длина пути к файлу или временному каталогу превышает ограничение операционной системы (260 символов), платформа вернет ошибку выполнения файловой операции.

Альтернативные способы чтения данных из Excel

Если платформенный метод чтения не подходит из-за особенностей формата файла или ограничений среды, рассмотрим альтернативные варианты реализации:

  1. Использование COM-объекта (Windows-клиент): подходит для запуска на стороне клиента под управлением Windows с установленным пакетом Microsoft Office. Метод позволяет открывать файлы с нестандартной структурой и HTML-таблицы под видом XLS.
  2. Чтение через ADO/OLEDB: чтение данных через подключение ADODB.Connection с использованием SQL-запросов к листам книги. Требует наличия установленного драйвера Microsoft ACE OLEDB нужной разрядности на сервере или клиенте.
  3. Разбор через чтение XML из ZIP-архива: файл XLSX является zip-архивом. С помощью объектов ЧтениеZipФайла и ЧтениеXML можно напрямую распаковать и последовательно прочитать файлы xl/worksheets/sheet1.xml и xl/sharedStrings.xml. Этот метод работает быстро, не требует установленного MS Office и корректно выполняется как на Windows, так и на Linux-серверах.
← На главную