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