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