Как сохранить фиксацию шапки отчета СКД при выгрузке в Excel (XLSX)?

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

При формировании отчетов на системе компоновки данных (СКД) в интерфейсе 1С фиксация шапки таблицы работает корректно: строки заголовка остаются на месте при вертикальной прокрутке. Однако при типовом интерактивном сохранении отчета в файл формата XLSX или XLS (через главное меню или кнопку «Сохранить») закрепление областей пропадает, и в Microsoft Excel документ открывается без зафиксированной шапки.

Разберем, почему возникает данная проблема, и рассмотрим несколько практических способов ее решения.

Причина потери закрепления строк при штатном экспорте

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

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

Способ 1. Постобработка сохраненного файла через COM-соединение

Рассмотрим классический способ закрепления строк и колонок с помощью COM-объекта Excel.Application. После того как табличный документ сохранен на диск, открываем файл в фоновом режиме через Excel и устанавливаем свойства разделения областей.

Разберем пример кода:


// Создаем экземпляр приложения Excel
Попытка
    Excel = Новый COMОбъект("Excel.Application");
Исключение
    ВызватьИсключение "Не удалось инициализировать Microsoft Excel: " + ОписаниеОшибки();
КонецПопытки;

Excel.DisplayAlerts = 0;
Excel.Visible = 0;

// Открываем сохраненный файл отчета
Книга = Excel.Workbooks.Open(ПолныйПутьКФайлу);
Лист = Книга.Sheets(1);
Лист.Activate();

// Устанавливаем параметры фиксации
// SplitRow задает количество закрепляемых строк сверху
Excel.ActiveWindow.SplitRow = 3; 
// SplitColumn задает количество закрепляемых колонок слева (0, если закреплять не нужно)
Excel.ActiveWindow.SplitColumn = 0; 
// Активируем режим фиксации
Excel.ActiveWindow.FreezePanes = 1;

// Сохраняем изменения и освобождаем ресурсы
Книга.Save();
Книга.Close();
Excel.Quit();
Excel = Неопределено;

Ограничения данного способа:

  1. На компьютере пользователя обязательно должен быть установлен Microsoft Office / Excel.
  2. Метод не подходит для фоновых заданий на сервере и не поддерживается в среде Linux.

Способ 2. Реализация пользовательского диалога сохранения и постобработки

Штатная кнопка сохранения табличного документа не позволяет перехватить событие завершения записи файла для последующей модификации. Чтобы пользователь мог интерактивно выбрать путь и формат, а система автоматически применила фиксацию, создадим собственную команду выгрузки.

Разберем по шагам реализацию в управляемой форме отчета:

  1. Добавляем на форму отчета отдельную кнопку «Выгрузить в Excel с фиксацией».
  2. Вызываем асинхронный диалог сохранения файла через ДиалогВыбораФайла.
  3. По завершении выбора сохраняем ТабличныйДокумент и вызываем процедуру постобработки.

Посмотрим на пример клиентского кода:


&НаКлиенте
Процедура СохранитьОтчетВExcel(Команда)
    
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
    Диалог.Заголовок = "Выберите файл для сохранения отчета";
    Диалог.Фильтр = "Файлы Excel (*.xlsx)|*.xlsx";
    Диалог.ПолноеИмяФайла = "Отчет.xlsx";
    
    Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайлаСохранения", ЭтотОбъект);
    Диалог.Показать(Оповещение);
    
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораФайлаСохранения(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
    
    Если ВыбранныеФайлы = Неопределено Или ВыбранныеФайлы.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;
    
    ПутьКФайлу = ВыбранныеФайлы[0];
    
    // Сохраняем табличный документ отчета
    Элементы.Результат.Документ.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
    
    // Выполняем фиксацию шапки
    ЗафиксироватьШапкуВExcel(ПутьКФайлу, 3, 0);
    
    ПоказатьОповещениеПользователя("Экспорт завершен", , "Файл успешно сохранен с фиксацией шапки.");
    
КонецПроцедуры

Способ 3. Прямая модификация структуры XLSX (без использования COM)

Если отчет формируется на стороне сервера, в регламентном задании или на рабочих станциях под управлением Linux, использование COM-объекта невозможно. Файл формата XLSX представляет собой стандартный ZIP-архив с XML-документами, что позволяет внедрить фиксацию штатными средствами платформы 1С.

Разберем логику работы этого метода:

  1. Табличный документ записывается на диск штатным методом: ТабличныйДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX).
  2. Файл распаковывается во временный каталог с помощью объекта ЧтениеZipФайла.
  3. В файле разметки первого листа (xl/worksheets/sheet1.xml) находим тег <sheetViews><sheetView ...> и добавляем внутрь узел разделения областей: <pane ySplit="3" topLeftCell="A4" state="frozen"/> Параметр ySplit указывает количество зафиксированных строк, а topLeftCell — адрес первой свободной ячейки под областью фиксации.
  4. Каталог упаковывается обратно в файл XLSX с помощью объекта ЗаписьZipФайла.

Данный подход полностью кроссплатформенный, выполняется быстро и не требует наличия установленного офисного пакета на клиенте или сервере.

← На главную