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

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

В процессе разработки внешних отчетов на управляемых формах часто возникает задача передачи пользовательского выбора из формы непосредственно в логику формирования отчета, которая находится в модуле объекта. Многих разработчиков вводит в заблуждение работа метода РеквизитФормыВЗначение. Давайте разберемся, почему попытки «записать» данные напрямую в реквизиты объекта часто заканчиваются неудачей и как сделать это правильно.

Почему возникают сложности с передачей данных?

Основная причина кроется в архитектуре управляемого приложения. Когда мы вызываем РеквизитФормыВЗначение("Отчет"), платформа создает временную копию объекта на сервере. Все изменения, которые мы вносим в эту копию, остаются внутри нее. При завершении процедуры эта временная копия уничтожается, а реальный экземпляр объекта, который запускается системой в момент формирования, о ваших изменениях ничего не знает.

Попытки передать данные через переменные модуля объекта, объявленные с ключевым словом Экспорт, или запись в «самодельные» реквизиты объекта часто приводят к тому, что в процедуре ПриКомпоновкеРезультата мы видим пустые значения. Это происходит потому, что контекст выполнения формы и контекст выполнения отчета — это два изолированных процесса.

Решение 1: Использование дополнительных свойств компоновщика настроек

Самым надежным и архитектурно верным способом для отчетов на базе СКД является использование ДополнительныеСвойства компоновщика настроек. Этот механизм специально создан для передачи произвольных данных из формы в процесс выполнения отчета.

Рассмотрим, как реализовать этот подход. На стороне формы, после того как пользователь выбрал значение, мы должны поместить его в настройки компоновщика:


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

Теперь это значение гарантированно попадет в модуль объекта. Внутри модуля объекта, в процедуре ПриКомпоновкеРезультата (или любой другой), мы можем легко получить переданные данные:


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

КонецПроцедуры

Решение 2: Использование параметров схемы компоновки данных

Если передаваемое значение должно напрямую влиять на запрос отчета, лучше использовать механизм параметров СКД. Это более «чистый» способ, так как он задействует встроенные возможности платформы.

  1. В схеме компоновки данных (СКД) добавьте новый параметр.
  2. Установите для него галочку «Включать в доступные параметры» и «Ограничение доступности» (если пользователь не должен менять его вручную).
  3. В модуле формы установите значение этого параметра перед формированием отчета:

// В модуле формы
Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ИмяПараметраСКД", РезультатВыбора.Значение);

После этого параметр автоматически станет доступен в запросе СКД, и система сама позаботится о его передаче в модуль объекта.

Важные советы по разработке

При работе с данными формы и объекта всегда помните о следующих правилах:

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

← На главную