Как программно вывести отчет СКД в Excel, если выводится только шапка?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов на базе Системы компоновки данных (СКД) часто возникает задача программного формирования отчета и его последующего сохранения в файл Excel. Типичная ситуация: код написан, процедура выполняется без ошибок, файл создается, но вместо долгожданных данных в таблице отображается только «шапка» (макет заголовков). Проанализируем, почему это происходит, и разберем правильный алгоритм вывода.

Разбор основной ошибки: Настройки по умолчанию против текущих настроек

Рассмотрим фрагмент кода, который чаще всего становится причиной «пустого» отчета. В своем коде разработчики часто обращаются к схеме напрямую:

Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;

Выясним причину проблемы: НастройкиПоУмолчанию — это те настройки (поля, фильтры, группировки), которые жестко заданы в конфигураторе внутри объекта Схема компоновки данных. Если пользователь на форме отчета добавил фильтр, выбрал другие поля или нажал кнопку «Сформировать», эти изменения сохраняются в КомпоновщикеНастроек, но никак не влияют на НастройкиПоУмолчанию.

Для того чтобы отчет выводился с учетом всех пользовательских правок, необходимо получать настройки из компоновщика настроек. Рассмотрим правильный подход:


// Вместо Схема.НастройкиПоУмолчанию используем:
Настройки = КомпоновщикНастроек.ПолучитьНастройки();

Пошаговый алгоритм программного вывода СКД в Табличный документ

Для корректного формирования данных нам необходимо пройти через несколько ключевых этапов: создание макета, инициализация процессора и сам вывод. Проанализируем этот процесс по шагам.

Шаг 1. Инициализация основных объектов

Нам понадобятся СхемаКомпоновкиДанных, текущие Настройки и объект ДанныеРасшифровкиКомпоновкиДанных (даже если мы не планируем использовать расшифровку в Excel, объект часто требуется для инициализации процессора).


ТаблДок = Новый ТабличныйДокумент;
Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;

Шаг 2. Формирование макета компоновки

Здесь мы связываем схему и настройки. КомпоновщикМакета подготавливает внутреннюю структуру для генерации отчета.


КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);

Шаг 3. Инициализация процессора компоновки

На этом этапе происходит самое важное — подготовка данных. Если ваш отчет использует внешние наборы данных (например, переданную таблицу значений), их нужно указать именно здесь во втором параметре метода Инициализировать.


ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);

Шаг 4. Вывод результата

Для вывода в ТабличныйДокумент используется ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент.


ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТаблДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

Как гарантированно получить данные из формы (быстрый способ)

Иногда, как в случае, описанном в обсуждении, проблема кроется в тонкостях работы обычных форм. Если отчет уже сформирован пользователем на экране, и нам нужно просто сохранить то, что он видит, можно воспользоваться прямым обращением к элементу управления формы.

Разберем пример решения, к которому пришел автор темы:


Процедура СохранитьВЭксельНажатие(Элемент)
    // Получаем уже готовый табличный документ из формы
    ТаблДок = ЭлементыФормы.Результат; 
    
    // Сохраняем его в файл
    Попытка
        ТаблДок.Записать("\\server\reports\Отчет.xlsx", ТипФайлаТабличногоДокумента.XLSX);
        Сообщить("Файл успешно сохранен");
    Исключение
        Сообщить("Ошибка сохранения: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Важный нюанс: этот метод сработает только в том случае, если на форме отчета есть поле табличного документа с именем Результат и отчет уже был в него выведен. Если вы хотите делать сохранение в фоновом режиме или без открытия формы, используйте первый (полный) программный метод.

Оптимизация сохранения в Excel

Чтобы итоговый файл выглядел профессионально и был удобен для пользователя, рекомендуем обратить внимание на следующие настройки объекта ТабличныйДокумент:

  1. Формат XLSX: Всегда отдавайте предпочтение ТипФайлаТабличногоДокумента.XLSX. Старый формат XLS ограничен 65 тысячами строк и часто некорректно обрабатывает современные стили оформления.
  2. Автомасштаб: Установите ТаблДок.АвтоМасштаб = Истина;. В этом случае при открытии файла в Excel страницы будут автоматически подогнаны по ширине листа.
  3. Фиксация заголовков: Чтобы при прокрутке в Excel шапка оставалась на месте, используйте свойства ФиксацияСверху или ФиксацияСлева в исходном табличном документе перед записью.
  4. Защита данных: Если необходимо запретить редактирование, используйте ТаблДок.ТолькоПросмотр = Истина;.

Обработка параметров данных

Если в вашем отчете используются параметры (например, НачалоПериода и КонецПериода), убедитесь, что они заполнены в настройках перед выполнением компоновки. Рассмотрим, как это сделать программно:


ПараметрПериода = Настройки.ПараметрыДанных.Элементы.Найти("НачалоПериода");
Если ПараметрПериода <> Неопределено Тогда
    ПараметрПериода.Значение = НачалоМесяца(ТекущаяДата());
    ПараметрПериода.Использование = Истина;
КонецЕсли;

Проанализировав ситуацию, мы видим, что «пустой» Excel чаще всего является следствием работы с необработанным макетом или незаполненными параметрами. Использование КомпоновщикНастроек.ПолучитьНастройки() вместо настроек по умолчанию — это первый и самый важный шаг к исправлению ошибки.

← На главную