Как программно сформировать и вывести отчет на СКД в 1С?

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

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

В этой статье мы подробно разберем, как программно работать с Системой Компоновки Данных (СКД). Мы проанализируем весь процесс пошагово: от получения схемы до вывода готового результата в табличный документ.

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

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

  1. Схема компоновки данных — чертеж нашего отчета (запросы, наборы данных).
  2. Настройки — параметры, отборы, выбранные поля (то, что обычно настраивает пользователь).
  3. Макет компоновки — готовый технический план выполнения запроса, построенный на основе Схемы и Настроек.
  4. Процессор компоновки — исполнитель, который выполняет запросы к базе данных.
  5. Процессор вывода — художник, который рисует полученные данные в Табличный документ.

Рассмотрим каждый этап подробно с примерами кода.

Шаг 1. Получение схемы и настроек

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

Разберем пример кода для получения схемы и стандартных настроек:


// Создаем объект отчета (если код выполняется "снаружи")
ОтчетОбъект = Отчеты.ПродажиПоНоменклатуре.Создать();

// Получаем Схему Компоновки Данных (макет, созданный в конфигураторе)
СхемаКомпоновкиДанных = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

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

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

Шаг 2. Установка параметров отчета

Чаще всего отчет требует входных данных: Период, Организация, Склад и так далее. Эти данные передаются через параметры настроек.

Давайте посмотрим, как правильно установить значения параметров:


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

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

Обратите внимание: очень важно устанавливать свойство Использование = Истина. Без этого система может проигнорировать переданное значение, если в схеме этот параметр не является обязательным.

Шаг 3. Компоновка макета

Теперь, когда у нас есть Схема и Настройки, нам нужно объединить их и подготовить макет выполнения. Для этого используется объект КомпоновщикМакетаКомпоновкиДанных.


// Создаем компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

// Выполняем компоновку. Метод Выполнить превращает схему и настройки в реальный макет запроса.
// Четвертый параметр (МакетОформления) можно не указывать, тогда применится стандартный.
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

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

Шаг 4. Выполнение компоновки данных

На этом шаге система обращается к базе данных. Объект ПроцессорКомпоновкиДанных берет подготовленный макет и начинает извлекать данные.


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

Если в вашем отчете используется внешний набор данных (например, вы передаете Таблицу Значений в СКД), то она передается вторым параметром в метод Инициализировать: ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных);

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

Финальный этап — визуализация данных. Мы будем выводить результат в обычный ТабличныйДокумент.


// Подготавливаем приемник результата
ТабДок = Новый ТабличныйДокумент;

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

// Устанавливаем документ, в который будет производиться вывод
ПроцессорВывода.УстановитьДокумент(ТабДок);

// Выводим данные
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

После выполнения метода Вывести, переменная ТабДок будет содержать сформированный отчет.

Полный пример кода функции

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


Процедура СформироватьИСохранитьОтчет(ПутьКФайлу)
    
    // 1. Получаем схему
    ОтчетОбъект = Отчеты.ВашОтчет.Создать();
    Схема = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    
    // 2. Настройки и Параметры
    Настройки = Схема.НастройкиПоУмолчанию;
    
    ПарамДата = Настройки.ПараметрыДанных.Элементы.Найти("Период");
    Если ПарамДата <> Неопределено Тогда
        ПарамДата.Значение = ТекущаяДата();
        ПарамДата.Использование = Истина;
    КонецЕсли;
    
    // 3. Компоновка макета
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки);
    
    // 4. Процессор компоновки
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
    
    // 5. Вывод в Табличный документ
    ТабДок = Новый ТабличныйДокумент;
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ТабДок);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
    // 6. Сохранение результата
    ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
    
КонецПроцедуры

Дополнительные рекомендации

При программной работе с СКД стоит учитывать несколько моментов:

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

← На главную