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