Часто при работе с обменом данными возникает неприятная ситуация: вы пытаетесь считать файл Excel с помощью стандартного метода ТабДок.Прочитать(), но вместо успешного импорта получаете ошибку «Формат файла не поддерживается». При этом, если открыть этот же файл в приложении MS Excel и просто сохранить его, 1С начинает читать его без проблем. Давайте разберемся, почему это происходит и как автоматизировать процесс обработки таких «капризных» файлов.
Основная причина заключается в том, что сторонние генераторы файлов (скрипты на PHP, Python или специфические веб-сервисы) часто формируют файлы формата .xls или .xlsx, не соблюдая строго спецификации Microsoft. 1С при использовании встроенного парсера ожидает определенную структуру заголовков и метаданных. Если стороннее ПО создает файл «упрощенно», 1С воспринимает такой файл как поврежденный или не соответствующий формату.
Важно понимать: метод ТабДок.Прочитать() — это мощный, но довольно строгий инструмент. Он не умеет «исправлять» битые заголовки на лету, в отличие от полноценного приложения Excel, которое при открытии выполняет автоматическую корректировку структуры.
Так как штатный механизм 1С не справляется с нестандартными файлами, нам необходимо провести процедуру «нормализации» файла перед его чтением. Рассмотрим основные подходы, которые помогут нам автоматизировать этот процесс.
Этот метод является классическим для автоматизации Excel на стороне Windows. Мы можем программно вызвать приложение Excel, открыть в нем «проблемный» файл и пересохранить его в стандартном формате. Это принудительно «исправит» структуру файла.
Разберем алгоритм действий:
Новый COMОбъект("Excel.Application").Workbooks.Open().SaveAs(), указав формат, поддерживаемый 1С.Пример кода для реализации этого подхода:
Функция НормализоватьФайл(ПутьКФайлу) Экспорт
Excel = Новый COMОбъект("Excel.Application");
Книга = Excel.Workbooks.Open(ПутьКФайлу);
// 56 - это код формата Excel 97-2003 (.xls)
Книга.SaveAs(ПутьКФайлу, 56);
Книга.Close();
Excel.Quit();
Возврат Истина;
КонецФункции
Важное примечание: Использование COMОбъект на стороне сервера (в регламентных заданиях) крайне не рекомендуется из-за проблем с правами доступа к системным службам и вероятности «зависания» процессов EXCEL.EXE, которые будут съедать оперативную память. Используйте этот метод только на стороне клиента.
Если серверная обработка файлов — ваша основная задача, лучше использовать кроссплатформенные инструменты. LibreOffice имеет отличный режим командной строки (headless mode), который позволяет конвертировать файлы без запуска графического интерфейса.
Мы можем запускать конвертацию через ЗапуститьПриложение() в 1С:
soffice --headless --convert-to xls "путь_к_файлу" --outdir "путь_к_папке"
Этот способ стабилен, не требует наличия установленного MS Excel на сервере и отлично работает как в Windows, так и в Linux-среде.
Если вы регулярно получаете подобные файлы от контрагентов, проанализируйте, можно ли изменить подход к передаче данных. Вместо отправки файлов Excel, которые требуют «лечения», договоритесь о переходе на:
CSV (он намного проще для разбора и не имеет проблем с «битой» структурой Excel).JSON или XML, если это возможно в рамках интеграции.Проанализировав ситуацию, мы пришли к выводу, что проблема «Формат файла не поддерживается» решается не исправлением кода чтения в 1С, а предварительной обработкой самого файла. Мы разобрали, что:
COM-объекта или сторонних утилит.LibreOffice, так как COM-объекты нестабильны вне сеанса пользователя..xls вручную — это путь к созданию крайне нестабильного кода, который перестанет работать при малейшем обновлении формата файла.Используйте предложенные методы, и вы избавитесь от ошибок чтения Excel навсегда, обеспечив стабильную работу вашего обмена данными!