Как сохранить фиксацию строк и столбцов при экспорте табличного документа 1С в Excel?

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

Многие разработчики сталкиваются с ситуацией, когда при формировании отчета необходимо закрепить верхние строки (например, шапку) или левые столбцы, чтобы при прокрутке они всегда оставались на виду. Внутри 1С это легко реализуется с помощью свойств ФиксацияСверху и ФиксацияСлева. Однако, проанализируем ситуацию: когда мы выгружаем этот ТабличныйДокумент в файл Excel (XLS или XLSX), фиксация таинственным образом исчезает.

Рассмотрим стандартный пример кода, который часто пишут программисты:


ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.ФиксацияСверху = 2; // Пытаемся зафиксировать 2 верхние строки
ИмяВременногоФайла = КаталогВременныхФайлов() + Формат(ТекущаяДата(), "ДФ=ddMMyy") + ".xls";
ТабДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLS);

При открытии сохраненного файла в MS Excel мы видим обычную таблицу — шапка не закреплена. Выясним причину такого поведения платформы и разберем по шагам рабочие способы решения этой задачи.

Почему 1С не сохраняет фиксацию областей?

Проблема сохранения фиксации областей (закрепления строк и столбцов) при экспорте из 1С в Excel является давней особенностью платформы. Стандартный метод Записать() объекта ТабличныйДокумент игнорирует настройки фиксации, так как в архитектуре 1С эти параметры считаются исключительно элементами оформления формы просмотра (интерфейсной частью), а не структурой данных самого документа.

Помимо фиксации, при стандартном сохранении в Excel также часто теряются следующие визуальные настройки:

  1. Масштаб печати (например, «разместить на одной странице»).
  2. Отображение сетки листа и заголовков строк/столбцов.
  3. Параметры свернутых и развернутых группировок.
  4. Колонтитулы (в зависимости от релиза платформы).

На сервере, как правило, не установлен MS Excel, поэтому использование COM-объектов (OLE) для постобработки файла невозможно. Посмотрим на альтернативные и более надежные решения.

Решение 1: Модификация XML-структуры файла XLSX (Рекомендуемое)

Поскольку формат старого бинарного XLS программно модифицировать крайне сложно, мы будем использовать современный формат XLSX. Формат XLSX по своей сути является обычным ZIP-архивом, содержащим набор XML-файлов. Платформа 1С обладает всеми необходимыми встроенными средствами для работы с ZIP и XML. Рассмотрим подробнее этот алгоритм.

Алгоритм пост-обработки файла без использования установленного Excel:

  1. Сначала сохраняем сформированный отчет стандартным методом: ТабДокумент.Записать(Путь, ТипФайлаТабличногоДокумента.XLSX).
  2. Открываем этот сохраненный файл с помощью объекта 1С ЧтениеZipФайла.
  3. Извлекаем из архива файл описания нужного листа (как правило, это путь xl/worksheets/sheet1.xml).
  4. Читаем XML и находим в нем узел <sheetViews>. Если его нет, создаем внутри корневого тега <worksheet>.
  5. Вставляем в узел описание фиксации — тег <pane>.
  6. Перезаписываем измененный XML-файл, запаковываем архив обратно с помощью ЗаписьZipФайла и меняем расширение на .xlsx.

Посмотрим на пример того, как отличаются описания листа без фиксации и с ней.

Без фиксации:


<sheetViews>
    <sheetView tabSelected="1" workbookViewId="0">
        <selection activeCell="A2" sqref="A2" /> 
    </sheetView>
</sheetViews>

С фиксацией верхней строки:


<sheetViews>
    <sheetView tabSelected="1" workbookViewId="0">
        <pane ySplit="1" topLeftCell="A2" activePane="bottomLeft" state="frozen" /> 
        <selection pane="bottomLeft" activeCell="A2" sqref="A2" /> 
    </sheetView>
</sheetViews>

Важные параметры тега <pane>, которые нам нужно формировать программно:

Решение 2: Использование заранее подготовленного шаблона Excel

Если структура вашего отчета жестко фиксирована (например, стандартизированный бланк заказа, прайс-лист или регламентированная форма), можно обойтись без сложного парсинга XML.

Суть метода заключается в следующем:

  1. Вы заранее создаете пустой файл Excel.
  2. В самом приложении MS Excel настраиваете все необходимые визуальные параметры: закрепляете области, настраиваете сетку, колонтитулы и масштаб.
  3. Сохраняете этот файл как шаблон (XLSX). В 1С этот файл можно хранить в макетах как двоичные данные.
  4. При формировании отчета вы не используете метод ТабДокумент.Записать(), так как он может полностью перезаписать файл и затереть настройки шаблона. Вместо этого вы заполняете ячейки шаблона напрямую с помощью сторонних компонент (например, библиотек на базе .NET или Python), подключенных к 1С через Native API.

Этот метод отлично работает на серверах под управлением Linux, где установка MS Office невозможна в принципе, но требует подключения внешних компонент для прямой записи данных в ячейки XLSX.

Итоги

Мы выяснили, что стандартные средства 1С не переносят фиксацию областей в Excel, воспринимая это как настройку интерфейса. Чтобы отчеты выгружались красиво и удобно для пользователей, применяйте сохранение в формате XLSX с последующей модификацией внутренних XML-файлов через штатные объекты 1С: ЧтениеZipФайла и ЧтениеXML. Это наиболее универсальный, независимый от платформы и надежный способ обеспечить безупречный вид экспортируемых документов.

← На главную