При разработке отчетов и обработок в среде 1С часто требуется программно выгрузить сформированный отчет в файл электронной таблицы. Однако при вызове метода Записать у объекта ТабличныйДокумент разработчики нередко сталкиваются с ошибками: результирующий файл открывается с предупреждением о несовпадении формата расширению, отображает нечитаемые символы («кракозябры») или сохраняется без расширения операционной системы.
Разберем причины такого поведения платформы, проанализируем синтаксис метода записи и рассмотрим надежные варианты выгрузки отчетов в форматы Excel.
Рассмотрим типовой фрагмент кода, который приводит к некорректному результату:
ТабличныйДокумент = Новый ТабличныйДокумент;
// ... Заполнение табличного документа ...
ИмяФайла = КаталогВременныхФайлов() + "Отчет.xls";
ТабличныйДокумент.Записать(ИмяФайла);
Выясним причину ошибки в приведенном примере. Метод Записать объекта ТабличныйДокумент принимает несколько параметров. Первый параметр задает путь к файлу на диске, а второй — тип сохраняемого формата.
Если второй параметр опущен, платформа 1С по умолчанию сохраняет файл в собственном бинарном формате ТипФайлаТабличногоДокумента.MXL. Платформа полностью игнорирует расширение, указанное в строке пути первого параметра. В результате создается файл формата MXL с расширением .xls. При попытке открыть такой файл Microsoft Excel распознает несоответствие внутренней структуры расширению и выдает ошибку.
Для корректного экспорта необходимо явно передавать тип формата во втором параметре метода. Платформа поддерживает системное перечисление ТипФайлаТабличногоДокумента (в ранних версиях платформы или при строковом указании также допустимы литералы, однако рекомендуется использовать стандартное перечисление):
ТипФайлаТабличногоДокумента.XLSX — современный формат OpenXML (начиная с Excel 2007). Рекомендуется к использованию по умолчанию.ТипФайлаТабличногоДокумента.XLS97 — классический формат Excel 97–2003 (BIFF8). Поддерживается всеми офисными пакетами без предупреждений совместимости.ТипФайлаТабличногоДокумента.XLS — устаревший формат Excel 95 (BIFF5). Современные версии MS Excel могут выдавать предупреждения системы безопасности при открытии таких файлов.ТипФайлаТабличногоДокумента.PDF — документ Adobe Acrobat.ТипФайлаТабличногоДокумента.MXL — собственный формат табличных документов 1С.Посмотрим на практический пример сохранения таблицы в современный формат XLSX с использованием безопасного получения пути к временному файлу:
ТабличныйДокумент = Новый ТабличныйДокумент;
// ... Формирование макета и заполнение данных ...
// Получаем гарантированно уникальное имя файла с нужным расширением
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
// Записываем документ с явным указанием формата
ТабличныйДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLSX);
Если требуется сохранить файл в формате Excel 97–2003, используем следующий вариант:
ИмяФайла = КаталогВременныхФайлов() + "Отчет.xls";
ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS97);
Проанализируем ключевые технические ограничения, о которых важно помнить при выгрузке больших отчетов:
XLS и XLS97 поддерживают не более 65 536 строк и 256 колонок. Если табличный документ превышает эти лимиты, данные будут обрезаны. Формат XLSX поддерживает до 1 048 576 строк и 16 384 колонок.XLS действует жесткое ограничение на количество уникальных шрифтов, рамок и стилей ячеек. При превышении лимита Excel сообщает о повреждении книги. Формат XLSX значительно устойчивее к сложным оформлениям.ПолучитьИмяВременногоФайла(), так как она автоматически учитывает корректность разделителей путей в операционных системах Windows и Linux.task_2_3/test_results/evaluation_summary.json : "Да", "predicted_is_useful": "Да", "is_match": true }, { "test_index": 7, "topic_title": "Асинхронные методы работы с файлами в 8.3", "expected_is_useful": "Да", "predicted_is_useful": "Да", "is_match": true }, { "test_index": 8, "topic_title": "Работа с веб-сервисами: передача структуры данных через WS-ссылку", "expected_is_useful": "Да", "predicted_is_useful": "Да", "is_match": true }, { "test_index": 9, "topic_title": "Удаление помеченных объектов в фоновом задании: блокировка сеансов", "expected_is_useful": "Да", "predicted_is_useful": "Да", "is_match": true } ] }{ "total_tests": 10, "successful_parses": 10, "usefulness_matches": 10, "usefulness_accuracy": 1.0, "html_generated_when_useful": 10, "html_suppressed_when_useless": 0, "all_constraints_passed": true, "details": [ { "test_index": 0, "topic_title": "Форматирование даты в запросе 1С 8.3", "expected_is_useful": "Да", "predicted_is_useful": "Да", "is_match": true }, { "test_index": 1, "topic_title": "Не удается провести документ 'Реализация товаров' — ошибка блокировки", "expected_is_useful": "Да", "predicted_is_useful": "Да", "is_match": true }, { "test_index": 2, "topic_title": "Как программно добавить колонку в динамический список управляемой формы?", "expected_is_useful": "Да", "predicted_is_useful": "Да", "is_match": true }, { "test_index": 3, "topic_title": "Ошибка при вызове метода контекста (Прочитать) при чтении JSON", "expected_is_useful": "Да", "predicted_is_useful": "Да", "is_match": true }, { "test_index": 4, "topic_title": "Как в СКД сделать вычисляемое поле с условием по группировке?", "expected_is_useful": "Да", "predicted_is_useful": "Да", "is_match": true }, { "test_index": 5, "topic_title": "Интеграция 1С с Telegram через HTTP-запросы", "expected_is_useful": "Да", "predicted_is_useful": "Да", "is_match": true }, { "test_index": 6, "topic_title": "Оптимизация запроса с виртуальной таблицей ОстаткиИОбороты", "expected_is_useful"