Передача параметров из формы в СхемаКомпоновкиДанных (СКД) — это классическая задача при разработке отчетов в управляемых формах 1С. Часто разработчики сталкиваются с тем, что стандартные механизмы на клиенте не срабатывают или настройки сбрасываются. Давайте подробно разберем, как реализовать этот процесс надежно и эффективно.
Первое и самое важное правило: в модуле объекта на сервере (например, в процедуре ПриКомпоновкеРезультата) не доступны РеквизитыФормы. Модуль объекта «видит» только свои собственные РеквизитыОбъекта. Поэтому, чтобы передать данные с формы в процедуру формирования СКД, необходимо сначала сохранить их в реквизитах самого отчета.
Ссылка, ПериодРегистрации).Это наиболее стабильный подход. Мы переносим логику установки параметров в процедуру ПриКомпоновкеРезультата модуля объекта. В этот момент компоновщик уже инициализирован, и мы можем безопасно вмешаться в процесс.
Рассмотрим пример кода для модуля объекта:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Получаем текущие настройки компоновщика
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// Перебираем параметры и устанавливаем нужные значения
Для Каждого ПараметрДанных Из Настройки.ПараметрыДанных.Элементы Цикл
Если ПараметрДанных.Параметр = Новый ПараметрКомпоновкиДанных("Ссылка") Тогда
ПараметрДанных.Использование = Истина;
ПараметрДанных.Значение = ЭтотОбъект.Ссылка;
КонецЕсли;
Если ПараметрДанных.Параметр = Новый ПараметрКомпоновкиДанных("Месяц") Тогда
ПараметрДанных.Использование = Истина;
ПараметрДанных.Значение = ЭтотОбъект.Месяц;
КонецЕсли;
КонецЦикла;
// Загружаем измененные настройки обратно
КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
КонецПроцедуры
Если в вашем отчете пользователи могут сохранять свои варианты настроек, прямое изменение ПараметрыДанных может привести к тому, что пользовательские изменения будут «затираться». Более профессиональный подход — использование коллекции ПользовательскиеНастройки.
Для реализации этого метода можно использовать вспомогательную функцию для поиска параметра по имени:
Функция ПолучитьПользовательскийПараметр(ИмяПараметра, КомпоновщикНастроек)
НайденныйПараметрВарианта = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(ИмяПараметра);
Если НайденныйПараметрВарианта <> Неопределено Тогда
Возврат КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(
НайденныйПараметрВарианта.ИдентификаторПользовательскойНастройки);
КонецЕсли;
Возврат Неопределено;
КонецФункции
Используя этот метод, вы точечно меняете только значение параметра, не затрагивая остальные настройки отчета. Для настройки связи между отдельными полями ввода формы и СКД можно использовать механизм стыковки элементов управляемой формы с пользовательскими настройками.
Если вы формируете отчет программно (например, передаете таблицу значений в СКД), важно правильно инициализировать процесс, чтобы не потерять настройки пользователя. Рассмотрим пошаговый алгоритм:
Шаг 1: Получите настройки из текущего КомпоновщикНастроек, а не из СхемаКомпоновкиДанных.НастройкиПоУмолчанию.
Шаг 2: Создайте КомпоновщикМакета и выполните компоновку:
СхемаСКД = ПолучитьМакет("СхемаСКД");
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаСКД, Настройки, ДанныеРасшифровки);
Шаг 3: Передайте внешние данные через ПроцессорКомпоновкиДанных и выведите результат. Этот метод гарантирует, что настройки, сохраненные пользователем, будут корректно применены к сформированному отчету.
Чтобы успешно передавать параметры в СКД:
ПриКомпоновкеРезультата — это самое безопасное место в жизненном цикле формирования отчета.КомпоновщикНастроек.ПользовательскиеНастройки, чтобы не сбрасывать выбор пользователя.Следуя этим правилам, вы сделаете свой код устойчивым, а отчеты — удобными для конечных пользователей.