Как правильно передать параметры в СКД из формы внешнего отчета в управляемом приложении?

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

Передача параметров из формы в СхемаКомпоновкиДанных (СКД) — это классическая задача при разработке отчетов в управляемых формах 1С. Часто разработчики сталкиваются с тем, что стандартные механизмы на клиенте не срабатывают или настройки сбрасываются. Давайте подробно разберем, как реализовать этот процесс надежно и эффективно.

Понимание архитектуры: реквизиты формы против реквизитов объекта

Первое и самое важное правило: в модуле объекта на сервере (например, в процедуре ПриКомпоновкеРезультата) не доступны РеквизитыФормы. Модуль объекта «видит» только свои собственные РеквизитыОбъекта. Поэтому, чтобы передать данные с формы в процедуру формирования СКД, необходимо сначала сохранить их в реквизитах самого отчета.

  1. Создайте реквизиты непосредственно в дереве метаданных вашего внешнего отчета (например, Ссылка, ПериодРегистрации).
  2. При открытии формы или нажатии кнопки «Сформировать» присваивайте значения из элементов формы этим реквизитам отчета.

Вариант 1: Установка параметров в модуле объекта

Это наиболее стабильный подход. Мы переносим логику установки параметров в процедуру ПриКомпоновкеРезультата модуля объекта. В этот момент компоновщик уже инициализирован, и мы можем безопасно вмешаться в процесс.

Рассмотрим пример кода для модуля объекта:


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

Вариант 2: Работа с пользовательскими настройками

Если в вашем отчете пользователи могут сохранять свои варианты настроек, прямое изменение ПараметрыДанных может привести к тому, что пользовательские изменения будут «затираться». Более профессиональный подход — использование коллекции ПользовательскиеНастройки.

Для реализации этого метода можно использовать вспомогательную функцию для поиска параметра по имени:


Функция ПолучитьПользовательскийПараметр(ИмяПараметра, КомпоновщикНастроек)
    НайденныйПараметрВарианта = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(ИмяПараметра);
    Если НайденныйПараметрВарианта <> Неопределено Тогда
        Возврат КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(
            НайденныйПараметрВарианта.ИдентификаторПользовательскойНастройки);
    КонецЕсли;
    Возврат Неопределено;
КонецФункции

Используя этот метод, вы точечно меняете только значение параметра, не затрагивая остальные настройки отчета. Для настройки связи между отдельными полями ввода формы и СКД можно использовать механизм стыковки элементов управляемой формы с пользовательскими настройками.

Вариант 3: Программное формирование отчета «с нуля»

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

Шаг 1: Получите настройки из текущего КомпоновщикНастроек, а не из СхемаКомпоновкиДанных.НастройкиПоУмолчанию.

Шаг 2: Создайте КомпоновщикМакета и выполните компоновку:


СхемаСКД = ПолучитьМакет("СхемаСКД");
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаСКД, Настройки, ДанныеРасшифровки);

Шаг 3: Передайте внешние данные через ПроцессорКомпоновкиДанных и выведите результат. Этот метод гарантирует, что настройки, сохраненные пользователем, будут корректно применены к сформированному отчету.

Подведем итоги

Чтобы успешно передавать параметры в СКД:

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

← На главную