Многие разработчики сталкиваются с ситуацией, когда при формировании отчета необходимо закрепить верхние строки (например, шапку) или левые столбцы, чтобы при прокрутке они всегда оставались на виду. Внутри 1С это легко реализуется с помощью свойств ФиксацияСверху и ФиксацияСлева. Однако, проанализируем ситуацию: когда мы выгружаем этот ТабличныйДокумент в файл Excel (XLS или XLSX), фиксация таинственным образом исчезает.
Рассмотрим стандартный пример кода, который часто пишут программисты:
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.ФиксацияСверху = 2; // Пытаемся зафиксировать 2 верхние строки
ИмяВременногоФайла = КаталогВременныхФайлов() + Формат(ТекущаяДата(), "ДФ=ddMMyy") + ".xls";
ТабДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLS);
При открытии сохраненного файла в MS Excel мы видим обычную таблицу — шапка не закреплена. Выясним причину такого поведения платформы и разберем по шагам рабочие способы решения этой задачи.
Проблема сохранения фиксации областей (закрепления строк и столбцов) при экспорте из 1С в Excel является давней особенностью платформы. Стандартный метод Записать() объекта ТабличныйДокумент игнорирует настройки фиксации, так как в архитектуре 1С эти параметры считаются исключительно элементами оформления формы просмотра (интерфейсной частью), а не структурой данных самого документа.
Помимо фиксации, при стандартном сохранении в Excel также часто теряются следующие визуальные настройки:
На сервере, как правило, не установлен MS Excel, поэтому использование COM-объектов (OLE) для постобработки файла невозможно. Посмотрим на альтернативные и более надежные решения.
Поскольку формат старого бинарного XLS программно модифицировать крайне сложно, мы будем использовать современный формат XLSX. Формат XLSX по своей сути является обычным ZIP-архивом, содержащим набор XML-файлов. Платформа 1С обладает всеми необходимыми встроенными средствами для работы с ZIP и XML. Рассмотрим подробнее этот алгоритм.
Алгоритм пост-обработки файла без использования установленного Excel:
ТабДокумент.Записать(Путь, ТипФайлаТабличногоДокумента.XLSX).ЧтениеZipФайла.xl/worksheets/sheet1.xml).<sheetViews>. Если его нет, создаем внутри корневого тега <worksheet>.<pane>.Запись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>, которые нам нужно формировать программно:
ySplit="N" — количество зафиксированных строк (где N - число).xSplit="M" — количество зафиксированных столбцов.topLeftCell="A2" — адрес первой видимой ячейки, которая идет сразу после зафиксированной области.state="frozen" — ключевой атрибут, указывающий Excel, что области именно жестко зафиксированы, а не просто разделены плавающими полосами прокрутки.Если структура вашего отчета жестко фиксирована (например, стандартизированный бланк заказа, прайс-лист или регламентированная форма), можно обойтись без сложного парсинга XML.
Суть метода заключается в следующем:
ТабДокумент.Записать(), так как он может полностью перезаписать файл и затереть настройки шаблона. Вместо этого вы заполняете ячейки шаблона напрямую с помощью сторонних компонент (например, библиотек на базе .NET или Python), подключенных к 1С через Native API. Этот метод отлично работает на серверах под управлением Linux, где установка MS Office невозможна в принципе, но требует подключения внешних компонент для прямой записи данных в ячейки XLSX.
Мы выяснили, что стандартные средства 1С не переносят фиксацию областей в Excel, воспринимая это как настройку интерфейса. Чтобы отчеты выгружались красиво и удобно для пользователей, применяйте сохранение в формате XLSX с последующей модификацией внутренних XML-файлов через штатные объекты 1С: ЧтениеZipФайла и ЧтениеXML. Это наиболее универсальный, независимый от платформы и надежный способ обеспечить безупречный вид экспортируемых документов.