Как сохранить полноценный файл XLSX из 1С, который корректно прочитают маркетплейсы и внешние программы

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При автоматизации обмена данными с внешними системами, такими как маркетплейсы (Ozon, Wildberries), банки или государственные порталы, разработчики 1С часто сталкиваются с неприятной ситуацией. Файл, сохраненный стандартным методом ТабличныйДокумент.Записать() в формате .xlsx, отказывается приниматься сторонним сервисом. При этом, если этот же файл просто открыть в Microsoft Excel и нажать кнопку «Сохранить», проблема исчезает. В этой статье мы подробно разберем, почему это происходит, проанализируем внутреннюю структуру файлов и рассмотрим несколько способов формирования «правильного» документа.

Выясним причину: почему стандартный экспорт 1С считается «неполноценным»

Для начала разберем ситуацию изнутри. Формат .xlsx (Office Open XML) представляет собой ZIP-архив, содержащий набор XML-файлов. Платформа 1С при сохранении табличного документа использует максимально упрощенную структуру. Она генерирует минимальный набор файлов, необходимый для того, чтобы сам Microsoft Excel смог отрисовать таблицу. Однако современные библиотеки для парсинга (например, на Python, PHP или Java), которые используют маркетплейсы, работают гораздо строже.

Проанализируем основные отличия «платформенного» файла от стандартного:

  1. Отсутствие папки DocProps: Это самая частая причина сбоев. В стандартном документе Excel всегда есть папка docProps, содержащая файлы app.xml и core.xml. В них хранятся метаданные: версия приложения-создателя, дата создания, автор и другие свойства. Платформа 1С часто игнорирует создание этих файлов.
  2. Строгая валидация связей: В файле .rels (в корне архива) прописаны связи между компонентами документа. Если в связях указана ссылка на метаданные (те самые файлы в docProps), но физически файлов в архиве нет, строгие валидаторы выдают ошибку «Файл поврежден».
  3. Специфическая разметка стилей: Платформа может сохранять объединения ячеек и описание стилей (файл styles.xml) способом, который Excel «прощает», исправляя на лету, но который не соответствует жестким схемам XSD (XML Schema Definition).

Рассмотрим, как мы можем решить эту проблему программными методами.

Решение №1: Использование COM-объекта (автоматизация Excel)

Самый простой и очевидный способ — заставить сам Microsoft Excel «пересобрать» файл. Для этого мы можем использовать механизм COM-соединения. Этот метод гарантирует стопроцентную совместимость, так как файл будет переписан оригинальным движком Microsoft.

Разберем по шагам пример кода для пересохранения файла:


Процедура ПересохранитьXLSX_ЧерезCOM(ПутьКФайлу)
    
    // Инициализируем COM-объект Excel
    Попытка
        ExcelПриложение = Новый COMОбъект("Excel.Application");
    Исключение
        Сообщить("Excel не установлен на данном компьютере!");
        Возврат;
    КонецПопытки;
    
    ExcelПриложение.DisplayAlerts = Ложь; // Отключаем лишние вопросы
    
    Попытка
        // Открываем файл, созданный платформой 1С
        Книга = ExcelПриложение.Workbooks.Open(ПутьКФайлу);
        
        // Пересохраняем его в формате Excel 2007+ (тип 51 = xlOpenXMLWorkbook)
        Книга.SaveAs(ПутьКФайлу, 51);
        
        // Закрываем книгу и приложение
        Книга.Close();
        ExcelПриложение.Quit();
    Исключение
        Сообщить("Ошибка при обработке файла: " + ОписаниеОшибки());
        ExcelПриложение.Quit();
    КонецПопытки;
    
КонецПроцедуры

Важный нюанс: Данный метод отлично работает на клиентских рабочих станциях под управлением Windows. Однако он крайне не рекомендуется для использования на стороне сервера 1С, так как требует установки MS Office на сервер, работает медленно и может приводить к «зависанию» процессов EXCEL.EXE в памяти.

Решение №2: Использование внешних библиотек (.NET / Native компоненты)

Если решение задачи требуется на стороне сервера (особенно под Linux) или нужна высокая скорость работы, стоит посмотреть в сторону использования внешних библиотек, таких как ClosedXML или EPPlus. Эти библиотеки позволяют создавать файлы .xlsx программно, строго придерживаясь стандарта Open XML.

Рассмотрим стратегию работы в этом случае:

  1. Вы сохраняете файл из 1С во временное хранилище или промежуточный формат.
  2. Внешняя компонента или скрипт (написанный, например, на C# или Python) считывает данные и создает новый файл с «правильной» структурой.
  3. В новый файл добавляются обязательные узлы docProps и корректные схемы именования объектов.

Это исключает необходимость наличия установленного Excel и работает в десятки раз быстрее COM-соединения.

Решение №3: Прямая манипуляция ZIP-структурой файла (метод для продвинутых)

Поскольку .xlsx — это архив, мы можем попробовать «починить» его программно прямо из 1С, используя объект ЧтениеZipФайла и ЗаписьZipФайла. Рассмотрим логику этого процесса:

Проанализируем ситуацию: нам нужно добавить недостающие файлы в структуру архива, созданного платформой 1С. Для этого можно заранее подготовить шаблон папки docProps с файлами app.xml и core.xml.

  1. Создаем временную папку и распаковываем туда файл, сформированный 1С.
  2. Копируем в эту папку заранее подготовленную структуру docProps.
  3. Проверяем файл .rels и при необходимости добавляем туда строки, описывающие связи с новыми файлами метаданных.
  4. Упаковываем папку обратно в ZIP-архив с расширением .xlsx.

Этот путь является наиболее трудоемким, но он позволяет обойтись без внешних зависимостей и стороннего ПО, работая полностью средствами встроенного языка 1С.

Рекомендации и выводы

Выясним, какой метод лучше выбрать в зависимости от ситуации:

Помните, что сторонние сервисы (например, Wildberries или Ozon) используют автоматизированные парсеры, для которых отсутствие даже одного «необязательного» (с точки зрения 1С) тега в XML является критической ошибкой. Использование методов «пересохранения» позволяет гарантировать, что ваш файл будет принят системой с первого раза.

← На главную