Почему реквизит отчета очищается или остается пустым при формировании в управляемых формах?

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

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

Причины возникновения проблемы

Проанализируем архитектуру управляемого приложения и выясним, из-за чего модуль объекта теряет установленные на форме значения:

  1. Разделение контекстов формы и прикладного объекта. В управляемом приложении форма не работает с объектом конфигурации напрямую. На клиенте и сервере формы существует структура данных формы — обычно это основной реквизит Отчет типа ДанныеФормыСтруктура. Если реквизит создан на уровне формы, а не внутри объекта отчета, модуль объекта ОтчетОбъект ничего о нем не знает.
  2. Неверная привязка свойства «ПутьКДанным». Если реквизит был добавлен в метаданные самого отчета уже после создания управляемой формы, поле ввода на форме может остаться связанным с локальной переменной формы, либо реквизит объекта вовсе не выведен в элементы интерфейса.
  3. Конфликт типов данных при заполнении. Если реквизиту назначен тип Дата, а при выборе пользователем в обработчике программно присваивается строковое значение (например, текстовое представление "Март 2017"), платформа выполняет неявное приведение типа. Строка не может быть автоматически распознана как валидная дата, из-за чего значение сбрасывается в пустую дату '00010101000000' или очищается.
  4. Особенности вызова компоновки результата. При нажатии стандартной кнопки «Сформировать» типовой механизм может запускать фоновое задание или инициализировать компоновку через сериализацию настроек, при этом значения реквизитов формы не переносятся в модуль объекта автоматически, если они не являются частью структуры основного реквизита.

Способ 1. Проверка структуры реквизитов и пути к данным

Разберем по шагам, как проверить и исправить привязку элемента управления к реквизиту объекта:

  1. Откроем форму отчета в конфигураторе и перейдем на вкладку Реквизиты (правая колонка редактора формы).
  2. Убедимся, что реквизит периода находится внутри основного реквизита Отчет (он выделен жирным шрифтом). Если реквизит находится на верхнем уровне дерева рядом с Отчет, значит, это локальный реквизит формы, недоступный в контексте ЭтотОбъект модуля отчета.
  3. Если реквизит создан в дереве метаданных отчета, развернем ветку Отчет на форме и найдем нужный реквизит.
  4. В дереве элементов формы выделим поле ввода и проверим свойство ПутьКДанным. В нем должно быть строго указано: Отчет.Период1, а не просто Период1.

В коде формы обращение к реквизиту объекта выполняется через точку от имени основного реквизита:


// В модуле управляемой формы:
Отчет.Период1 = НачалоМесяца(ТекущаяДата());

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


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Значение реквизита объекта доступно напрямую
    Если Не ЗначениеЗаполнено(Период1) Тогда
        // Обработка незаполненного значения
    КонецЕсли;

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

Способ 2. Корректная работа с типами данных и списком выбора

Рассмотрим ситуацию, когда требуется дать пользователю возможность выбирать месяц словами (например, «Март 2017»), но в алгоритмах компоновщика использовать полноценную дату. Распространенная ошибка — назначение реквизиту строкового типа данных с последующими попытками преобразования в модуле объекта.

Правильным подходом является назначение реквизиту типа Дата и настройка списка выбора на форме с разделением значения и представления. Посмотрим на пример кода заполнения списка выбора:


&НаСервере
Процедура ЗаполнитьСписокВыбораПериодов()
    
    ЭлементПериод = Элементы.Период1;
    ЭлементПериод.РежимВыбораИзСписка = Истина;
    СписокВыбора = ЭлементПериод.СписокВыбора;
    СписокВыбора.Очистить();
    
    ДатаНачала = НачалоГода(ТекущаяДата());
    Для НомерМесяца = 0 По 11 Цикл
        ТекущийМесяц = ДобавитьМесяц(ДатаНачала, НомерМесяца);
        
        // В значение передаем реальную дату, в представление — понятный пользователю текст
        ТекстовоеПредставление = Формат(ТекущийМесяц, "ДФ='MMMM yyyy'");
        СписокВыбора.Добавить(ТекущийМесяц, ТекстовоеПредставление);
    КонецЦикла;
    
КонецПроцедуры

При таком подходе платформа отображает пользователю понятную строку, а в реквизит Отчет.Период1 записывается корректное значение типа Дата, которое без ошибок читается в модуле объекта при компоновке.

Способ 3. Передача параметров через ДополнительныеСвойства компоновщика

Если формирование отчета инициируется программно или требуется исключить зависимость логики модуля объекта от реквизитов формы, рассмотрим использование дополнительных свойств компоновщика настроек. Это надежный способ передачи произвольных данных между контекстом формы и модулем отчета.

На стороне формы перед вызовом компоновки поместим значение в коллекцию дополнительных свойств настроек:


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

В процедуре ПриКомпоновкеРезультата модуля объекта прочитаем переданное значение:


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

Способ 4. Использование штатных параметров СКД

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

  1. В схеме компоновки данных на вкладке Параметры создадим параметр Период с типом СтандартныйПериод или Дата.
  2. Установим флаг включения параметра в Пользовательские настройки.
  3. Платформа самостоятельно выведет стандартное поле выбора периода на форму отчета, корректно обработает сериализацию данных и передаст значение в запрос схемы компоновки без необходимости писать связующий программный код.
← На главную