Разработчики часто сталкиваются с ситуацией, когда файлы, полученные от контрагентов, при открытии через ТабличныйДокумент в 1С выдают ошибки или читаются некорректно. При этом, если открыть такой файл в обычном приложении Excel, программа выдает предупреждение о повреждении, но после нажатия кнопки «ОК» успешно отображает данные. Использование COM-объекта Excel.Application на сервере — это решение, которое со временем приводит к зависаниям процесса и блокировке регламентных заданий. Рассмотрим, как решить эту задачу более надежным способом.
Основная причина заключается в том, что сторонние генераторы отчетов (старые системы, самописные модули на PHP, Java) создают файлы, которые лишь имитируют формат .xls, но нарушают внутреннюю структуру BIFF. ТабличныйДокумент в 1С очень строг к форматам, поэтому он не умеет «прощать» такие огрехи, в отличие от самого Excel, который выполняет процедуру автоматического восстановления при открытии.
Самый стабильный способ обработки таких «кривых» файлов — предварительная конвертация их в современный формат .xlsx с помощью сторонних инструментов перед тем, как передавать их на чтение в 1С. Поскольку формат .xlsx представляет собой набор XML-файлов в архиве, он гораздо менее чувствителен к ошибкам генерации, и платформа 1С читает его гораздо корректнее.
Для автоматизации этого процесса на сервере рекомендуется использовать консольные утилиты или внешние конвертеры, которые не требуют запуска полноценного Excel.
ХранилищеЗначения во временную папку на сервере..xls в .xlsx.Чтобы запустить утилиту для конвертации из кода 1С, воспользуйтесь методом ЗапуститьПриложение. Рассмотрим пример того, как это можно реализовать программно:
// Путь к файлам
ПутьКФайлуXLS = ПолучитьИмяВременногоФайла("xls");
ПутьКФайлуXLSX = СтрЗаменить(ПутьКФайлуXLS, ".xls", ".xlsx");
// Команда для запуска стороннего конвертера (пример)
Команда = "C:\Tools\Converter.exe " + ПутьКФайлуXLS + " " + ПутьКФайлуXLSX;
ЗапуститьПриложение(Команда, , Истина, КодВозврата);
Если КодВозврата = 0 Тогда
// Теперь читаем исправленный файл
ТД = Новый ТабличныйДокумент;
ТД.Прочитать(ПутьКФайлуXLSX);
// Дальнейшая обработка данных
КонецЕсли;
Если конвертация не подходит, можно рассмотреть следующие варианты:
NPOI позволяет работать с форматами Excel напрямую без установленного Office. Ее можно обернуть в небольшую библиотеку классов (DLL) и вызывать из 1С через механизм COM-интеропа, но это потребует навыков разработки на C#.Pandas. Это мощный инструмент для чтения «битых» файлов, который с высокой долей вероятности справится с задачей восстановления данных лучше, чем штатные средства 1С.Подводя итог, откажитесь от идеи использования Excel.Application в серверном коде. Стабильность системы 1С важнее попыток «починить» поврежденные файлы силами COM-объекта, который не предназначен для серверной среды. Предварительная конвертация — это лучший выбор для обеспечения отказоустойчивости ваших регламентных заданий.