новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума

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

  • Добавить свою публикацию
  • для этого требуется регистрация

Когда такое может понадобиться

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

Изображение

Таблицу с ответственными нам и нужно передать в модуль объекта. Рассмотрим два способа как это сделать. Рассматривать создание самого отчета не будем, скажу лишь, то в результате таблица значений с ответственными передается как внешний источник данных в компоновщик СКД.

Реализация

Через табличную часть обработки

Это самый простой способ. В метаданных отчета создадим табличную часть, добавим для нее соответствующий элемент на форму, в событии "ПриКомпоновкеРезультата" выгрузим табличную часть в таблицу значений и передадим в компоновщик.

Изображение

Так будет выглядеть обработчик компоновки результата:

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

 Способ может использоваться в большинстве случаев. Похожим образом можно добавить не табличную часть, а реквизит обработки с типом "ТаблицаЗначений" (такой тип поддерживается для реквизитов обработок и отчетов) и передавать ее через этот реквизит. Но что делать, если нужно передать, например, структуру, содержащую в себе и таблицу значений, и системные перечисления, и таблицы значений, а может еще и хранилище значения или двоичные данные? В таком случае прибегнем ко второму способу.

Внешний отчет с примером передачи данных через табличную часть отчета Вы можете скачать по ссылке.

Через временное хранилище

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

Изображение

Таблица значений с ответственными для каждой номенклатуры теперь будет реквизитом формы. Колонки для нее инициализируются перед открытием формы отчета. Самое главное - это поместить таблицу значений во временное хранилище при формировании отчета, а затем по адресу в хранилище уже в событии "ПриКомпоновкеРезультата" получить эту таблицу и обрабатывать аналогично первому примеру. Переопределим обработчик кнопки формы отчета "Сформировать" на следующий:

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

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

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

	// .... 

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

 

Пример отчета с передачей данных через временное хранилище значений Вы можете скачать по ссылке.

Вместо выводов

Абсолютно правильного рецепта для решения подобной задачи нет. Все зависит от конкретной задачи.

 
0
Читайте также
(V 7.7) Справка по работе с метаданными (с примерами)
Получение метаданных в программе 1С 7.7 происходит через объект "Метаданные"
Модуль объекта и модуль менеджера. Отличия
Отличие молуля менеджера и объекта
Выполнение запроса в общем модуле
"Вынести выполнение запроса в функцию общего модуля"
Разработки
Быстрый просмотр данных
Обработка для просмотра данных
Заявочный модуль для УТ 11
Докуметн запрос цен для УТ11
Еще от автора
≡ к списку статей