В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает задача автоматизировать формирование отчетов и их последующую отправку или сохранение во внешние форматы. Наиболее востребованным форматом является Excel (XLSX). Использование Системы компоновки данных (СКД) позволяет гибко управлять структурой отчета, однако для программной работы с объектами СКД требуется четкое понимание взаимодействия нескольких программных объектов: компоновщика макета, процессора компоновки и процессора вывода. Для упрощения этой задачи можно использовать специализированные инструменты, такие как СКДБилдер: модуль для программного создания СКД, который значительно сокращает объем кода.
В этой статье мы подробно разберем, как реализовать выгрузку отчета СКД в Excel «одной кнопкой», сохраняя при этом все настройки оформления, группировки и иерархию, как это реализовано в методике выгрузки из 1С в Excel с сохранением форматирования. Подобные подходы часто используются, когда требуется экспорт справочников в Excel с фильтрами или выгрузка других структурированных данных.
Проанализируем стандартную цепочку действий, которую необходимо выполнить для получения готового файла. Процесс можно разделить на следующие ключевые шаги:
КомпоновщикМакетаКомпоновкиДанных.ПроцессорКомпоновкиДанных.ТабличныйДокумент с помощью ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент.Рассмотрим пример кода, который инициализирует основные объекты СКД — в разработке поможет консоль запросов и СКД для разработчика. Предположим, что код выполняется в модуле объекта отчета или во внешней обработке. В некоторых сложных отчетах разработчикам приходится задействовать две разных схемы в одном отчете СКД, но мы разберем классический вариант с одной основной схемой.
// Получаем схему из макета отчета
СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Получаем настройки (в данном примере — основные)
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
// Если нужно использовать настройки пользователя с формы:
// Настройки = КомпоновщикНастроек.ПолучитьНастройки();
Важно помнить, что если вы используете параметры (например, период или организацию), их необходимо установить в КомпоновщикНастроек до начала формирования макета (подробнее про программную настройку параметров компоновки читайте в отдельном материале), иначе отчет может быть пустым или вызвать ошибку выполнения. Если вам нужно дать пользователю больше свободы в настройках на клиенте, обратите внимание на инструмент Пользовательская СКД.
На этом этапе мы соединяем схему с настройками. Выясним причину, по которой используется ДанныеРасшифровки. Даже если вы не планируете использовать расшифровку в Excel, этот объект часто требуется методу Выполнить().
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
// Генерация макета
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
Теперь разберем, как передать сформированный макет в процессор компоновки. Именно этот объект отвечает за выполнение запросов к базе данных и сборку итоговых строк.
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
ТабличныйДокумент = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
// Непосредственный вывод результата
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Совет: Если отчет очень объемный, вывод методом Вывести() может занять много времени или привести к нехватке памяти. В таких случаях рекомендуется использовать вывод по частям (в цикле), вызывая ПроцессорКомпоновки.Следующий().
Когда ТабличныйДокумент заполнен, нам остается лишь сохранить его — для этого есть экспорт данных 1С в Excel с оформлением. О различных нюансах работы с табличными документами мы уже упоминали в прошлых обзорах. Для корректного открытия в современных версиях Microsoft Excel рекомендуется использовать формат ТипФайлаТабличногоДокумента.XLSX. Если ваша задача специфична, например, требуется выгрузка журнала регистрации в Excel с группировкой, алгоритм сохранения останется тем же.
ПутьКФайлу = "C:\Reports\MyReport.xlsx";
Попытка
ТабличныйДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Сообщить("Файл успешно сохранен по пути: " + ПутьКФайлу);
Исключение
Сообщить("Ошибка при сохранении файла: " + ОписаниеОшибки());
КонецПопытки;
Рассмотрим подробнее несколько важных моментов, которые часто обсуждаются на форумах и помогают сделать отчет профессиональным:
ТабличныйДокумент.АвтоМасштаб = Истина; перед сохранением.ТабличныйДокумент она может не перенестись автоматически. Используйте ТабличныйДокумент.ФиксацияСверху = КоличествоСтрокШапки;.ТабличныйДокумент.ОтображатьСетку = Ложь;.Записать() не позволяет напрямую задать имя листа.Проанализируем ситуацию, когда выгрузка происходит на стороне сервера (например, в регламентном задании). На сервере 1С нет доступа к локальным дискам пользователя (диск C:\), поэтому необходимо использовать пути, доступные пользователю, под которым запущен агент сервера 1С, либо сохранять файл во временное хранилище, используя механизм работы с временными файлами на сервере.
Пример работы с временными файлами:
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ТабличныйДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLSX);
// Далее файл можно поместить в хранилище или отправить по почте
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
АдресФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
УдалитьФайлы(ИмяВременногоФайла);
Таким образом, мы изучили полный цикл программного формирования отчета СКД. Мы выяснили, что ключевым моментом является правильная последовательность инициализации процессоров. Использование ТипФайлаТабличногоДокумента.XLSX гарантирует совместимость с современным ПО, а работа через ТабличныйДокумент позволяет сохранить все визуальные настройки, заданные разработчиком в схеме компоновки данных.