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

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

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

Основные этапы программного вывода отчета

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

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

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

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

Разберем пример кода, который инициализирует эти объекты:


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

// Инициализируем настройки (можно взять текущие настройки компоновщика отчета)
Настройки = СхемаСКД.НастройкиПоУмолчанию;

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

Если стандартный синтаксис кажется вам слишком многословным, обратите внимание на СКДБилдер: упрощаем программное создание СКД — модуль-обертку, который делает код более читаемым. Важный момент: если вы работаете в модуле объекта отчета, у вас уже есть доступ к свойству СхемаКомпоновкиДанных и КомпоновщикНастроек. Если же код пишется во внешней обработке или общем модуле, создание объектов должно быть явным.

Шаг 2: Программная установка отборов

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


ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7701010101");
ЭлементОтбора.Использование = Истина;

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

Шаг 3: Компоновка макета и выполнение

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

Посмотрим на пример полной сборки процесса:


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

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

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

Обратите внимание, что второй параметр метода Инициализировать позволяет передать внешние наборы данных (например, таблицы значений), если они используются в вашей схеме. В таких случаях критически важна оптимизация отчетов с набором данных - объект, чтобы избежать проблем с производительностью при передаче больших объемов данных.

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

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

Разберем по шагам завершающий блок кода:


ТабДок = Новый ТабличныйДокумент;

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

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

// Показываем результат пользователю
ТабДок.Показать("Результат формирования отчета");

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

Особенности работы на управляемых формах

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

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

Рассмотрим структуру вызова:

  1. Клиент нажимает кнопку "Сформировать".
  2. Вызывается серверная процедура.
  3. На сервере создаются все объекты СКД, формируется ТабличныйДокумент.
  4. Готовый ТабличныйДокумент возвращается на клиент и отображается пользователю.

Типичные ошибки при программном выводе

При работе с СКД начинающие разработчики часто сталкиваются с тем, что отчет выводится пустым или параметры не применяются. Разберем основные причины:

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

← На главную