К статье
Практический материал

Отчеты и Аналитика · 10 мин

Как получить объект отчета в 1С

Как получить объект отчета в 1С: метод Создать(), внешние отчеты, работа с СКД и компоновщиком настроек. Примеры кода, типичные ошибки и проверка результата.

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

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

Что такое объект отчета и когда он нужен

В терминах платформы 1С отчет как объект конфигурации — это описание: схема компоновки, формы, макеты, модуль. Объект отчета (тип ОтчетОбъект) — это экземпляр, созданный в памяти в момент выполнения кода. Именно он содержит данные компоновщика настроек, позволяет программно изменить параметры и запустить формирование результата.

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

Получение объекта встроенного отчета через менеджер

Стандартный способ — обращение к менеджеру отчетов с последующим вызовом метода Создать(). Метод создает новый экземпляр объекта отчета и возвращает ссылку на него:

ОбъектОтчета = Отчеты.ПродажиЗаПериод.Создать();

После выполнения этой строки доступны основные свойства и методы объекта: СхемаКомпоновкиДанных, КомпоновщикНастроек, ПолучитьМакет(), СкомпоноватьРезультат(). Важно понимать, что каждый вызов Создать() формирует новый независимый экземпляр — изменения настроек в одном объекте не затрагивают другой.

Если имя отчета хранится в переменной (например, приходит параметром), используют обращение через квадратные скобки:

ОбъектОтчета = Отчеты[ИмяОтчета].Создать();

При обращении к несуществующему имени платформа вызовет исключение, поэтому при динамическом имени полезно предварительно проверить наличие отчета через Метаданные.Отчеты.Найти(ИмяОтчета).

bsl
Если Метаданные.Отчеты.Найти(ИмяОтчета) <> Неопределено Тогда
    ОбъектОтчета = Отчеты[ИмяОтчета].Создать();
Иначе
    ВызватьИсключение "Отчет не найден: " + ИмяОтчета;
КонецЕсли;

Получение объекта внешнего отчета

Внешний отчет хранится в файле с расширением .erf и не входит в состав конфигурации. Для него менеджер Отчеты недоступен — объект создается через менеджер внешних отчетов:

ОбъектОтчета = ВнешниеОтчеты.Создать("C:\Отчеты\МойОтчет.erf");

На тонком и веб-клиенте метод ВнешниеОтчеты.Создать() выполняется только на сервере, и файл должен быть доступен с сервера 1С, а не с машины пользователя. Если файл лежит на клиенте, его сначала передают на сервер (например, через временное хранилище) и записывают во временный файл.

В файловой базе при работе через толстый клиент допустимо создание объекта на клиенте, но такой подход считается устаревшим и не масштабируется на клиент-серверный режим. Правильная практика — вся работа с внешними отчетами на сервере.

Безопасный режим и права

По умолчанию внешние отчеты выполняются в безопасном режиме: в них запрещены операции с файловой системой, COM-объектами и привилегированный режим. Если код отчета требует таких операций, безопасный режим отключают третьим параметром метода Создать() либо через настройки профиля безопасности кластера. Отключать защиту следует только для проверенных файлов из доверенного источника.

Получение объекта отчета из дополнительных отчетов БСП

В конфигурациях на Библиотеке стандартных подсистем (Управление торговлей, ERP, ЗУП и другие) внешние отчеты регистрируются в справочнике «Дополнительные отчеты и обработки». В этом случае файл хранится в базе, а объект получают программно через API подсистемы:

ОбъектОтчета = ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(СсылкаНаОтчет);

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

Работа с объектом после получения: настройки и формирование

Полученный объект чаще всего используют для программного формирования отчета. Типовая последовательность: установить параметры в компоновщике настроек, создать табличный документ, вызвать компоновку результата.

ОбъектОтчета = Отчеты.ПродажиЗаПериод.Создать();

Настройки = ОбъектОтчета.КомпоновщикНастроек.Настройки;

Параметр = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(

Новый ПараметрКомпоновкиДанных("Период"));

Параметр.Значение = Новый СтандартныйПериод(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));

Параметр.Использование = Истина;

Результат = Новый ТабличныйДокумент;

ОбъектОтчета.СкомпоноватьРезультат(Результат);

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

Порядок действий
  1. 1
    Создайте объект: Отчеты.ИмяОтчета.Создать() или ВнешниеОтчеты.Создать(Путь)
  2. 2
    Получите настройки из КомпоновщикНастроек и установите параметры и отборы
  3. 3
    Создайте ТабличныйДокумент для результата
  4. 4
    Вызовите СкомпоноватьРезультат(ТабличныйДокумент)
  5. 5
    Проверьте, что табличный документ заполнен, и выведите его пользователю или сохраните

Типичные ошибки при получении объекта отчета

Наиболее частая проблема — попытка обратиться к внешнему отчету через Отчеты.ИмяОтчета. Менеджер Отчеты видит только объекты конфигурации; внешний отчет там отсутствует, и код завершится ошибкой обращения к несуществующему свойству.

Вторая распространенная ситуация — вызов ВнешниеОтчеты.Создать() на клиенте в тонком или веб-клиенте. Метод недоступен в этом контексте, и платформа сообщит об ошибке вызова. Решение — перенести код в серверную процедуру общего модуля с признаком «Сервер».

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

Типичные ошибки
01
Обращение Отчеты.Имя к внешнему отчету — менеджер видит только объекты конфигурации, используйте ВнешниеОтчеты.Создать()
02
Вызов ВнешниеОтчеты.Создать() на тонком клиенте — метод доступен только на сервере
03
Путь к .erf-файлу с диска клиента при серверном вызове — сервер не видит локальные диски пользователя
04
Игнорирование безопасного режима — код с файловыми операциями внутри отчета молча не выполняется или падает с ошибкой

Проверка результата и выбор подхода

Признак корректного получения объекта — переменная содержит значение типа ОтчетОбъект, доступны свойства СхемаКомпоновкиДанных и КомпоновщикНастроек. Проверить тип можно через ТипЗнч(ОбъектОтчета), а факт формирования — по количеству строк в итоговом табличном документе.

Контрольные точки

Как проверить результат

Тип созданной переменной
Норма

ОтчетОбъект.<ИмяОтчета>

Тревожный признак

Неопределено или исключение при вызове Создать()

Доступность схемы компоновки
Норма

СхемаКомпоновкиДанных возвращает объект СКД

Тревожный признак

Ошибка обращения к свойству — создан не тот объект

Результат компоновки
Норма

Табличный документ содержит строки отчета

Тревожный признак

Пустой документ при корректных параметрах — проверяйте настройки и права на данные

Маршрут решения

Как выбрать действие

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

FAQ

Можно ли получить объект отчета на клиенте?

Для встроенных отчетов Отчеты.Имя.Создать() технически доступен на толстом клиенте, но на тонком и веб-клиенте создание объекта выполняют на сервере. Рекомендуемая архитектура — серверная процедура, которая создает объект, формирует результат и возвращает табличный документ клиенту.

Чем отличается ПолучитьМакет() от получения объекта отчета?

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

Почему ВнешниеОтчеты.Создать() выдает ошибку «Метод не обнаружен»?

Чаще всего код выполняется в контексте, где менеджер недоступен: на тонком клиенте, веб-клиенте или в модуле без соответствующих флагов. Перенесите вызов в серверную процедуру общего модуля с установленным признаком «Сервер».

Как программно узнать имя отчета, из которого создан объект?

Через метаданные объекта: ОбъектОтчета.Метаданные().Имя вернет имя отчета в конфигурации. Для внешних отчетов метод вернет описание внешнего объекта, а полное имя файла доступно через свойство ИспользуемоеИмяФайла.

Можно ли получить объект отчета в фоновом задании?

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

Итог

Что важно запомнить

Встроенный отчет создается через Отчеты.Имя.Создать(), внешний — через ВнешниеОтчеты.Создать() на сервере, в БСП — через ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(). После получения объекта настройте компоновщик и вызовите СкомпоноватьРезультат().