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

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

Работа с Системой компоновки данных (СКД) — это базовый навык для разработчика 1С, однако часто возникают ситуации, когда стандартного вывода отчета недостаточно. Нам может потребоваться программное управление процессом: изменение параметров «на лету», формирование отчета в фоновом задании или вывод данных не в стандартную форму, а в таблицу значений или конкретный табличный документ. В этой статье мы подробно разберем, как реализовать программный вызов СКД, проанализируем основные объекты системы и изучим примеры кода.

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

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

  1. Получение схемы компоновки данных: Схема — это фундамент, в котором описаны наборы данных, связи и вычисляемые поля.
  2. Работа с настройками: Мы можем использовать настройки по умолчанию или программно изменить отборы, параметры и группировки.
  3. Компоновка макета: На этом этапе система объединяет схему и конкретные настройки, подготавливая «инструкцию» для процессора компоновки.
  4. Инициализация процессора компоновки: Этот объект отвечает за выполнение запросов и получение данных.
  5. Вывод результата: Финальный этап, где данные передаются в процессор вывода (в табличный документ или таблицу значений).

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

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


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

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

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


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

Шаг 2: Компоновка макета и выполнение запроса

Проанализируем работу объекта КомпоновщикМакетаКомпоновкиДанных. Его задача — преобразовать абстрактные настройки в конкретный исполняемый макет, учитывая особенности платформы и доступные типы данных. Важно помнить, что на этом этапе 1С проверяет корректность всех связей.


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

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

Шаг 3: Инициализация процессора компоновки

Теперь перейдем к «сердцу» системы — объекту ПроцессорКомпоновкиДанных. Именно он исполняет запросы к базе данных. Если в вашей схеме используются внешние наборы данных (например, таблицы значений, сформированные в коде), их необходимо передать именно здесь.

Рассмотрим пример инициализации без внешних данных:


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

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


ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("МояТаблицаДанных", ТЗРезультат);

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

Шаг 4: Вывод результата в Табличный Документ

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


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

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

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

Особенности вывода в Таблицу Значений

Иногда отчет на СКД нужен не для показа пользователю, а для дальнейшей программной обработки. В таком случае мы выводим результат в ТаблицаЗначений. Разберем по шагам, как это сделать:

  1. Используем объект ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений.
  2. Создаем пустую таблицу значений.
  3. Вызываем метод УстановитьОбъект, передавая нашу таблицу.

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

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

Типичные ошибки и советы по оптимизации

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

Также рекомендуем обратить внимание на свойство Автозаполнение в запросе СКД. Если оно включено, система сама пытается определить доступные поля и параметры, что иногда приводит к избыточности. Для сложных отчетов лучше отключать автозаполнение и описывать поля вручную.

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

Заключение

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

← На главную