В процессе разработки расширений или доработки типовых конфигураций (УТ 11, ERP, УНФ) часто возникает задача: программно открыть отчет, который зарегистрирован в справочнике Дополнительные отчеты и обработки. Ситуация осложняется, если у отчета нет собственной формы (используется автогенерируемая), а нам необходимо передать в него определенные параметры, такие как НачалоПериода и КонецПериода, и сразу сформировать результат.
Рассмотрим по шагам, как решить эту задачу, проанализируем типичные ошибки и разберем наиболее эффективные методы работы с системой компоновки данных (СКД) и библиотекой стандартных подсистем (БСП).
Даже если в метаданных внешнего отчета отсутствует форма, платформа 1С способна создать её автоматически при вызове метода ОткрытьФорму. Однако, чтобы параметры применились корректно, нам нужно перехватить КомпоновщикНастроек этой формы (изучите применение отбора к тексту запроса) до того, как отчет будет выведен на экран.
Разберем рабочий алгоритм, который позволяет подключить внешнюю обработку, получить её форму и заполнить пользовательские настройки:
&НаКлиенте
Процедура ОткрытьВнешнийОтчетСПараметрами(Команда)
// 1. Получаем ссылку на элемент справочника Доп. отчеты
СсылкаНаВнешнийОтчет = ПолучитьСсылкуНаОтчетНаСервере("МойОтчет");
// 2. Подключаем внешний отчет через механизмы БСП
ИмяОбработкиСлужебное = ДополнительныеОтчетыИОбработкиВызовСервера.ПодключитьВнешнююОбработку(СсылкаНаВнешнийОтчет);
// 3. Подготавливаем параметры открытия формы
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("КлючВарианта", "Основной");
ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
// 4. Получаем форму (даже если её нет в макетах, будет создана автоформа)
ИмяФормы = "ВнешнийОтчет." + ИмяОбработкиСлужебное + ".Форма";
ФормаОтчета = ПолучитьФорму(ИмяФормы, ПараметрыФормы);
// 5. Устанавливаем параметры в компоновщик настроек формы
НастроитьПараметрыНаСервере(ФормаОтчета.Отчет.КомпоновщикНастроек);
// 6. Открываем настроенную форму
ФормаОтчета.Открыть();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура НастроитьПараметрыНаСервере(КомпоновщикНастроек)
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// Устанавливаем значения параметров
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачПериода", НачалоДня(ТекущаяДата()));
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("КонПериода", КонецДня(ТекущаяДата()));
// Важно загрузить настройки обратно и обновить пользовательские настройки
КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
КонецПроцедуры
Важный нюанс: Обратите внимание, что параметры должны быть включены в состав пользовательских настроек в самой схеме СКД (флаг "Включать в пользовательские настройки"). Если этого не сделать, передача через ПользовательскиеНастройки может не сработать.
В современных конфигурациях (например, УНФ 3.0 или последние версии ERP) названия методов в общем модуле ДополнительныеОтчетыИОбработкиВызовСервера могут отличаться. Рассмотрим, как программно получить объект отчета для манипуляций с его настройками.
Проанализируем разницу в вызовах:
ПолучитьОбъектВнешнейОбработки.ОбъектВнешнейОбработки.Пример получения настроек напрямую из объекта без предварительного открытия формы:
&НаСервереБезКонтекста
Функция ПолучитьПользовательскиеНастройки(СсылкаНаОтчет)
// Используем актуальный метод для вашей версии БСП
ОбъектОтчета = ДополнительныеОтчетыИОбработкиВызовСервера.ОбъектВнешнейОбработки(СсылкаНаОтчет);
КМ = ОбъектОтчета.КомпоновщикНастроек;
Настройки = КМ.ПолучитьНастройки();
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ДатаОтчета", ТекущаяДата());
КМ.ЗагрузитьНастройки(Настройки);
Возврат КМ.ПользовательскиеНастройки;
КонецФункции
Если нам нужно гарантировать, что пользователь не сможет изменить переданные параметры или если мы хотим объединить наши программные установки с настройками по умолчанию, рекомендуется использовать ключ ФиксированныеНастройки в параметрах формы.
Проанализируем этот подход. Вместо того чтобы вручную лезть в ПользовательскиеНастройки, мы создаем объект НастройкиКомпоновкиДанных, заполняем его и передаем при открытии. Платформа самостоятельно объединит их с текущими настройками отчета.
Выясним основные причины, по которым код может работать "вхолостую":
ИдентификаторуПользовательскойНастройки. Именно поэтому в коде выше мы сначала делаем ПолучитьНастройки(), а потом ЗагрузитьНастройки() — это сохраняет связь ID.ПользовательскиеНастройки на форме.КлючВарианта, убедитесь, что настройки устанавливаются именно для этого варианта. При смене варианта настройки могут сброситься к дефолтным.Если стоит задача не просто открыть отчет, но и вернуть из него данные в форму документа (например, заполнить табличную часть), нам необходимо передать ВладелецФормы.
При открытии формы укажите владельца:
ОткрытьФорму(ИмяФормы, ПараметрыФормы, ЭтаФорма);
В самом внешнем отчете (например, в модуле объекта в процедуре ПриКомпоновкеРезультата) вы сможете обратиться к владельцу, если форма была инициализирована. Однако, поскольку у нас "отчет без формы", для возврата данных лучше использовать Оповещения. После формирования данных в отчете вызовите Оповестить("ЗаполнитьДанныеИзОтчета", РезультатТЗ);, а в форме документа подпишитесь на это событие в обработчике ОбработкаОповещения.
Не стоит забывать, что в БСП существует высокоуровневый метод для открытия вариантов отчетов, который берет на себя часть рутины:
ДополнительныеОтчетыИОбработкиКлиент.ОткрытьВариантДополнительногоОтчета(Ссылка, КлючВарианта).
Этот метод удобен, если вам не требуется сложная предварительная установка параметров, а нужно просто запустить конкретный вариант отчета из справочника.
Подводя итог, наиболее надежным способом для отчета без формы является связка: ПодключитьВнешнююОбработку -> ПолучитьФорму -> ЗагрузитьНастройки в Компоновщик этой формы -> Открыть. Это гарантирует, что визуальное представление отчета будет полностью соответствовать программно заданным условиям.