При разработке отчетов на Системе компоновки данных (СКД) программисты часто сталкиваются с проблемой некорректного отображения шапки таблицы после сохранения в формат Excel. Визуально в 1С шапка может выглядеть приемлемо, но при выгрузке появляются лишние пустые строки, технические объединения или заголовки группировок "раздваиваются" по горизонтали. Это происходит из-за того, что движок компоновки пытается сохранить сложную иерархию уровней группировок, создавая невидимые вспомогательные ячейки для выравнивания границ.
В этой статье мы подробно разберем, как избавиться от этих артефактов и сделать структуру таблицы максимально плоской и удобной для последующего анализа в Excel.
Прежде чем переходить к коду, выясним причину такого поведения системы. СКД автоматически создает дополнительные строки или ячейки в области заголовков, чтобы выровнять элементы разных уровней вложенности. Например, если одна группа колонок имеет три уровня вложенности, а соседняя — только два, система добавит техническую строку, чтобы нижние границы заголовков совпали. При экспорте в Excel эти технические области превращаются в узкие строки или лишние объединения, которые мешают использовать фильтры и формулы.
Рассмотрим основной метод борьбы со сложной структурой шапки — назначение имен группировкам и создание для них индивидуальных макетов. Это позволяет жестко задать структуру ячеек, которую СКД не будет пытаться "оптимизировать" самостоятельно.
Для реализации этого метода выполним следующие шаги:
АнализГруппаНачислений).Использование макетов заставляет систему использовать предопределенную сетку ячеек, что значительно упрощает структуру итогового документа.
Иногда настройки макетов недостаточно, и система все равно оставляет скрытые связи между ячейками. В этом случае проанализируем ситуацию и применим программный метод вывода отчета с последующей очисткой области. Для этого нам необходимо переопределить стандартную обработку вывода в модуле отчета.
Разберем по шагам код, который позволяет принудительно "схлопнуть" лишние объединения:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Инициализируем компоновщик макета и процессор компоновки
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(ЭтотОбъект.СхемаКомпоновкиДанных, ЭтотОбъект.КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
// Выводим результат в табличный документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Постобработка: находим область шапки и разъединяем технические ячейки
// Координаты (1,1,100,100) взяты для примера, их стоит адаптировать под размер отчета
Область = ДокументРезультат.Область(1, 1, 100, ДокументРезультат.ШиринаТаблицы);
Область.Разъединить();
КонецПроцедуры
Метод Разъединить() убирает все объединения в указанной области. После этого 1С при выгрузке в Excel не будет создавать фантомные ячейки. Если после этого вам все же нужны объединения в определенных местах, их можно программно восстановить методом Присоединить() или Объединить() уже после очистки технических связей СКД.
Рассмотрим подробнее дополнительные параметры на вкладке Другие настройки, которые влияют на формирование структуры таблицы:
Отдельно или Отдельно и только в итоге. Это предотвращает создание сложных иерархических "лестниц" в шапке.Не использовать. Это уберет резервирование места под иерархические сдвиги внутри ячеек, что делает таблицу более линейной.Отдельно. Если выбрано Вместе с группировкой, СКД создаст внутри одной ячейки сложную структуру с переносом, которая в Excel часто превращается в две строки.Выясним причину, по которой чаще всего двоятся именно колонки с итогами. Если на вкладке Ресурсы один и тот же показатель рассчитывается для разных уровней группировок с разными выражениями, СКД может зарезервировать под них разные уровни в шапке. Чтобы этого избежать, проанализируем настройки ресурсов и убедимся, что для итоговых полей не создается лишних вложенных группировок.
Также полезно программно установить фиксированную высоту строк для области шапки после вывода:
Для НомерСтроки = 1 По ВысотаШапки Цикл
СтрокаШапки = ДокументРезультат.Область(НомерСтроки, , НомерСтроки, );
СтрокаШапки.АвтоВысотаСтроки = Ложь;
СтрокаШапки.ВысотаСтроки = 15; // Установка фиксированной высоты
КонецЦикла;
Важный момент: использование варианта оформления Без оформления часто помогает убрать лишние графические рамки и "невидимые" деления, так как система перестает рисовать сложные границы вокруг иерархических заголовков. Всю необходимую раскраску в таком случае лучше настроить через Условное оформление.
Применяя комплексный подход — использование макетов для фиксации структуры, программное разъединение технических ячеек и тонкую настройку параметров вывода — мы добьемся того, что отчет в Excel будет выглядеть чисто, профессионально и будет пригоден для дальнейшей обработки пользователями.