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