В практике разработчика 1С часто возникает задача сформировать отчет на базе Системы компоновки данных (СКД) без использования стандартных экранных форм. Это необходимо для реализации рассылок отчетов по электронной почте, формирования регламентированных заданий или выгрузки данных во внешние файлы (PDF, Excel) по расписанию. В данной статье мы подробно разберем, как реализовать этот механизм программно.
Для того чтобы программно получить результат отчета, нам потребуется взаимодействовать с несколькими ключевыми объектами платформы 1С. Проанализируем стандартную цепочку действий, которую проходит система при нажатии кнопки "Сформировать":
СхемаКомпоновкиДанных) — это фундамент, содержащий описание запросов, наборов данных и связей (для их отладки удобно использовать управляемую консоль запросов).НастройкиКомпоновкиДанных) — определяют, какие поля, отборы и группировки будут использованы в конкретном сеансе.КомпоновщикМакетаКомпоновкиДанных) — превращает абстрактную схему и настройки в конкретный макет, готовый к исполнению.ПроцессорКомпоновкиДанных) — выполняет запросы к базе данных и объединяет результаты согласно макету.ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент) — визуализирует полученные данные в итоговый документ.Рассмотрим, как получить схему компоновки из метаданных отчета. Выясним причину, почему важно правильно работать с настройками: если мы хотим использовать настройки, заданные пользователем, нам нужно обратиться к КомпоновщикуНастроек, в противном случае — взять настройки по умолчанию прямо из схемы.
// Получаем схему из состава метаданных отчета
СхемаСКД = Отчеты.МойОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Вариант 1: Берем настройки по умолчанию
Настройки = СхемаСКД.НастройкиПоУмолчанию;
// Вариант 2: Если нужно использовать настройки конкретного компоновщика (например, из формы)
// Настройки = КомпоновщикНастроек.ПолучитьНастройки();
Разберем ситуацию, когда в отчете есть параметры (например, Период или Организация), которые необходимо заполнить программно перед формированием (проверить работу параметров можно через консоль запросов для управляемых форм). Посмотрим на пример кода, который находит параметр по имени и устанавливает его значение:
ПараметрПериод = Настройки.ПараметрыДанных.Элементы.Найти("Период");
Если ПараметрПериод <> Неопределено Тогда
ПараметрПериод.Значение = Новый СтандартныйПериод(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));
ПараметрПериод.Использование = Истина;
КонецЕсли;
Важно помнить, что использование параметра должно быть обязательно установлено в значение Истина, иначе система проигнорирует переданное значение.
Проанализируем следующий этап — создание макета. На этом шаге система сопоставляет схему с настройками и подготавливает внутренние структуры данных. Здесь же можно передать данные для расшифровки, если отчет формируется интерактивно, но для фоновых заданий обычно используется пустая ссылка.
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаСКД, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
Обратите внимание на тип генератора макета. Если ваша цель — ТабличныйДокумент, то параметры можно оставить пустыми. Если же вы планируете выгрузить данные в таблицу значений, используйте ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений.
Теперь мы переходим к самому ресурсоемкому процессу — выполнению запросов и выводу данных. Мы используем ПроцессорКомпоновкиДанных для связи макета с реальными данными информационной базы.
// Инициализируем процессор компоновки
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
// Готовим итоговый документ
ТабДок = Новый ТабличныйДокумент;
// Выводим результат
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
На данном этапе ТабДок будет содержать полностью сформированный отчет со всеми группировками, итогами и оформлением, заданными в СКД.
Выясним, как сохранить полученный результат. Платформа 1С поддерживает множество форматов, включая XLSX, PDF, HTML и DOCX. Рассмотрим пример сохранения отчета в формате PDF для последующей отправки клиенту.
ПутьКФайлу = "C:\Reports\DailyReport.pdf";
Попытка
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
Сообщить("Отчет успешно сохранен: " + ПутьКФайлу);
Исключение
ЗаписьЖурналаРегистрации("ФормированиеОтчета", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
ВызватьИсключение "Не удалось сохранить файл отчета!";
КонецПопытки;
Если мы разрабатываем механизм, работающий на сервере (например, в регламентном задании), необходимо учитывать следующие моменты:
ПолучитьИмяВременногоФайла().ПроцессорВывода.ЗакончитьВывод() и выводите данные частями, чтобы контролировать потребление оперативной памяти.Иногда данных в базе 1С недостаточно, и в отчет нужно передать внешнюю таблицу значений. В этом случае при инициализации ПроцессораКомпоновки необходимо передать структуру, где ключом будет имя внешнего набора данных из схемы, а значением — ваша таблица.
ВнешниеДанные = Новый Структура("ВнешняяТаблица", МояТаблицаЗначений);
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеДанные);
Таким образом, мы детально изучили процесс программного управления Системой компоновки данных. Этот гибкий инструмент позволяет автоматизировать любую отчетность в системе 1С, обеспечивая высокую точность данных и профессиональное оформление выходных форм.