Как сохранить табличный документ из 1С в Excel с сохранением форматирования, объединения ячеек и группировок?

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

При экспорте отчетов и печатных форм из 1С в MS Excel разработчики часто сталкиваются с нарушением форматирования: объединенные ячейки разделяются на множество мелких колонок, границы сдвигаются, а группировки строк и столбцов теряются. Разберем причинно-следственные связи этой проблемы и проанализируем доступные способы сохранения структуры документа без применения скриптов VBA и COM-объектов.

Причины искажения сетки и потери группировок

Рассмотрим, почему стандартный экспорт из 1С в формат Excel иногда дает непредсказуемый результат:

  1. Разные форматы строк: В 1С табличный документ позволяет задавать собственную ширину колонок для отдельных секций (например, с помощью метода СоздатьФорматСтрок()). Однако в Excel листы имеют строгую единую сетку колонок. При сохранении платформа 1С пытается привести разную ширину колонок к наименьшему общему делителю, из-за чего создается множество микро-колонок, а ячейки дробятся.
  2. Пустые объединенные ячейки: Если ячейка объединена из нескольких столбцов и не содержит значения, механизм выгрузки может не распознать ее как единый блок и разделить на отдельные ячейки.
  3. Формат файла: При сохранении в устаревший формат XLS или HTML иерархическая структура группировок 1С полностью теряется, так как эти форматы не поддерживают спецификацию иерархии в том виде, в котором её формирует платформа.

Программное сохранение в формат XLSX

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

Рассмотрим пример кода для сохранения табличного документа на форме в файл XLSX:


// ТабличнаяЧастьОбработки - реквизит формы с типом ТабличныйДокумент
ПутьКФайлу = Диалог.ПолноеИмяФайла;
ТабличнаяЧастьОбработки.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);

Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Файл " + ПутьКФайлу + " успешно сохранен";
Сообщение.Сообщить();

Методы предотвращения дробления объединенных ячеек

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

  1. Единая сетка колонок в макете: Разрабатывайте макет ТабличныйДокумент без использования независимых форматов строк. Все секции (шапка, табличная часть, подвал) должны опираться на общие колонки, а сложные реквизиты должны формироваться исключительно через метод Объединить().
  2. Заполнение пустых ячеек: Если пустая объединенная ячейка при выгрузке распадается на части, задайте ей текстовый пробел " " или укажите явно свойства области. Это позволит платформе сохранить целостность области при трансляции в XLSX.
  3. Явное указание типа значения: Для области ячеек рекомендуется устанавливать свойство СодержитЗначение = Истина и заполнять ТипЗначения, чтобы выгружаемые данные корректно сопоставлялись с типами ячеек Excel.

Альтернативные подходы без использования COM и VBA

Если штатного сохранения методом Записать() недостаточно для реализации сложного оформления, рассмотрим альтернативные варианты работы с файлами Excel в 1С:

  1. Использование объекта ПакетОтображаемыхДокументов: Позволяет объединить несколько табличных документов в один файл XLSX с разбивкой по отдельным листам и сохранением форматирования каждой страницы. Для записи используется значение ТипФайлаПакетаОтображаемыхДокументов.XLSX.
  2. Прямая модификация OpenXML (ZIP + XML): Файл XLSX представляет собой обычный ZIP-архив. Вы можете сохранить документ из 1С в XLSX, затем открыть архив с помощью объекта ЧтениеZipФайла, скорректировать XML-структуру листов (например, файлы в каталоге xl/worksheets/) средствами ЧтениеXML и ЗаписьXML, после чего упаковать архив обратно через ЗаписьZipФайла. Этот подход позволяет дописать узлы группировок <outlineLvl> или настроить точную ширину колонок <cols>.
← На главную