Как программно выгрузить отчет СКД в Excel с сохранением оформления?

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

В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает задача автоматизировать формирование отчетов и их последующую отправку или сохранение во внешние форматы. Наиболее востребованным форматом является Excel (XLSX). Использование Системы компоновки данных (СКД) позволяет гибко управлять структурой отчета, однако для программной работы с объектами СКД требуется четкое понимание взаимодействия нескольких программных объектов: компоновщика макета, процессора компоновки и процессора вывода. Для упрощения этой задачи можно использовать специализированные инструменты, такие как СКДБилдер: модуль для программного создания СКД, который значительно сокращает объем кода.

В этой статье мы подробно разберем, как реализовать выгрузку отчета СКД в Excel «одной кнопкой», сохраняя при этом все настройки оформления, группировки и иерархию, как это реализовано в методике выгрузки из 1С в Excel с сохранением форматирования. Подобные подходы часто используются, когда требуется экспорт справочников в Excel с фильтрами или выгрузка других структурированных данных.

Основные этапы программного формирования отчета

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

  1. Получение схемы компоновки данных (из общих макетов или макета отчета).
  2. Инициализация настроек компоновки (использование текущих настроек пользователя или предопределенных).
  3. Подготовка макета компоновки с помощью КомпоновщикМакетаКомпоновкиДанных.
  4. Выполнение компоновки данных с помощью ПроцессорКомпоновкиДанных.
  5. Вывод результата в ТабличныйДокумент с помощью ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент.
  6. Сохранение полученного табличного документа в файл Excel.

Шаг 1: Подготовка объектов и получение схемы

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


// Получаем схему из макета отчета
СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

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

// Если нужно использовать настройки пользователя с формы:
// Настройки = КомпоновщикНастроек.ПолучитьНастройки();

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

Шаг 2: Создание макета компоновки

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


ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

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

Шаг 3: Выполнение запросов и вывод в таблицу

Теперь разберем, как передать сформированный макет в процессор компоновки. Именно этот объект отвечает за выполнение запросов к базе данных и сборку итоговых строк.


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

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

// Непосредственный вывод результата
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

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

Шаг 4: Сохранение результата в формате Excel

Когда ТабличныйДокумент заполнен, нам остается лишь сохранить его — для этого есть экспорт данных 1С в Excel с оформлением. О различных нюансах работы с табличными документами мы уже упоминали в прошлых обзорах. Для корректного открытия в современных версиях Microsoft Excel рекомендуется использовать формат ТипФайлаТабличногоДокумента.XLSX. Если ваша задача специфична, например, требуется выгрузка журнала регистрации в Excel с группировкой, алгоритм сохранения останется тем же.


ПутьКФайлу = "C:\Reports\MyReport.xlsx";
Попытка
    ТабличныйДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
    Сообщить("Файл успешно сохранен по пути: " + ПутьКФайлу);
Исключение
    Сообщить("Ошибка при сохранении файла: " + ОписаниеОшибки());
КонецПопытки;

Тонкости оформления и оптимизация

Рассмотрим подробнее несколько важных моментов, которые часто обсуждаются на форумах и помогают сделать отчет профессиональным:

  1. Автомасштаб: Чтобы колонки в Excel не «схлопывались», установите свойство ТабличныйДокумент.АвтоМасштаб = Истина; перед сохранением.
  2. Фиксация шапки: Если в настройках СКД задана фиксация строк или колонок, при выводе в ТабличныйДокумент она может не перенестись автоматически. Используйте ТабличныйДокумент.ФиксацияСверху = КоличествоСтрокШапки;.
  3. Отображение сетки: Часто для презентабельности отчета сетку отключают: ТабличныйДокумент.ОтображатьСетку = Ложь;.
  4. Настройка заголовков: Иногда стандартных средств не хватает, и требуется программное изменение заголовка группировки отчета СКД для достижения нужного визуального эффекта.
  5. Имя листа: По умолчанию лист в Excel будет называться «Sheet1» или «Лист1». К сожалению, стандартный метод Записать() не позволяет напрямую задать имя листа.

Обработка ошибок при выгрузке

Проанализируем ситуацию, когда выгрузка происходит на стороне сервера (например, в регламентном задании). На сервере нет доступа к локальным дискам пользователя (диск C:\), поэтому необходимо использовать пути, доступные пользователю, под которым запущен агент сервера 1С, либо сохранять файл во временное хранилище, используя механизм работы с временными файлами на сервере.

Пример работы с временными файлами:


ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ТабличныйДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLSX);

// Далее файл можно поместить в хранилище или отправить по почте
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
АдресФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
УдалитьФайлы(ИмяВременногоФайла);

Таким образом, мы изучили полный цикл программного формирования отчета СКД. Мы выяснили, что ключевым моментом является правильная последовательность инициализации процессоров. Использование ТипФайлаТабличногоДокумента.XLSX гарантирует совместимость с современным ПО, а работа через ТабличныйДокумент позволяет сохранить все визуальные настройки, заданные разработчиком в схеме компоновки данных.

← На главную