При разработке механизмов импорта данных из внешних файлов программисты 1С часто сталкиваются с ситуацией, когда стандартный метод Прочитать() объекта ТабличныйДокумент отказывается открывать файлы Excel. Ситуация осложняется тем, что визуально файл выглядит корректно, а обычный Microsoft Excel открывает его без замечаний. В этой статье мы подробно разберем, почему возникает ошибка «Формат файла не поддерживается», проанализируем внутреннюю структуру файлов и найдем пути решения проблемы.
Рассмотрим сценарий, с которого начинается большинство подобных проблем. Разработчик получает двоичные данные файла (например, из хранилища или по почте), сохраняет их во временный файл и пытается прочитать его в табличный документ. Типичный фрагмент кода выглядит следующим образом:
ФайлEXCELНаСервере = ПолучитьИмяВременногоФайла(Расширение);
ДвоичныеДанные.Записать(ФайлEXCELНаСервере);
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.Прочитать(ФайлEXCELНаСервере);
На последней строке система выбрасывает исключение. Первое, на что стоит обратить внимание — это переменная Расширение. Платформа 1С очень чувствительна к расширению временного файла, который она пытается проанализировать. Если в переменной передано значение без точки (например, "xlsx" вместо ".xlsx"), алгоритмы автоматического определения формата могут сработать некорректно.
Выясним главную причину ошибки, которая часто скрывается в «ручном» манипулировании форматами. Проанализируем ситуацию: если файл изначально был в формате .xlsb (Excel Binary Workbook), а его просто переименовали в .xlsx через проводник или программно, 1С не сможет его прочитать. Почему так происходит?
Рассмотрим техническую разницу:
ТабличногоДокумента 1С, который не умеет работать с бинарным содержимым внутри OpenXML.Таким образом, простое изменение букв в расширении файла не меняет его внутреннюю структуру. Платформа 1С, видя расширение .xlsx, пытается применить к нему правила разбора XML, натыкается на бинарные данные и выдает закономерную ошибку о неподдерживаемом формате. При необходимости можно воспользоваться обработкой для импорта данных из файлов xlsb и других форматов Excel.
Для того чтобы минимизировать ошибки на этапе выбора файла пользователем, разберем пример правильной организации процедуры загрузки. Нам необходимо настроить фильтр в диалоге выбора файла и правильно передать данные на сервер.
Пример кода для клиентской части:
&НаКлиенте
Процедура ИмяФайлаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите файл Excel...";
Диалог.Фильтр = "Файлы Excel (*.xls; *.xlsx)|*.xls;*.xlsx"; // Исключаем .xlsb, если не планируем его обрабатывать
Если Диалог.Выбрать() Тогда
ИмяФайла = Диалог.ПолноеИмяФайла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПрочитатьФайл(Команда)
ФайлОбъект = Новый Файл(ИмяФайла);
Если НЕ ФайлОбъект.Существует() Тогда
Возврат;
КонецЕсли;
// Получаем двоичные данные и передаем на сервер вместе с расширением
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);
Результат = ОбработатьФайлНаСервере(ДвоичныеДанные, ФайлОбъект.Расширение);
КонецПроцедуры
Если специфика вашей задачи требует работы именно с бинарным форматом .xlsb, стандартный метод ТабличныйДокумент.Прочитать() вам не подойдет. Проанализируем альтернативные варианты:
Excel 2007+ (.xlsx). Это можно сделать вручную или с помощью скриптов на стороне сервера.ЗапуститьПриложение), которые умеют конвертировать xlsb в csv или xlsx.Пример использования COM-соединения для чтения «проблемных» файлов:
Попытка
Эксель = Новый COMОбъект("Excel.Application");
Книга = Эксель.Workbooks.Open(ПутьКФайлу);
Лист = Книга.Sheets(1);
// Пример получения значения ячейки
Значение = Лист.Cells(1, 1).Value;
Книга.Close(Ложь);
Эксель.Quit();
Исключение
Сообщить("Ошибка при работе через COM: " + ОписаниеОшибки());
КонецПопытки
Важно помнить, что если ваш сервер 1С работает под управлением ОС Linux, использование COMОбъект будет невозможно. В этом случае ТабличныйДокумент — ваш основной инструмент. Чтобы он работал стабильно, убедитесь в следующем:
ПолучитьИмяВременногоФайла() всегда указывается расширение с точкой.Подводя итог, можно сказать, что ошибка «Формат файла не поддерживается» чаще всего является следствием несоответствия внутреннего содержимого файла его расширению. Внимательная проверка форматов на этапе выбора файла и понимание ограничений платформы 1С позволяют избежать подобных проблем еще на стадии проектирования системы. Для решения задач загрузки также можно использовать универсальную обработку для импорта данных из Excel в 1С.