Как программно открыть типовой отчет с пользовательскими настройками или сохраненным вариантом в 1С?

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

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

Понятие варианта отчета и пользовательских настроек

Для начала разграничим два понятия платформы, которые часто путают:

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

Почему вызов через ПолучитьФорму() на клиенте нежелателен

Рассмотрим распространенный подход, когда разработчик получает форму через ПолучитьФорму(), а затем пытается вызвать метод УстановитьТекущийВариант(). На управляемых формах такой способ приводит к скрытым проблемам:

  1. При выполнении ПолучитьФорму() серверный обработчик ПриСозданииНаСервере выполняется с вариантом по умолчанию.
  2. Последующий вызов УстановитьТекущийВариант() инициирует повторное обращение к серверу для перезагрузки структуры схемы компоновки данных.
  3. Это создает лишнюю нагрузку и нередко приводит к сбросу переданных параметров.

Штатным и рекомендованным стандартом разработки 1С является передача всех управляющих параметров непосредственно в процедуру ОткрытьФорму().

Способ 1. Использование подсистемы БСП «Варианты отчетов»

В большинстве современных типовых решений (1С:ERP, КА, УТ, УНФ, БП) варианты отчетов регистрируются в справочнике ВариантыОтчетов. Пользовательский вариант, сохраненный «для всех», физически представляет собой элемент этого справочника.

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


&НаКлиенте
Процедура ОткрытьПользовательскийОтчет(Команда)
    
    // Получаем ссылку на вариант отчета из константы или настроек
    ВариантСсылка = ПолучитьСсылкуНаВариант();
    
    Если ЗначениеЗаполнено(ВариантСсылка) Тогда
        ВариантыОтчетовКлиент.ОткрытьФормуОтчета(ЭтотОбъект, ВариантСсылка);
    Иначе
        ПоказатьПредупреждение(, НСтр("ru = 'Вариант отчета не найден!'"));
    КонецЕсли;

КонецПроцедуры

Если вызов подсистемных методов БСП по какой-то причине недоступен, мы можем открыть форму штатной процедурой платформы ОткрытьФорму(), передав ссылку на вариант отчета в качестве параметра Ключ:


&НаКлиенте
Процедура ОткрытьФормуЧерезКлюч(Команда)

    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("Ключ", ВариантСсылка);
    ПараметрыОткрытия.Вставить("СформироватьПриОткрытии", Истина);
    
    ОткрытьФорму("Отчет.Запасы.Форма", ПараметрыОткрытия);

КонецПроцедуры

Способ 2. Открытие через стандартные параметры управляемой формы отчета

Платформа 1С:Предприятие 8.3 поддерживает ряд зарезервированных параметров формы отчета. Если нам известен ключ варианта (строковый идентификатор предопределенного варианта или строковое представление GUID пользовательского варианта), мы можем передать его в параметре КлючВарианта.

Разберем пример открытия типового отчета с автоматическим формированием результата:


&НаКлиенте
Процедура ОткрытьОтчетПоКлючуВарианта(Команда)

    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("КлючВарианта", СтрокаGUIDВарианта);
    ПараметрыОткрытия.Вставить("СформироватьПриОткрытии", Истина);
    
    // При необходимости передаем пользовательские настройки
    // ПараметрыОткрытия.Вставить("ПользовательскиеНастройки", МоиПользовательскиеНастройки);
    
    ОткрытьФорму("Отчет.Запасы.Форма", ПараметрыОткрытия);

КонецПроцедуры

Подводные камни и рекомендации по хранению настроек

Проанализируем важные нюансы, с которыми сталкиваются разработчики при программной работе с отчетами:

  1. Не ищите вариант по наименованию в коде. Пользователи с полными правами могут легко переименовать вариант (STL) Отчет для бухгалтера, добавить пробел или пометить его на удаление. В результате поиск по строке вернет пустую ссылку, и логика программы нарушится. Храните ссылку на нужный элемент справочника ВариантыОтчетов в отдельной константе, в дополнительных реквизитах или регистре сведений.
  2. Ограничения прав доступа (RLS). Пользовательские варианты отчетов подчиняются правам доступа. Если вариант сохранен для всех, но у пользователя нет прав на чтение конкретного отчета или раздела, вызов процедуры открытия приведет к ошибке нарушения прав. Предусматривайте проверку прав перед вызовом.
  3. Конфликт отборов формы и пользовательских настроек. Если передать отборы в форму через параметр Отбор, платформа перенесет их в категорию ФиксированныеНастройки компоновщика. В этом случае пользователь не сможет отредактировать их прямо на форме отчета. Если требуется дать пользователю возможность менять значения, фильтры нужно передавать в коллекцию ПользовательскиеНастройки.

Альтернативный вариант: формирование отчета на сервере без открытия формы

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


&НаСервере
Функция СформироватьОтчетВТабличныйДокумент(ИмяОтчета, ВариантСсылка)

    ТабличныйДокумент = Новый ТабличныйДокумент;
    
    ОтчетОбъект = Отчеты[ИмяОтчета].Создать();
    Схема = ОтчетОбъект.СхемаКомпоновкиДанных;
    
    // Загружаем настройки выбранного варианта
    // Если вариант хранится в БСП:
    НастройкиВарианта = ВариантСсылка.Настройки.Получить();
    Если НастройкиВарианта <> Неопределено Тогда
        ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиВарианта);
    КонецЕсли;
    
    ОтчетОбъект.СкомпоноватьРезультат(ТабличныйДокумент);
    
    Возврат ТабличныйДокумент;

КонецФункции

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

← На главную