Как программно открыть внешний отчет СКД без формы и передать в него параметры?

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

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

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

Метод 1. Программное получение формы и настройка компоновщика

Даже если в метаданных внешнего отчета отсутствует форма, платформа 1С способна создать её автоматически при вызове метода ОткрытьФорму. Однако, чтобы параметры применились корректно, нам нужно перехватить КомпоновщикНастроек этой формы (изучите применение отбора к тексту запроса) до того, как отчет будет выведен на экран.

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


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

&НаСервереБезКонтекста
Процедура НастроитьПараметрыНаСервере(КомпоновщикНастроек)
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    // Устанавливаем значения параметров
    Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачПериода", НачалоДня(ТекущаяДата()));
    Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("КонПериода", КонецДня(ТекущаяДата()));
    
    // Важно загрузить настройки обратно и обновить пользовательские настройки
    КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
КонецПроцедуры

Важный нюанс: Обратите внимание, что параметры должны быть включены в состав пользовательских настроек в самой схеме СКД (флаг "Включать в пользовательские настройки"). Если этого не сделать, передача через ПользовательскиеНастройки может не сработать.

Метод 2. Использование механизмов БСП для получения объекта

В современных конфигурациях (например, УНФ 3.0 или последние версии ERP) названия методов в общем модуле ДополнительныеОтчетыИОбработкиВызовСервера могут отличаться. Рассмотрим, как программно получить объект отчета для манипуляций с его настройками.

Проанализируем разницу в вызовах:

  1. В УТ 11 и ERP чаще используется метод ПолучитьОбъектВнешнейОбработки.
  2. В УНФ этот метод переименован в ОбъектВнешнейОбработки.

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


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

Метод 3. Передача через «Фиксированные настройки»

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

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

Почему параметры могут не заполняться?

Выясним основные причины, по которым код может работать "вхолостую":

  1. Несовпадение идентификаторов: Платформа сопоставляет параметры в пользовательских настройках не по имени, а по внутреннему ИдентификаторуПользовательскойНастройки. Именно поэтому в коде выше мы сначала делаем ПолучитьНастройки(), а потом ЗагрузитьНастройки() — это сохраняет связь ID.
  2. Галка в СКД: Как уже упоминалось, если параметр не выведен в пользовательские настройки в схеме (маленькая иконка "человечка" в конструкторе СКД), он не будет виден в коллекции ПользовательскиеНастройки на форме.
  3. Кэширование вариантов: Если вы передаете КлючВарианта, убедитесь, что настройки устанавливаются именно для этого варианта. При смене варианта настройки могут сброситься к дефолтным.

Решение для передачи данных обратно (Владелец формы)

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

При открытии формы укажите владельца:


ОткрытьФорму(ИмяФормы, ПараметрыФормы, ЭтаФорма);

В самом внешнем отчете (например, в модуле объекта в процедуре ПриКомпоновкеРезультата) вы сможете обратиться к владельцу, если форма была инициализирована. Однако, поскольку у нас "отчет без формы", для возврата данных лучше использовать Оповещения. После формирования данных в отчете вызовите Оповестить("ЗаполнитьДанныеИзОтчета", РезультатТЗ);, а в форме документа подпишитесь на это событие в обработчике ОбработкаОповещения.

Типовой метод БСП

Не стоит забывать, что в БСП существует высокоуровневый метод для открытия вариантов отчетов, который берет на себя часть рутины:

ДополнительныеОтчетыИОбработкиКлиент.ОткрытьВариантДополнительногоОтчета(Ссылка, КлючВарианта).

Этот метод удобен, если вам не требуется сложная предварительная установка параметров, а нужно просто запустить конкретный вариант отчета из справочника.

Подводя итог, наиболее надежным способом для отчета без формы является связка: ПодключитьВнешнююОбработку -> ПолучитьФорму -> ЗагрузитьНастройки в Компоновщик этой формы -> Открыть. Это гарантирует, что визуальное представление отчета будет полностью соответствовать программно заданным условиям.

← На главную