При разработке отчетов на базе Системы компоновки данных (СКД) часто возникает задача программного формирования отчета и его последующего сохранения в файл Excel. Типичная ситуация: код написан, процедура выполняется без ошибок, файл создается, но вместо долгожданных данных в таблице отображается только «шапка» (макет заголовков). Проанализируем, почему это происходит, и разберем правильный алгоритм вывода.
Рассмотрим фрагмент кода, который чаще всего становится причиной «пустого» отчета. В своем коде разработчики часто обращаются к схеме напрямую:
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
Выясним причину проблемы: НастройкиПоУмолчанию — это те настройки (поля, фильтры, группировки), которые жестко заданы в конфигураторе внутри объекта Схема компоновки данных. Если пользователь на форме отчета добавил фильтр, выбрал другие поля или нажал кнопку «Сформировать», эти изменения сохраняются в КомпоновщикеНастроек, но никак не влияют на НастройкиПоУмолчанию.
Для того чтобы отчет выводился с учетом всех пользовательских правок, необходимо получать настройки из компоновщика настроек. Рассмотрим правильный подход:
// Вместо Схема.НастройкиПоУмолчанию используем:
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
Для корректного формирования данных нам необходимо пройти через несколько ключевых этапов: создание макета, инициализация процессора и сам вывод. Проанализируем этот процесс по шагам.
Шаг 1. Инициализация основных объектов
Нам понадобятся СхемаКомпоновкиДанных, текущие Настройки и объект ДанныеРасшифровкиКомпоновкиДанных (даже если мы не планируем использовать расшифровку в Excel, объект часто требуется для инициализации процессора).
ТаблДок = Новый ТабличныйДокумент;
Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
Шаг 2. Формирование макета компоновки
Здесь мы связываем схему и настройки. КомпоновщикМакета подготавливает внутреннюю структуру для генерации отчета.
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);
Шаг 3. Инициализация процессора компоновки
На этом этапе происходит самое важное — подготовка данных. Если ваш отчет использует внешние наборы данных (например, переданную таблицу значений), их нужно указать именно здесь во втором параметре метода Инициализировать.
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
Шаг 4. Вывод результата
Для вывода в ТабличныйДокумент используется ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент.
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТаблДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Иногда, как в случае, описанном в обсуждении, проблема кроется в тонкостях работы обычных форм. Если отчет уже сформирован пользователем на экране, и нам нужно просто сохранить то, что он видит, можно воспользоваться прямым обращением к элементу управления формы.
Разберем пример решения, к которому пришел автор темы:
Процедура СохранитьВЭксельНажатие(Элемент)
// Получаем уже готовый табличный документ из формы
ТаблДок = ЭлементыФормы.Результат;
// Сохраняем его в файл
Попытка
ТаблДок.Записать("\\server\reports\Отчет.xlsx", ТипФайлаТабличногоДокумента.XLSX);
Сообщить("Файл успешно сохранен");
Исключение
Сообщить("Ошибка сохранения: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Важный нюанс: этот метод сработает только в том случае, если на форме отчета есть поле табличного документа с именем Результат и отчет уже был в него выведен. Если вы хотите делать сохранение в фоновом режиме или без открытия формы, используйте первый (полный) программный метод.
Чтобы итоговый файл выглядел профессионально и был удобен для пользователя, рекомендуем обратить внимание на следующие настройки объекта ТабличныйДокумент:
ТипФайлаТабличногоДокумента.XLSX. Старый формат XLS ограничен 65 тысячами строк и часто некорректно обрабатывает современные стили оформления.ТаблДок.АвтоМасштаб = Истина;. В этом случае при открытии файла в Excel страницы будут автоматически подогнаны по ширине листа.ФиксацияСверху или ФиксацияСлева в исходном табличном документе перед записью.ТаблДок.ТолькоПросмотр = Истина;.Если в вашем отчете используются параметры (например, НачалоПериода и КонецПериода), убедитесь, что они заполнены в настройках перед выполнением компоновки. Рассмотрим, как это сделать программно:
ПараметрПериода = Настройки.ПараметрыДанных.Элементы.Найти("НачалоПериода");
Если ПараметрПериода <> Неопределено Тогда
ПараметрПериода.Значение = НачалоМесяца(ТекущаяДата());
ПараметрПериода.Использование = Истина;
КонецЕсли;
Проанализировав ситуацию, мы видим, что «пустой» Excel чаще всего является следствием работы с необработанным макетом или незаполненными параметрами. Использование КомпоновщикНастроек.ПолучитьНастройки() вместо настроек по умолчанию — это первый и самый важный шаг к исправлению ошибки.