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

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

Как получить вариант отчета программно в 1С

Как программно получить вариант отчета в 1С через ВариантыОтчетов, сформировать его и получить результат. Примеры кода, ошибки и проверка результата.

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

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

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

Что такое вариант отчета и где он хранится

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

В конфигурациях на базе БСП пользовательские варианты хранятся в справочнике «Варианты отчетов», а предопределенные — регистрируются при обновлении в подсистеме. В конфигурациях без БСП варианты, заданные разработчиком, доступны через коллекцию ВариантыНастроек схемы компоновки, а пользовательские сохраняются в стандартное хранилище настроек.

Получение варианта в типовой конфигурации через ВариантыОтчетов

Если конфигурация построена на БСП (УТ, ERP, Бухгалтерия, ЗУП и другие типовые), используйте общий модуль ВариантыОтчетов. Основной сценарий — найти вариант по ключу отчета и ключу варианта:

КлючОтчета = "ПродажиПоМесяцам";

КлючВарианта = "Основной";

Запрос = Новый Запрос(

"ВЫБРАТЬ

| Варианты.Ссылка КАК Ссылка

|ИЗ

| Справочник.ВариантыОтчетов КАК Варианты

|ГДЕ

| Варианты.КлючВарианта = &КлючВарианта

| И Варианты.Отчет.ИмяОтчета = &КлючОтчета

| И НЕ Варианты.ПометкаУдаления");

Запрос.УстановитьПараметр("КлючВарианта", КлючВарианта);

Запрос.УстановитьПараметр("КлючОтчета", КлючОтчета);

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

ВариантСсылка = Выборка.Ссылка;

КонецЕсли;

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

Учтите: в новых версиях БСП состав реквизитов справочника может отличаться, поэтому перед написанием запроса откройте метаданные справочника «Варианты отчетов» в конфигураторе и сверьте имена полей. Надежнее искать вариант по ключу, а не по наименованию — наименование пользователь может переименовать.

Получение варианта без БСП: через схему компоновки

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

ОтчетОбъект = Отчеты.ПродажиПоМесяцам.Создать();

Схема = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

ВариантНастроек = Схема.ВариантыНастроек.Найти("Основной");

Если ВариантНастроек <> Неопределено Тогда

Настройки = ВариантНастроек.Настройки;

Иначе

Настройки = Схема.НастройкиПоУмолчанию;

КонецЕсли;

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

Далее настройки загружаются в компоновщик, и отчет формируется программно. Этот способ не зависит от подсистем БСП и работает в любой конфигурации, где отчет построен на СКД.

Формирование отчета с полученным вариантом

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

Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;

Компоновщик.Инициализировать(

Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));

Компоновщик.ЗагрузитьНастройки(Настройки);

// При необходимости переопределить параметры

ПараметрПериод = Компоновщик.Настройки.ПараметрыДанных.Элементы.Найти("Период");

Если ПараметрПериод <> Неопределено Тогда

ПараметрПериод.Значение = ТекущаяДатаСеанса();

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

КонецЕсли;

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема,

Компоновщик.ПолучитьНастройки());

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;

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

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

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

ПроцессорВывода.УстановитьДокумент(ТабДок);

ПроцессорВывода.Вывести(ПроцессорКомпоновки);

Результат — заполненный табличный документ, который можно показать пользователю, сохранить в файл (ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX)) или вложить в письмо. Перед формированием обязательно проверьте, что обязательные параметры (период, организация) заполнены, иначе СКД либо вернет пустой результат, либо вызовет ошибку компоновки.

Порядок действий
  1. 1
    Определите ключ отчета и ключ (имя) нужного варианта
  2. 2
    Получите настройки варианта: через справочник ВариантыОтчетов (БСП) или через Схема.ВариантыНастроек
  3. 3
    Создайте компоновщик и загрузите в него настройки варианта
  4. 4
    Установите обязательные параметры и отборы
  5. 5
    Сформируйте макет компоновки и выведите результат в табличный документ
  6. 6
    Проверьте, что табличный документ не пуст и содержит ожидаемые данные

Выбор способа в зависимости от ситуации

Способ получения варианта зависит от архитектуры конфигурации и от того, кто создал вариант — разработчик или пользователь. Неверный выбор приводит к тому, что код не находит вариант, хотя в интерфейсе он виден.

Сравнение вариантов

Справочник ВариантыОтчетов (БСП)

Подходит для типовых конфигураций и пользовательских вариантов. Ограничение: требует подсистемы БСП и корректной регистрации отчета в ней.

Схема.ВариантыНастроек

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

Стандартное хранилище настроек

Подходит для чтения пользовательских настроек без БСП через ХранилищеВариантовОтчетов. Ограничение: требуется знать ключ объекта и ключ настроек, структура хранения менее очевидна.

Если отчет внешний (файл .erf), подключенный через подсистему «Дополнительные отчеты и обработки», вариант ищется в том же справочнике «Варианты отчетов», но отчет сначала нужно подключить через менеджер внешних отчетов, чтобы получить его объект.

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

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

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

Частые ошибки и их последствия

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

Типичные ошибки
01
Поиск варианта по наименованию вместо ключа — после переименования пользователем код перестает находить вариант
02
Формирование отчета без установки обязательных параметров — результат пустой или ошибка компоновки без понятного сообщения
03
Использование настроек варианта от другой версии схемы — после изменения СКД старые настройки могут содержать удаленные поля и вызвать ошибку
04
Обращение к справочнику ВариантыОтчетов в конфигурации без БСП — ошибка компиляции, объект не существует
05
Игнорирование пометки удаления варианта — формируется отчет по устаревшим настройкам, которые пользователь считал удаленными

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

Проверка результата

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

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

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

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

ВысотаТаблицы больше заголовка, есть строки данных

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

Документ содержит только шапку или пуст полностью

Параметры в сформированном отчете
Норма

Период и отборы в результате совпадают с заданными в коде

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

Отчет сформирован за другой период или без отбора

Сравнение с интерактивным формированием
Норма

Программный результат совпадает с отчетом, сформированным пользователем с тем же вариантом

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

Суммы или состав строк расходятся — вероятно, загружены не те настройки

Самый надежный тест — сформировать тот же вариант вручную в пользовательском режиме и сверить итоговые суммы с программным результатом. Расхождение почти всегда означает, что загружены не те настройки или не установлены параметры, которые в интерфейсе заполняются автоматически (например, «ТекущаяОрганизация» из настроек пользователя).

Если отчет формируется по расписанию, сохраняйте рядом с файлом отчета текстовое описание примененных параметров (период, отборы, имя варианта). При разборе вопросов «почему в отчете такие цифры» это экономит значительное время.
ПЗ
Практическое замечание

FAQ

Как узнать ключ варианта отчета?

Откройте справочник «Варианты отчетов» (в типовых — через «Все функции») и посмотрите реквизит «Ключ варианта» у нужного элемента. Для предопределенных вариантов ключ задается в схеме компоновки на закладке «Варианты настроек»; если он не заполнен, используется имя варианта.

Можно ли программно получить вариант, который пользователь сохранил «только для себя»?

Да, но только если код выполняется с правами, позволяющими читать чужие варианты. В справочнике «Варианты отчетов» есть реквизит автора и признак видимости — добавьте в запрос отбор по автору или снимите ограничение видимости, если это допустимо по политике доступа.

Как сформировать отчет сразу в файл Excel или PDF?

Сформируйте результат в табличный документ, затем вызовите метод Записать с нужным типом файла: ТипФайлаТабличногоДокумента.XLSX или PDF. Убедитесь, что у процесса сервера есть права на запись в целевой каталог.

Почему программно сформированный отчет отличается от интерактивного?

Чаще всего не установлены параметры, которые в форме заполняются автоматически: период, организация, функциональные опции. Загрузите настройки варианта в компоновщик и явно пройдитесь по всем параметрам данных, установив значения и флаг Использование.

Как получить вариант внешнего отчета, подключенного через «Дополнительные отчеты и обработки»?

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

Работает ли этот подход в тонком и веб-клиенте?

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