В практике разработчика 1С часто возникает задача: получить данные отчета программно (например, в ТаблицуЗначений), имея на руках только навигационную ссылку типа e1cib/data/Справочник.ВариантыОтчетов?ref=.... На первый взгляд решение кажется очевидным — получить объект варианта, выгрузить настройки и скомпоновать результат. Однако при работе с современными конфигурациями на базе БСП (Библиотека стандартных подсистем), и особенно с Универсальным отчетом, стандартный подход часто выдает ошибку: "Поле не найдено". В этой статье мы подробно разберем, почему это происходит и как правильно решить задачу, используя штатные возможности и справочник по методам БСП.
Рассмотрим стандартную ситуацию. Программист пытается получить схему компоновки данных (СКД) напрямую из метаданных отчета, к которому относится вариант:
ВариантОтчета = ПолучитьСсылкуИзНавигационной(НавигационнаяСсылка);
ОтчетОбъект = Отчеты[ВариантОтчета.Отчет.Имя].Создать();
Схема = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = ВариантОтчета.Настройки.Получить();
Проблема заключается в том, что в современных конфигурациях многие отчеты являются динамическими. В частности, Универсальный отчет в макете ОсновнаяСхемаКомпоновкиДанных содержит лишь пустой шаблон или базовый набор полей. Полная схема со всеми реквизитами справочников (включая дополнительные реквизиты, такие как п_МДЛП или МойРеквизит) строится программно в момент открытия отчета. В некоторых случаях для реализации сложной логики на стороне клиента может использоваться пользовательская СКД, что также влияет на процесс инициализации.
Когда мы пытаемся применить пользовательские настройки (где выбраны эти специфические поля) к "пустой" схеме из макета, система закономерно сообщает, что поле не найдено. Нам нужно получить не статичную схему из конфигуратора, а ту динамическую схему, которую сформировала подсистема вариантов отчетов БСП.
Для корректной работы с вариантами отчетов, зарегистрированными в справочнике ВариантыОтчетов, необходимо использовать методы общих модулей БСП. Рассмотрим пошагово, как инициализировать отчет правильно, чтобы система сама собрала нужную схему.
ПолучитьСсылкуИзНавигационной.Разберем пример кода, который позволяет выгрузить результат такого отчета в таблицу значений:
// 1. Извлекаем ссылку на вариант из строки
ВариантСсылка = ПолучитьСсылкуИзНавигационной("e1cib/data/Справочник.ВариантыОтчетов?ref=9ed9123c298ac7d888ee9b2549565958");
// 2. Используем функции БСП для создания полностью инициализированного объекта отчета.
// Общий модуль ОтчетыСервер (или аналогичный в вашей версии БСП) имеет метод СоздатьОбъектОтчета.
ОбъектОтчета = ОтчетыСервер.СоздатьОбъектОтчета(ВариантСсылка);
// 3. Получаем схему и настройки непосредственно из подготовленного объекта
СхемаКомпоновкиДанных = ОбъектОтчета.СхемаКомпоновкиДанных;
Настройки = ОбъектОтчета.КомпоновщикНастроек.ПолучитьНастройки();
// 4. Дальнейший процесс компоновки стандартен
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ТаблицаРезультат = Новый ТаблицаЗначений;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Если вам требуется часто генерировать сложные схемы программно, можно применить СКДБилдер, который упрощает программное создание СКД и значительно сокращает объем кода.
Проанализируем ситуацию, если вы работаете именно с Универсальным отчетом. В этом случае объект отчета имеет экспортный метод СкомпоноватьРезультат(). Вызов этого метода позволяет делегировать всю сложную работу по формированию схемы самой логике отчета. Также стоит учитывать, что существует расширенный универсальный отчет по метаданным, который может обладать специфическими методами инициализации.
Посмотрим на дополнительные параметры: если в настройках варианта присутствуют Дополнительные реквизиты, созданные пользователем в режиме Предприятие, они добавляются в СКД процедурой ПриКомпоновкеРезультата. Если вы вызываете отчет "вручную" через макет, эта процедура не срабатывает. Использование ОтчетыСервер.СоздатьОбъектОтчета решает эту проблему, так как инициирует все необходимые события БСП.
Иногда ошибка может быть связана не только со схемой, но и с правами доступа или сложными фильтрами. Рассмотрим важные моменты:
Выясним причину успеха: для корректного программного формирования отчета по ссылке нельзя полагаться на статические макеты метаданных. Мы должны использовать механизмы БСП, которые учитывают динамическую природу построения схем компоновки. Основной инструмент здесь — функция СоздатьОбъектОтчета общего модуля ОтчетыСервер. Это гарантирует, что все программно добавленные поля, отборы и пользовательские настройки будут корректно интерпретированы системой компоновки данных.