При автоматизации рабочих мест часто возникает задача открыть определенный отчет не с базовыми настройками схемы компоновки данных (СКД), а с заранее подготовленным вариантом, который настроен пользователями или аналитиками и сохранен как общий. Разберем, как правильно реализовать такое открытие в управляемом приложении, какие механизмы предоставляет библиотека стандартных подсистем (БСП) и платформа 1С:Предприятие, а также каких ошибок следует избегать.
Для начала разграничим два понятия платформы, которые часто путают:
Справочник.ВариантыОтчетов (в конфигурациях на базе БСП).Рассмотрим распространенный подход, когда разработчик получает форму через ПолучитьФорму(), а затем пытается вызвать метод УстановитьТекущийВариант(). На управляемых формах такой способ приводит к скрытым проблемам:
ПолучитьФорму() серверный обработчик ПриСозданииНаСервере выполняется с вариантом по умолчанию.УстановитьТекущийВариант() инициирует повторное обращение к серверу для перезагрузки структуры схемы компоновки данных.Штатным и рекомендованным стандартом разработки 1С является передача всех управляющих параметров непосредственно в процедуру ОткрытьФорму().
В большинстве современных типовых решений (1С:ERP, КА, УТ, УНФ, БП) варианты отчетов регистрируются в справочнике ВариантыОтчетов. Пользовательский вариант, сохраненный «для всех», физически представляет собой элемент этого справочника.
Для открытия формы отчета по конкретной ссылке на вариант используем методы БСП. Посмотрим на пример вызова на клиенте:
&НаКлиенте
Процедура ОткрытьПользовательскийОтчет(Команда)
// Получаем ссылку на вариант отчета из константы или настроек
ВариантСсылка = ПолучитьСсылкуНаВариант();
Если ЗначениеЗаполнено(ВариантСсылка) Тогда
ВариантыОтчетовКлиент.ОткрытьФормуОтчета(ЭтотОбъект, ВариантСсылка);
Иначе
ПоказатьПредупреждение(, НСтр("ru = 'Вариант отчета не найден!'"));
КонецЕсли;
КонецПроцедуры
Если вызов подсистемных методов БСП по какой-то причине недоступен, мы можем открыть форму штатной процедурой платформы ОткрытьФорму(), передав ссылку на вариант отчета в качестве параметра Ключ:
&НаКлиенте
Процедура ОткрытьФормуЧерезКлюч(Команда)
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("Ключ", ВариантСсылка);
ПараметрыОткрытия.Вставить("СформироватьПриОткрытии", Истина);
ОткрытьФорму("Отчет.Запасы.Форма", ПараметрыОткрытия);
КонецПроцедуры
Платформа 1С:Предприятие 8.3 поддерживает ряд зарезервированных параметров формы отчета. Если нам известен ключ варианта (строковый идентификатор предопределенного варианта или строковое представление GUID пользовательского варианта), мы можем передать его в параметре КлючВарианта.
Разберем пример открытия типового отчета с автоматическим формированием результата:
&НаКлиенте
Процедура ОткрытьОтчетПоКлючуВарианта(Команда)
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("КлючВарианта", СтрокаGUIDВарианта);
ПараметрыОткрытия.Вставить("СформироватьПриОткрытии", Истина);
// При необходимости передаем пользовательские настройки
// ПараметрыОткрытия.Вставить("ПользовательскиеНастройки", МоиПользовательскиеНастройки);
ОткрытьФорму("Отчет.Запасы.Форма", ПараметрыОткрытия);
КонецПроцедуры
Проанализируем важные нюансы, с которыми сталкиваются разработчики при программной работе с отчетами:
(STL) Отчет для бухгалтера, добавить пробел или пометить его на удаление. В результате поиск по строке вернет пустую ссылку, и логика программы нарушится. Храните ссылку на нужный элемент справочника ВариантыОтчетов в отдельной константе, в дополнительных реквизитах или регистре сведений.Отбор, платформа перенесет их в категорию ФиксированныеНастройки компоновщика. В этом случае пользователь не сможет отредактировать их прямо на форме отчета. Если требуется дать пользователю возможность менять значения, фильтры нужно передавать в коллекцию ПользовательскиеНастройки.Если цель состоит не в интерактивном просмотре отчета пользователем, а в получении готовых данных (например, для выгрузки в файл или отправки по почте), открывать форму не требуется вовсе. В таком случае загружаем настройки непосредственно в схему компоновки на сервере:
&НаСервере
Функция СформироватьОтчетВТабличныйДокумент(ИмяОтчета, ВариантСсылка)
ТабличныйДокумент = Новый ТабличныйДокумент;
ОтчетОбъект = Отчеты[ИмяОтчета].Создать();
Схема = ОтчетОбъект.СхемаКомпоновкиДанных;
// Загружаем настройки выбранного варианта
// Если вариант хранится в БСП:
НастройкиВарианта = ВариантСсылка.Настройки.Получить();
Если НастройкиВарианта <> Неопределено Тогда
ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиВарианта);
КонецЕсли;
ОтчетОбъект.СкомпоноватьРезультат(ТабличныйДокумент);
Возврат ТабличныйДокумент;
КонецФункции
Таким образом, для открытия типовых отчетов в интерфейсе наиболее надежным решением является вызов через БСП с передачей ссылки на вариант из константы, либо использование стандартного параметра КлючВарианта в процедуре ОткрытьФорму().