Рассмотрим достаточно распространенную ситуацию при разработке отчетов на базе Системы Компоновки Данных (СКД). Часто возникает необходимость выгружать готовый отчет в формате XLSX вместе с шапкой, отборами и параметрами. Однако при стандартном сохранении документа пользователи замечают, что в области шапки и параметров ячейки некрасиво объединяются, что делает дальнейшую работу с таблицей (например, фильтрацию или загрузку в другие системы) крайне неудобной. Разберем детально, почему так происходит, и проанализируем несколько рабочих способов решения этой задачи.
Прежде чем исправлять проблему, давайте разберем, почему платформа 1С ведет себя именно так. Техническая причина кроется в фундаментальных отличиях форматов.
Табличный документ 1С, имеющий формат MXL, обладает уникальной особенностью: он позволяет задавать разную ширину колонок для разных строк. Вы можете иметь широкую колонку для вывода длинного названия параметра в первой строке, а ниже, в таблице с данными, использовать узкие колонки.
С другой стороны, формат Excel (XLSX) устроен иначе. В нем ширина колонки жестко фиксирована на протяжении всего листа сверху вниз. Когда платформа 1С выполняет экспорт, она пытается максимально точно сохранить визуальное оформление отчета. Чтобы совместить несовпадающие по ширине ячейки шапки и компактные колонки самой таблицы, 1С автоматически «дробит» общую сетку документа и генерирует объединенные ячейки. В результате мы получаем визуально похожий документ, но структурно непригодный для машинной обработки.
Рассмотрим первый и самый правильный с точки зрения использования СКД метод — создание собственного макета. Если мы хотим, чтобы ячейки не объединялись, нам нужно заставить шапку отчета подчиняться тем же правилам, что и основная таблица.
Разберем по шагам, как это реализовать:
Если сетка шапки и сетка данных будут полностью идентичны, платформе 1С при выгрузке в Excel не придется ничего «дробить» и объединять.
Проанализируем ситуацию, когда отчет разрабатывается в конфигураторе, и у нас есть доступ к модулю отчета. Проблему можно решить программно, модифицировав готовый табличный документ до того, как он будет показан пользователю или сохранен в файл. Для этого используем обработчик ПриКомпоновкеРезультата.
Посмотрим на пример кода, который отключает стандартный вывод и позволяет вмешаться в процесс формирования:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Отключаем стандартный вывод отчета
СтандартнаяОбработка = Ложь;
// Формируем отчет программно
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Обходим верхние строки с шапкой и программно снимаем объединение
// Предположим, шапка занимает первые 5 строк
Для ИндексСтроки = 1 По 5 Цикл
ОбластьСтроки = ДокументРезультат.Область("R" + ИндексСтроки);
ОбластьСтроки.Объединить(Ложь); // Снимаем объединение
// Дополнительно можно очистить текст или изменить формат
КонецЦикла;
КонецПроцедуры
Этот способ требует навыков программирования, но дает абсолютный контроль над тем, в каком виде табличный документ будет выведен на экран.
Если заказчику отчета критически важно в дальнейшем работать с данными в Excel (использовать Power Query, строить сводные таблицы, накладывать сложные фильтры), визуальная шапка от 1С будет только мешать. В таком случае мы изменим подход и выгрузим данные в строгую плоскую таблицу.
Воспользуемся специальным механизмом платформы — объектом ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений. Он позволяет получить результат отчета не в виде раскрашенного документа с отступами, а в виде обычного объекта ТаблицаЗначений.
Рассмотрим пример реализации:
Процедура ВыгрузитьВПлоскуюТаблицу()
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ТаблицаДанных = Новый ТаблицаЗначений;
// Используем процессор вывода в коллекцию
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаДанных);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Теперь переменную ТаблицаДанных можно сохранить в Excel
// через построитель отчета или другие программные механизмы
КонецПроцедуры
В результате вы получите идеальный массив данных без единой объединенной ячейки. Если же параметры вывода все-таки нужно сохранить для истории, их можно программно записать на отдельный (второй) лист Excel-файла с помощью COM-соединения или нативных методов работы с XLSX. Для реализации такой выгрузки на стороне сервера без использования COM-объектов можно использовать готовое решение для программного экспорта данных из 1С в многолистовые файлы Excel.
Рассмотрим простейший обходной путь. Если выводить параметры отчета не строго обязательно, а проблема заключается только в самом факте объединения ячеек, попробуем изменить формат сохранения файла.
Вместо XLSX сохраним результат в формате CSV (Comma-Separated Values). Формат CSV представляет собой обычный текстовый файл, где колонки разделены специальным символом (чаще всего точкой с запятой). Этот формат физически не поддерживает функцию объединения ячеек.
При открытии полученного CSV файла в Excel, данные всегда будут ложиться строго по колонкам. Излишки текста просто будут отображаться в одной ячейке, не захватывая соседние. Это самый быстрый метод получения "чистых" колонок без доработки конфигурации, если визуальное оформление не играет роли.