Система компоновки данных (СКД) — это мощный инструмент платформы 1С, который позволяет создавать сложные отборы, группировки и расчеты без глубокого погружения в программирование макетов. Однако часто возникают задачи, когда стандартного функционала формы отчета недостаточно, и нам требуется программно управлять процессом генерации. В этой статье мы подробно разберем, как реализовать программный вывод отчета на СКД, разберем основные объекты системы и научимся управлять настройками "на лету".
Для того чтобы вывести отчет программно, нам необходимо организовать совместную работу нескольких объектов платформы. Проанализируем стандартную цепочку действий, которую должен выполнить программный код:
Рассмотрим ситуацию, когда схема компоновки данных хранится в макете нашего отчета. Обычно отчет строится на одной схеме, хотя в редких случаях, как "искусство ради искусства", могут применяться две разных схемы в отчете СКД. Нам нужно извлечь основную схему и подготовить объект КомпоновщикНастроекКомпоновкиДанных. Этот объект отвечает за то, какие фильтры, параметры и группировки будут применены к данным в текущем сеансе.
Разберем пример кода, который инициализирует эти объекты:
// Получаем схему из макета отчета
СхемаСКД = Отчеты.МойОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Инициализируем настройки (можно взять текущие настройки компоновщика отчета)
Настройки = СхемаСКД.НастройкиПоУмолчанию;
// Если нужно программно изменить параметр, делаем это через компоновщик
ПараметрПериод = Настройки.ПараметрыДанных.Элементы.Найти("Период");
Если ПараметрПериод <> Неопределено Тогда
ПараметрПериод.Значение = ТекущаяДата();
ПараметрПериод.Использование = Истина;
КонецЕсли;
Если стандартный синтаксис кажется вам слишком многословным, обратите внимание на СКДБилдер: упрощаем программное создание СКД — модуль-обертку, который делает код более читаемым. Важный момент: если вы работаете в модуле объекта отчета, у вас уже есть доступ к свойству СхемаКомпоновкиДанных и КомпоновщикНастроек. Если же код пишется во внешней обработке или общем модуле, создание объектов должно быть явным.
Проанализируем ситуацию, когда нам нужно программно наложить фильтр, который пользователь не должен случайно отключить. Для этого мы обратимся к коллекции Отбор в настройках компоновки. Рассмотрим подробнее, как добавить новый элемент отбора:
ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7701010101");
ЭлементОтбора.Использование = Истина;
Здесь важно использовать объект ПолеКомпоновкиДанных для указания левого значения, иначе система не поймет, по какому именно полю схемы нужно фильтровать данные.
Теперь выясним причину, почему нельзя просто отправить настройки в табличный документ. Платформе необходимо сопоставить настройки со схемой и сформировать внутренний объект — МакетКомпоновкиДанных. Для этого используется КомпоновщикМакетаКомпоновкиДанных.
Посмотрим на пример полной сборки процесса:
// Создаем компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
// Формируем макет компоновки
// ДанныеРасшифровки позволяют позже реализовать расшифровку полей в отчете
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаСКД, Настройки, ДанныеРасшифровки);
// Инициализируем процессор компоновки данных
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
Обратите внимание, что второй параметр метода Инициализировать позволяет передать внешние наборы данных (например, таблицы значений), если они используются в вашей схеме. В таких случаях критически важна оптимизация отчетов с набором данных - объект, чтобы избежать проблем с производительностью при передаче больших объемов данных.
На финальном этапе мы используем ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент. Этот объект последовательно считывает данные из процессора компоновки и отрисовывает их в ячейках таблицы. Иногда на этом этапе требуется нестандартное оформление, например, программное изменение заголовка группировки отчета СКД, которое невозможно выполнить обычными настройками.
Разберем по шагам завершающий блок кода:
ТабДок = Новый ТабличныйДокумент;
// Создаем процессор вывода
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
// Начинаем вывод
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Показываем результат пользователю
ТабДок.Показать("Результат формирования отчета");
Практический совет: если отчет очень большой, использование метода Вывести() целиком может привести к значительному потреблению оперативной памяти. В таких случаях рекомендуется использовать цикл с методом ВывестиЭлемент(), что позволяет более гибко контролировать процесс отрисовки.
Проанализируем специфику клиент-серверного взаимодействия. Помните, что объекты СхемаКомпоновкиДанных, КомпоновщикМакета и ПроцессорКомпоновки живут только на сервере. Табличный документ можно передать с сервера на клиент, но сами объекты СКД — нет. Поэтому весь процесс формирования отчета должен быть вынесен в процедуру &НаСервере или в серверный модуль.
Если вам необходимо расширить возможности построения отчетов на стороне клиентского приложения, может пригодиться Пользовательская СКД. А для отладки процессов и анализа структур данных в режиме тонкого клиента удобно использовать инструменты разработчика "Инструментики".
Рассмотрим структуру вызова:
ТабличныйДокумент.ТабличныйДокумент возвращается на клиент и отображается пользователю.При работе с СКД начинающие разработчики часто сталкиваются с тем, что отчет выводится пустым или параметры не применяются. Разберем основные причины:
КомпоновщикНастроек.Настройки (это текущие настройки пользователя) или из КомпоновщикНастроек.ПолучитьНастройки() (это настройки с учетом пользовательских изменений на форме).Использование не установлено в Истина.Настройки, ФиксированныеНастройки и ПользовательскиеНастройки. Платформа объединяет их перед выполнением. Если вы программно задаете отбор, лучше использовать Настройки или ФиксированныеНастройки, чтобы пользователь не смог их легко изменить через интерфейс.Мы проанализировали полный цикл программной работы с Системой компоновки данных. Использование этих методов позволяет создавать гибкие отчеты, динамически менять структуру запроса и автоматизировать рассылку отчетов без участия пользователя.