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