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