Почему параметр ЗначенияЗаполнения не заполняет реквизит отчета при открытии формы в 1С и как это исправить

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

При разработке в управляемом интерфейсе 1С часто возникает необходимость открыть форму отчета из другого объекта (например, из формы справочника или списка) и передать в нее контекст — ссылку на текущего контрагента, организацию или период. Многие разработчики пытаются использовать для этого стандартный параметр ЗначенияЗаполнения, передавая его в структуре параметров вызова ОткрытьФорму(), однако сталкиваются с тем, что реквизиты отчета остаются пустыми.

Рассмотрим подробно, почему возникает такая ситуация и какими способами можно правильно передать и применить данные при открытии формы отчета.

Причина поведения платформы 1С

Выясним причину, по которой штатный механизм не срабатывает для отчетов так же, как для справочников или документов:

  1. Предназначение системного параметра: Параметр ЗначенияЗаполнения автоматически обрабатывается платформой 1С только при создании новых объектов конфигурации (элементов справочников, документов, записей регистров сведений и т. д.).
  2. Отсутствие автоматической связи: В отчетах и обработках системное событие ОбработкаЗаполнения отсутствует. Платформа 1С передает структуру ЗначенияЗаполнения в коллекцию Параметры открываемой формы, но не выполняет автоматическую привязку этих значений к реквизитам отчета или управляемой формы.

Решение 1. Программная обработка параметра в форме отчета

Разберем основной и самый простой способ решения проблемы. Если данные передаются через структуру ЗначенияЗаполнения, их нужно вручную прочитать на сервере при создании формы отчета.

Посмотрим на пример вызова формы из клиенского кода:


&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    
    ПараметрыФормы = Новый Структура;
    
    ПараметрыЗаполнения = Новый Структура;
    ПараметрыЗаполнения.Вставить("КонтрагентСсылка", ПараметрКоманды);
    
    ПараметрыФормы.Вставить("ЗначенияЗаполнения", ПараметрыЗаполнения);
    
    ОткрытьФорму("Отчет.кт_КарточкаКонтрагента.Форма.ФормаОтчета", ПараметрыФормы);
    
КонецПроцедуры

Теперь проанализируем, как обработать переданную структуру в модуле открываемой формы отчета в процедуре ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Если реквизит принадлежит объекту "Отчет"
    ЗаполнитьЗначенияСвойств(Отчет, Параметры.ЗначенияЗаполнения);
    
    // Если реквизит создан непосредственно в самой форме
    ЗаполнитьЗначенияСвойств(ЭтотОбъект, Параметры.ЗначенияЗаполнения);
    
КонецПроцедуры

Функция ЗаполнитьЗначенияСвойств() находит совпадения ключевых имен в структуре Параметры.ЗначенияЗаполнения и реквизитах объекта или формы и выполняет подстановку значений.

Решение 2. Передача явных параметров формы

Рассмотрим альтернативный вариант без использования ЗначенияЗаполнения, который считается более наглядным при разработке отчетов.

  1. В конфигураторе откроем форму отчета и перейдем на вкладку «Параметры».
  2. Создадим новый параметр формы, например КонтрагентСсылка.
  3. При открытии формы передадим значение напрямую:

ПараметрыФормы = Новый Структура("КонтрагентСсылка", ПараметрКоманды);
ОткрытьФорму("Отчет.кт_КарточкаКонтрагента.Форма.ФормаОтчета", ПараметрыФормы);

В модуле формы отчета считаем переданный параметр:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Если Параметры.Свойство("КонтрагентСсылка") Тогда
        Отчет.КонтрагентСсылка = Параметры.КонтрагентСсылка;
    КонецЕсли;
    
КонецПроцедуры

Решение 3. Передача отбора для отчетов на базе СКД

Если отчет разработан с использованием Схемы компоновки данных (СКД), то вместо реквизитов объекта чаще всего требуется установить отбор в настройках компоновки.

Проанализируем пример использования системного параметра Отбор:


ПараметрыОтбора = Новый Структура("Контрагент", ПараметрКоманды);
ПараметрыФормы = Новый Структура("Отбор", ПараметрыОтбора);

ОткрытьФорму("Отчет.кт_КарточкаКонтрагента.Форма.ФормаОтчета", ПараметрыФормы);

При таком подходе платформа 1С автоматически найдет нужное поле в пользовательских настройках отбора отчета и подставит переданное значение.

Таким образом, мы разобрали, почему стандартный автоподбор не работает для форм отчетов, и рассмотрели надежные способы передачи значений для различных сценариев разработки.

← На главную