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