Отчеты и Аналитика · 10 мин
Как получить объект отчета в 1С
Как получить объект отчета в 1С: метод Создать(), внешние отчеты, работа с СКД и компоновщиком настроек. Примеры кода, типичные ошибки и проверка результата.
Объект отчета в 1С — это программный экземпляр отчета, через который разработчик обращается к схеме компоновки данных, макетам, параметрам и модулю объекта. Получить его требуется, когда нужно сформировать отчет программно, переопределить стандартное поведение, доработать формирование в расширении или вызвать отчет из другого механизма конфигурации.
Способ получения объекта зависит от того, где находится отчет: в составе конфигурации, во внешнем файле .erf или в справочнике дополнительных отчетов БСП. Для встроенных отчетов используется менеджер Отчеты, для внешних — ВнешниеОтчеты.Создать() или подключение через безопасный режим. Ниже разобраны все рабочие варианты с примерами кода и границами их применения.
Что такое объект отчета и когда он нужен
В терминах платформы 1С отчет как объект конфигурации — это описание: схема компоновки, формы, макеты, модуль. Объект отчета (тип ОтчетОбъект) — это экземпляр, созданный в памяти в момент выполнения кода. Именно он содержит данные компоновщика настроек, позволяет программно изменить параметры и запустить формирование результата.
Получать объект отчета приходится в нескольких типовых ситуациях: программное формирование отчета с заданными отборами, вывод результата в табличный документ без открытия формы, доработка логики через подписки или расширения, а также интеграция отчета в собственные обработки. Во всех этих случаях первый шаг одинаков — создать экземпляр объекта.
Получение объекта встроенного отчета через менеджер
Стандартный способ — обращение к менеджеру отчетов с последующим вызовом метода Создать(). Метод создает новый экземпляр объекта отчета и возвращает ссылку на него:
ОбъектОтчета = Отчеты.ПродажиЗаПериод.Создать();
После выполнения этой строки доступны основные свойства и методы объекта: СхемаКомпоновкиДанных, КомпоновщикНастроек, ПолучитьМакет(), СкомпоноватьРезультат(). Важно понимать, что каждый вызов Создать() формирует новый независимый экземпляр — изменения настроек в одном объекте не затрагивают другой.
Если имя отчета хранится в переменной (например, приходит параметром), используют обращение через квадратные скобки:
ОбъектОтчета = Отчеты[ИмяОтчета].Создать();
При обращении к несуществующему имени платформа вызовет исключение, поэтому при динамическом имени полезно предварительно проверить наличие отчета через Метаданные.Отчеты.Найти(ИмяОтчета).
Если Метаданные.Отчеты.Найти(ИмяОтчета) <> Неопределено Тогда
ОбъектОтчета = Отчеты[ИмяОтчета].Создать();
Иначе
ВызватьИсключение "Отчет не найден: " + ИмяОтчета;
КонецЕсли;Получение объекта внешнего отчета
Внешний отчет хранится в файле с расширением .erf и не входит в состав конфигурации. Для него менеджер Отчеты недоступен — объект создается через менеджер внешних отчетов:
ОбъектОтчета = ВнешниеОтчеты.Создать("C:\Отчеты\МойОтчет.erf");
На тонком и веб-клиенте метод ВнешниеОтчеты.Создать() выполняется только на сервере, и файл должен быть доступен с сервера 1С, а не с машины пользователя. Если файл лежит на клиенте, его сначала передают на сервер (например, через временное хранилище) и записывают во временный файл.
В файловой базе при работе через толстый клиент допустимо создание объекта на клиенте, но такой подход считается устаревшим и не масштабируется на клиент-серверный режим. Правильная практика — вся работа с внешними отчетами на сервере.
Безопасный режим и права
По умолчанию внешние отчеты выполняются в безопасном режиме: в них запрещены операции с файловой системой, COM-объектами и привилегированный режим. Если код отчета требует таких операций, безопасный режим отключают третьим параметром метода Создать() либо через настройки профиля безопасности кластера. Отключать защиту следует только для проверенных файлов из доверенного источника.
Получение объекта отчета из дополнительных отчетов БСП
В конфигурациях на Библиотеке стандартных подсистем (Управление торговлей, ERP, ЗУП и другие) внешние отчеты регистрируются в справочнике «Дополнительные отчеты и обработки». В этом случае файл хранится в базе, а объект получают программно через API подсистемы:
ОбъектОтчета = ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(СсылкаНаОтчет);
Здесь СсылкаНаОтчет — элемент справочника дополнительных отчетов. Метод возвращает готовый объект отчета, с которым дальше работают так же, как с обычным: настраивают компоновщик и формируют результат. Это предпочтительный путь в типовых конфигурациях, потому что учитывает права пользователя, версии отчета и безопасный режим.
Работа с объектом после получения: настройки и формирование
Полученный объект чаще всего используют для программного формирования отчета. Типовая последовательность: установить параметры в компоновщике настроек, создать табличный документ, вызвать компоновку результата.
ОбъектОтчета = Отчеты.ПродажиЗаПериод.Создать();
Настройки = ОбъектОтчета.КомпоновщикНастроек.Настройки;
Параметр = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(
Новый ПараметрКомпоновкиДанных("Период"));
Параметр.Значение = Новый СтандартныйПериод(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));
Параметр.Использование = Истина;
Результат = Новый ТабличныйДокумент;
ОбъектОтчета.СкомпоноватьРезультат(Результат);
Метод СкомпоноватьРезультат() формирует отчет по текущим настройкам компоновщика и помещает его в переданный табличный документ. Если нужно сформировать отчет с произвольными настройками, не затрагивая настройки по умолчанию, их загружают в компоновщик отдельно и передают в метод вторым параметром.
- 1Создайте объект: Отчеты.ИмяОтчета.Создать() или ВнешниеОтчеты.Создать(Путь)
- 2Получите настройки из КомпоновщикНастроек и установите параметры и отборы
- 3Создайте ТабличныйДокумент для результата
- 4Вызовите СкомпоноватьРезультат(ТабличныйДокумент)
- 5Проверьте, что табличный документ заполнен, и выведите его пользователю или сохраните
Типичные ошибки при получении объекта отчета
Наиболее частая проблема — попытка обратиться к внешнему отчету через Отчеты.ИмяОтчета. Менеджер Отчеты видит только объекты конфигурации; внешний отчет там отсутствует, и код завершится ошибкой обращения к несуществующему свойству.
Вторая распространенная ситуация — вызов ВнешниеОтчеты.Создать() на клиенте в тонком или веб-клиенте. Метод недоступен в этом контексте, и платформа сообщит об ошибке вызова. Решение — перенести код в серверную процедуру общего модуля с признаком «Сервер».
Третья группа ошибок связана с контекстом выполнения: создание объекта в привилегированном модуле при включенном безопасном режиме, обращение к файлу по клиентскому пути с сервера кластера, использование объекта отчета после завершения транзакции, в которой он логически привязан к данным. Каждая из них диагностируется по тексту исключения платформы.
Проверка результата и выбор подхода
Признак корректного получения объекта — переменная содержит значение типа ОтчетОбъект, доступны свойства СхемаКомпоновкиДанных и КомпоновщикНастроек. Проверить тип можно через ТипЗнч(ОбъектОтчета), а факт формирования — по количеству строк в итоговом табличном документе.
Как проверить результат
ОтчетОбъект.<ИмяОтчета>
Неопределено или исключение при вызове Создать()
СхемаКомпоновкиДанных возвращает объект СКД
Ошибка обращения к свойству — создан не тот объект
Табличный документ содержит строки отчета
Пустой документ при корректных параметрах — проверяйте настройки и права на данные
Как выбрать действие
FAQ
Можно ли получить объект отчета на клиенте?
Для встроенных отчетов Отчеты.Имя.Создать() технически доступен на толстом клиенте, но на тонком и веб-клиенте создание объекта выполняют на сервере. Рекомендуемая архитектура — серверная процедура, которая создает объект, формирует результат и возвращает табличный документ клиенту.
Чем отличается ПолучитьМакет() от получения объекта отчета?
ПолучитьМакет() — метод менеджера отчета, возвращающий только макет (табличный документ), без создания полноценного экземпляра объекта. Если нужны СКД, настройки и формирование результата — требуется именно объект через Создать().
Почему ВнешниеОтчеты.Создать() выдает ошибку «Метод не обнаружен»?
Чаще всего код выполняется в контексте, где менеджер недоступен: на тонком клиенте, веб-клиенте или в модуле без соответствующих флагов. Перенесите вызов в серверную процедуру общего модуля с установленным признаком «Сервер».
Как программно узнать имя отчета, из которого создан объект?
Через метаданные объекта: ОбъектОтчета.Метаданные().Имя вернет имя отчета в конфигурации. Для внешних отчетов метод вернет описание внешнего объекта, а полное имя файла доступно через свойство ИспользуемоеИмяФайла.
Можно ли получить объект отчета в фоновом задании?
Да, это типовой сценарий для длительных отчетов. В фоновом задании объект создается на сервере стандартным вызовом Создать(), результат помещается во временное хранилище, а клиент забирает его после завершения задания.
Что важно запомнить
Встроенный отчет создается через Отчеты.Имя.Создать(), внешний — через ВнешниеОтчеты.Создать() на сервере, в БСП — через ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(). После получения объекта настройте компоновщик и вызовите СкомпоноватьРезультат().