При формировании отчетов на системе компоновки данных (СКД) в интерфейсе 1С фиксация шапки таблицы работает корректно: строки заголовка остаются на месте при вертикальной прокрутке. Однако при типовом интерактивном сохранении отчета в файл формата XLSX или XLS (через главное меню или кнопку «Сохранить») закрепление областей пропадает, и в Microsoft Excel документ открывается без зафиксированной шапки.
Разберем, почему возникает данная проблема, и рассмотрим несколько практических способов ее решения.
Проанализируем работу встроенного конвертера платформы «1С:Предприятие». Штатный механизм экспорта табличного документа в формат Excel (как интерактивный, так и программный метод ТабличныйДокумент.Записать) переносит визуальное оформление ячеек, шрифты, границы, объединения и формулы. При этом параметры отображения рабочего окна приложения, такие как ФиксацияСверху и ФиксацияСлева, в структуры sheetViews и pane выходного файла не сериализуются.
Также важно отличать визуальную фиксацию от сквозных строк печати. Свойство ПовторятьПриПечатиСтроки передается платформой в настройки печати Excel (повтор строк на каждом печатном листе), но не создает закрепления на экране при стандартном просмотре документа.
Рассмотрим классический способ закрепления строк и колонок с помощью 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 = Неопределено;
Ограничения данного способа:
Штатная кнопка сохранения табличного документа не позволяет перехватить событие завершения записи файла для последующей модификации. Чтобы пользователь мог интерактивно выбрать путь и формат, а система автоматически применила фиксацию, создадим собственную команду выгрузки.
Разберем по шагам реализацию в управляемой форме отчета:
ДиалогВыбораФайла.ТабличныйДокумент и вызываем процедуру постобработки.Посмотрим на пример клиентского кода:
&НаКлиенте
Процедура СохранитьОтчетВExcel(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Заголовок = "Выберите файл для сохранения отчета";
Диалог.Фильтр = "Файлы Excel (*.xlsx)|*.xlsx";
Диалог.ПолноеИмяФайла = "Отчет.xlsx";
Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайлаСохранения", ЭтотОбъект);
Диалог.Показать(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораФайлаСохранения(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы = Неопределено Или ВыбранныеФайлы.Количество() = 0 Тогда
Возврат;
КонецЕсли;
ПутьКФайлу = ВыбранныеФайлы[0];
// Сохраняем табличный документ отчета
Элементы.Результат.Документ.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
// Выполняем фиксацию шапки
ЗафиксироватьШапкуВExcel(ПутьКФайлу, 3, 0);
ПоказатьОповещениеПользователя("Экспорт завершен", , "Файл успешно сохранен с фиксацией шапки.");
КонецПроцедуры
Если отчет формируется на стороне сервера, в регламентном задании или на рабочих станциях под управлением Linux, использование COM-объекта невозможно. Файл формата XLSX представляет собой стандартный ZIP-архив с XML-документами, что позволяет внедрить фиксацию штатными средствами платформы 1С.
Разберем логику работы этого метода:
ТабличныйДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX).ЧтениеZipФайла.xl/worksheets/sheet1.xml) находим тег <sheetViews><sheetView ...> и добавляем внутрь узел разделения областей:
<pane ySplit="3" topLeftCell="A4" state="frozen"/>
Параметр ySplit указывает количество зафиксированных строк, а topLeftCell — адрес первой свободной ячейки под областью фиксации.ЗаписьZipФайла.Данный подход полностью кроссплатформенный, выполняется быстро и не требует наличия установленного офисного пакета на клиенте или сервере.