Как программно получить результат отчета, имея навигационную ссылку на его вариант

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

В практике разработчика 1С часто возникает задача: получить данные отчета программно (например, в ТаблицуЗначений), имея на руках только навигационную ссылку типа e1cib/data/Справочник.ВариантыОтчетов?ref=.... На первый взгляд решение кажется очевидным — получить объект варианта, выгрузить настройки и скомпоновать результат. Однако при работе с современными конфигурациями на базе БСП (Библиотека стандартных подсистем), и особенно с Универсальным отчетом, стандартный подход часто выдает ошибку: "Поле не найдено". В этой статье мы подробно разберем, почему это происходит и как правильно решить задачу, используя штатные возможности и справочник по методам БСП.

Анализируем причину ошибки: почему макет из конфигуратора не подходит

Рассмотрим стандартную ситуацию. Программист пытается получить схему компоновки данных (СКД) напрямую из метаданных отчета, к которому относится вариант:


ВариантОтчета = ПолучитьСсылкуИзНавигационной(НавигационнаяСсылка);
ОтчетОбъект = Отчеты[ВариантОтчета.Отчет.Имя].Создать();
Схема = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = ВариантОтчета.Настройки.Получить();

Проблема заключается в том, что в современных конфигурациях многие отчеты являются динамическими. В частности, Универсальный отчет в макете ОсновнаяСхемаКомпоновкиДанных содержит лишь пустой шаблон или базовый набор полей. Полная схема со всеми реквизитами справочников (включая дополнительные реквизиты, такие как п_МДЛП или МойРеквизит) строится программно в момент открытия отчета. В некоторых случаях для реализации сложной логики на стороне клиента может использоваться пользовательская СКД, что также влияет на процесс инициализации.

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

Решение через программный интерфейс БСП

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

  1. Получаем ссылку на вариант отчета. Для этого используем метод ПолучитьСсылкуИзНавигационной.
  2. Создаем объект отчета через серверные методы БСП. Это ключевой момент — методы БСП выполнят инициализацию, подцепят нужный объект (справочник или регистр) и достроят схему.
  3. Инициализируем процессор компоновки. Используем уже готовую схему и настройки из созданного объекта.

Разберем пример кода, который позволяет выгрузить результат такого отчета в таблицу значений:


// 1. Извлекаем ссылку на вариант из строки
ВариантСсылка = ПолучитьСсылкуИзНавигационной("e1cib/data/Справочник.ВариантыОтчетов?ref=9ed9123c298ac7d888ee9b2549565958");

// 2. Используем функции БСП для создания полностью инициализированного объекта отчета.
// Общий модуль ОтчетыСервер (или аналогичный в вашей версии БСП) имеет метод СоздатьОбъектОтчета.
ОбъектОтчета = ОтчетыСервер.СоздатьОбъектОтчета(ВариантСсылка);

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

// 4. Дальнейший процесс компоновки стандартен
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

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

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

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

Важные нюансы работы с Универсальным отчетом

Проанализируем ситуацию, если вы работаете именно с Универсальным отчетом. В этом случае объект отчета имеет экспортный метод СкомпоноватьРезультат(). Вызов этого метода позволяет делегировать всю сложную работу по формированию схемы самой логике отчета. Также стоит учитывать, что существует расширенный универсальный отчет по метаданным, который может обладать специфическими методами инициализации.

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

Обработка прав доступа и настроек

Иногда ошибка может быть связана не только со схемой, но и с правами доступа или сложными фильтрами. Рассмотрим важные моменты:

Итоги

Выясним причину успеха: для корректного программного формирования отчета по ссылке нельзя полагаться на статические макеты метаданных. Мы должны использовать механизмы БСП, которые учитывают динамическую природу построения схем компоновки. Основной инструмент здесь — функция СоздатьОбъектОтчета общего модуля ОтчетыСервер. Это гарантирует, что все программно добавленные поля, отборы и пользовательские настройки будут корректно интерпретированы системой компоновки данных.

← На главную