При экспорте отчетов и печатных форм из 1С в MS Excel разработчики часто сталкиваются с нарушением форматирования: объединенные ячейки разделяются на множество мелких колонок, границы сдвигаются, а группировки строк и столбцов теряются. Разберем причинно-следственные связи этой проблемы и проанализируем доступные способы сохранения структуры документа без применения скриптов VBA и COM-объектов.
Рассмотрим, почему стандартный экспорт из 1С в формат Excel иногда дает непредсказуемый результат:
СоздатьФорматСтрок()). Однако в Excel листы имеют строгую единую сетку колонок. При сохранении платформа 1С пытается привести разную ширину колонок к наименьшему общему делителю, из-за чего создается множество микро-колонок, а ячейки дробятся.XLS или HTML иерархическая структура группировок 1С полностью теряется, так как эти форматы не поддерживают спецификацию иерархии в том виде, в котором её формирует платформа.Для корректного сохранения группировок и форматирования штатными средствами 1С необходимо выгружать документ именно в формат XLSX. При вызове метода Записать() объекта ТабличныйДокумент группировки строк и колонок сохраняются автоматически, если они были сформированы стандартными методами (например, ДобавитьГруппуСтрок(), ДобавитьГруппуКолонок() или через механизмы автогруппировки).
Рассмотрим пример кода для сохранения табличного документа на форме в файл XLSX:
// ТабличнаяЧастьОбработки - реквизит формы с типом ТабличныйДокумент
ПутьКФайлу = Диалог.ПолноеИмяФайла;
ТабличнаяЧастьОбработки.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Файл " + ПутьКФайлу + " успешно сохранен";
Сообщение.Сообщить();
Чтобы избежать нарушений структуры сетки при выгрузке, проанализируем рекомендации по верстке макета и заполнению ячеек:
ТабличныйДокумент без использования независимых форматов строк. Все секции (шапка, табличная часть, подвал) должны опираться на общие колонки, а сложные реквизиты должны формироваться исключительно через метод Объединить()." " или укажите явно свойства области. Это позволит платформе сохранить целостность области при трансляции в XLSX.СодержитЗначение = Истина и заполнять ТипЗначения, чтобы выгружаемые данные корректно сопоставлялись с типами ячеек Excel.Если штатного сохранения методом Записать() недостаточно для реализации сложного оформления, рассмотрим альтернативные варианты работы с файлами Excel в 1С:
ТипФайлаПакетаОтображаемыхДокументов.XLSX.ЧтениеZipФайла, скорректировать XML-структуру листов (например, файлы в каталоге xl/worksheets/) средствами ЧтениеXML и ЗаписьXML, после чего упаковать архив обратно через ЗаписьZipФайла. Этот подход позволяет дописать узлы группировок <outlineLvl> или настроить точную ширину колонок <cols>.