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