Как передать параметры и контекстные отборы во внешний отчет в 1С:УНФ

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

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

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

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

Выясним основные причины отсутствия данных:

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

Шаг 1. Настройка взаимодействия через ОпределитьНастройкиФормы

Первым делом нам необходимо зайти в модуль объекта вашего внешнего отчета. Для того чтобы универсальная форма отчета БСП начала взаимодействовать с вашим отчетом, нужно объявить экспортную процедуру ОпределитьНастройкиФормы. Рассмотрим пример кода, который должен быть в модуле:


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

Устанавливая эти флаги в значение Истина, мы даем системе сигнал: «При создании формы и загрузке настроек загляни в модуль объекта этого отчета и выполни там соответствующие процедуры».

Шаг 2. Перехват параметров в ПриСозданииНаСервере

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

Проанализируем пример реализации:


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

    // Обязательно синхронизируем данные объекта с данными формы
    ЗначениеВДанныеФормы(ЭтотОбъект, Форма.Отчет);
    
КонецПроцедуры

В этом коде мы переносим значения из параметров формы непосредственно в КомпоновщикНастроек отчета. Метод ЗначениеВДанныеФормы необходим для того, чтобы изменения, внесенные в ЭтотОбъект (модуль объекта), отразились на интерфейсе формы.

Шаг 3. Работа с компоновкой результата

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

Рассмотрим следующий пример кода в модуле объекта:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Получаем текущие настройки из компоновщика
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    // Попробуем найти параметр "Контрагент"
    ПараметрКонтрагент = Настройки.ПараметрыДанных.Элементы.Найти("Контрагент");
    
    Если ПараметрКонтрагент <> Неопределено Тогда
        // Если параметр пуст, но мы знаем, что он должен быть заполнен, 
        // здесь можно прописать логику его получения или проверки
        Если Не ЗначениеЗаполнено(ПараметрКонтрагент.Значение) Тогда
            // Логика установки значения по умолчанию
        КонецЕсли;
    КонецЕсли;
    
    // Если мы хотим полностью управлять процессом вывода:
    // СтандартнаяОбработка = Ложь;
    // ... далее ручной запуск процессора компоновки и вывода
    
КонецПроцедуры

Шаг 4. Важность уникального имени и регистрации

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

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

Резюме по шагам

Чтобы ваш отчет в УНФ работал корректно и принимал параметры, выполните следующие действия:

  1. В модуле объекта создайте экспортную процедуру ОпределитьНастройкиФормы и разрешите события ПриСозданииНаСервере и ПередЗагрузкойНастроекВКомпоновщик.
  2. Проверьте имена параметров в СКД. Они должны соответствовать именам полей в конфигурации (например, поле Контрагент должно называться именно так, а не Покупатель, если вы ожидаете автоматический подхват из карточки).
  3. Используйте процедуру ПриСозданииНаСервере в модуле объекта для ручного разбора структуры Форма.Параметры, если автоматика не срабатывает.
  4. Убедитесь, что вы изменили Имя отчета в свойствах объекта, чтобы избежать конфликтов с кэшем настроек.
  5. При использовании СтандартнаяОбработка = Ложь в ПриКомпоновкеРезультата, не забудьте самостоятельно инициализировать ПроцессорКомпоновкиДанных и вывести результат в ДокументРезультат.

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

← На главную