Проанализируем распространенную ситуацию, когда при формировании сложного отчета на сервере в 1С табличный документ имеет множество уровней группировок, но при выгрузке в Excel часть из них пропадает. Разберем по шагам, почему возникает эта проблема и какие существуют рабочие способы ее решения.
Рассмотрим классический пример. Вы формируете отчет, у которого программно задано 8 уровней группировок строк. Если выполнить проверку через метод КоличествоУровнейГруппировокСтрок() на сервере, платформа может показать 7 уровней, а при программном сохранении через Записать() в файл формата XLSX в итоговом документе останется только 6 группировок. Выясним причину такого поведения.
Показать() на клиенте, документ проходит этап подготовки к визуализации. Структура перестраивается корректно, и ручное сохранение из интерфейса проходит без потери уровней.Разберем самый простой и надежный обходной путь (workaround). Если архитектура вашего решения позволяет, мы можем перенести этап сохранения файла с сервера на клиентскую часть. Для этого сформируем документ на сервере, поместим его во временное хранилище и передадим на клиент.
Посмотрим на пример реализации в коде:
&НаСервере
Функция СформироватьТабДокНаСервере()
ТабДок = Новый ТабличныйДокумент;
// ... здесь происходит логика формирования многоуровневого отчета ...
// Помещаем сформированный документ во временное хранилище
АдресВХ = ПоместитьВоВременноеХранилище(ТабДок, УникальныйИдентификатор);
Возврат АдресВХ;
КонецФункции
&НаКлиенте
Процедура СохранитьОтчетВExcel(Команда)
Адрес = СформироватьТабДокНаСервере();
// Получаем документ на клиенте, где рендеринг работает корректно
ТабДокКлиент = ПолучитьИзВременногоХранилища(Адрес);
// Теперь сохраняем файл программно на клиенте
ИмяФайла = "C:\Temp\МногоуровневыйОтчет.xlsx";
ТабДокКлиент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
КонецПроцедуры
В этом случае платформа на клиенте правильно распознает все 8 уровней вложенности, и метод Записать отработает без обрезки данных.
Проанализируем ситуацию, когда необходимо выполнить выгрузку строго в фоновом задании на сервере, где клиентские методы недоступны. В этом случае мы можем прибегнуть к выгрузке плоских данных и последующей их группировке напрямую через COM-соединение с приложением Excel.
Рассмотрим пример того, как управлять структурой через Excel.Application:
&НаСервере
Процедура ВыгрузитьЧерезCOM()
Попытка
ExcelApp = Новый COMОбъект("Excel.Application");
Исключение
// Обработка ошибки инициализации
Возврат;
КонецПопытки;
ExcelApp.DisplayAlerts = Ложь;
Книга = ExcelApp.Workbooks.Add();
Лист = Книга.Worksheets(1);
// ... здесь заполняем ячейки плоскими данными из 1С ...
// Выполняем программную группировку строк средствами Excel
// Например, группируем строки с 2 по 10
Лист.Rows("2:10").Group();
// Сохраняем файл
Книга.SaveAs("C:\Temp\ОтчетЧерезCOM.xlsx");
ExcelApp.Quit();
КонецПроцедуры
Этот метод гарантирует, что структура документа будет сформирована именно так, как требует Excel, в обход встроенных механизмов конвертации 1С.
Посмотрим на еще один вариант решения, не требующий изменения архитектуры кода. Ошибка с потерей уровней группировок часто проявляется именно при конвертации в новый формат XML — XLSX. Если для конечного пользователя формат файла не является критичным, попробуйте изменить тип сохраняемого файла на более старый формат.
Используем перечисление ТипФайлаТабличногоДокумента.XLS97:
// Вместо XLSX используем старый бинарный формат
табдок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS97);
В старом бинарном формате платформа использует совершенно другой алгоритм вывода строк, и баг с обрезкой группировок там часто не воспроизводится.
Если глубина группировок достигает 8 и более уровней (что является абсолютным потолком для Excel), целесообразно пересмотреть сам подход к формированию отчета. Разберем альтернативный метод: выгрузку из 1С "плоской" таблицы.
Вместо сложной иерархии строк выводим каждую аналитику в отдельную колонку. Всю последующую магию группировки, фильтрации и подсчета итогов передаем на сторону Excel, используя функционал Сводных таблиц (Pivot Tables) или надстройку Power Query. Это полностью снимает все ограничения платформы 1С на сериализацию файлов и делает конечный отчет более гибким для аналитика.
Применяя один из описанных способов, вы сможете эффективно обойти платформенные ограничения и гарантировать пользователям корректную выгрузку сложных многоуровневых отчетов из 1С в Excel.