Как программно сформировать отчет на СКД и настроить расшифровку в обычных формах

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

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

Откуда берется форма отчета по умолчанию

Если у отчета в дереве метаданных не создана основная форма, платформа «1С:Предприятие» генерирует стандартную форму автоматически во время выполнения программы. Чтобы получить экземпляр такой формы программно, нет необходимости рисовать форму вручную в конфигураторе. Достаточно вызвать стандартный метод объекта отчета ПолучитьФорму() без указания имени формы.

Рассмотрим, как платформа инициализирует элементы:

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

Причина неработающей расшифровки при программном выводе

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

Метод объекта СкомпоноватьРезультат() имеет сигнатуру:

СкомпоноватьРезультат(<ТабличныйДокумент>, <ДанныеРасшифровки>)

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

Способ 1: Быстрое формирование через СкомпоноватьРезультат

Рассмотрим базовый и наиболее компактный способ программного открытия отчета со стандартной формой. Для корректной работы расшифровки передадим вторым параметром реквизит ДанныеРасшифровки самой полученной формы:


// Создаем объект отчета из метаданных
ОтчетОбъект = Отчеты.АнализДебиторки.Создать();

// Получаем автогенерируемую форму по умолчанию
ФормаОтчета = ОтчетОбъект.ПолучитьФорму();

// Получаем и при необходимости модифицируем настройки компоновщика
НастройкиКД = ОтчетОбъект.КомпоновщикНастроек.ПолучитьНастройки();

// Загружаем настройки обратно в компоновщик
ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиКД);

// Выполняем компоновку в табличный документ формы с передачей расшифровки формы
ОтчетОбъект.СкомпоноватьРезультат(ФормаОтчета.ЭлементыФормы.Результат, ФормаОтчета.ДанныеРасшифровки);

// Открываем форму пользователю
ФормаОтчета.Открыть();

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

Способ 2: Полный программный вывод через процессоры СКД

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


ОтчетОбъект = Отчеты.АнализДебиторки.Создать();
ФормаОтчета = ОтчетОбъект.ПолучитьФорму();

// Инициализируем объект для хранения данных расшифровки
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;

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

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

// Получаем табличный документ формы и очищаем его
ТабДок = ФормаОтчета.ЭлементыФормы.Результат;
ТабДок.Очистить();

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

// Обязательно привязываем сформированные данные расшифровки к форме отчета
ФормаОтчета.ДанныеРасшифровки = ДанныеРасшифровки;

// Открываем форму с готовым результатом
ФормаОтчета.Открыть();

Важные особенности и ограничения платформы

При реализации программного вывода отчетов на обычных формах обратим внимание на несколько критически важных моментов:

  1. Режим защиты и только просмотр: Чтобы ячейки с расшифровкой реагировали на указатель мыши (курсор в виде лупы), табличный документ должен быть недоступен для прямого редактирования текста. Для этого свойство ТолькоПросмотр или Защита табличного документа должно быть установлено в значение Истина. При включенном редактировании двойной клик лишь открывает поле ввода строки.
  2. Тип реквизита расшифровки: В обычных формах реквизит ДанныеРасшифровки принимает напрямую объект типа ДанныеРасшифровкиКомпоновкиДанных (в отличие от управляемых форм, где используется строковый адрес во временном хранилище).
  3. Внешние отчеты: Метод ВнешнийОтчет.ПолучитьФорму() также возвращает сгенерированную форму. Однако если внешний отчет регистрируется через типовой справочник дополнительных отчетов и обработок, типовой код конфигурации может выполнять проверку на наличие формы в метаданных файла и требовать явного добавления хотя бы одной формы в отчет.
← На главную