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

1. dklp 42 01.02.22 16:11 Сейчас в теме
У меня в модуле формы отчета после загрузки и редактирования внешнего файла формируется таблица значений. Мне её теперь нужно как-то передать в модуль объекта отчета, чтобы она была доступна там в процедуре ПриКомпоновкеРезультата. Создал реквизит объекта отчета ВнешняяТаблица с типом ТаблицаЗначений, но не пойму, как записать в него данные, находясь в модуле формы.

Вот примерно как выглядит финальная процедура в модуле формы после загрузки файла на сервер:
&НаСервере
Процедура ВыгрузитьСодержимоеФайлаВТаблицуЗначений(ПутьКоВременномуФайлу)
	
	// читаем содержимое файла в табличный документ
	ТабДок  = Новый ТабличныйДокумент;
	ТабДок.Прочитать(ПутьКоВременномуФайлу, СпособЧтенияЗначенийТабличногоДокумента.Текст);

	// грузим табличный документ в таблицу значений
	ПЗ = Новый ПостроительЗапроса;
	ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область());
	ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
	ПЗ.ЗаполнитьНастройки();
	ПЗ.Выполнить();

	ТЗ = ПЗ.Результат.Выгрузить();    

	// этот вариант не работает
	ЗначениеВРеквизитФормы(ТЗ, "Отчет.ВнешняяТаблица");    
		
	Сообщить("Табличный документ загружен, теперь можете Сформировать отчет");

КонецПроцедуры
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user925427 123 01.02.22 18:36 Сейчас в теме
Либо через табличную часть отчёта, либо через адрес временного хранилища (реквизит отчёта)
3. dklp 42 02.02.22 08:35 Сейчас в теме
В общем, я не стал заморачиваться с передачей таблицы значений. Вместо этого создал в отчете реквизит с типом ТабличныйДокумент и передаю табличный документ. А уже выгрузку из табличного документа в таблицу значений и далее во временную таблицу осуществляю непосредственно в процедуре модуля объекта ПриКомпоновкеРезультата.
4. Stiks1911 02.09.22 08:51 Сейчас в теме
(3)Добрый день!) Можете код показать, как перенесли ТабДок из формы в модуль объекта и запустили все это в процедуре ПриКомпоновкеРезультата. Столкнулся с подобной задачей
5. dklp 42 03.09.22 10:45 Сейчас в теме
(4) Мой внешний отчет организован по такому принципу.

1. В Запросе набора данных Схемы компоновки данных отчета используется соединение с ВнешняяВТ.

ВнешняяВТ - это таблица, в которую предварительно будут выгружены данные из Табличного документа ТабДок.
ТабДок - это реквизит формы отчета, куда до этого была загружена Excel-таблица с внешними данными.

2. Чтобы ВнешняяВТ была доступна в Запросе набора данных Схемы компоновки данных, подключаем МенеджерВТ, который затем передадим в ПроцессорКомпоновкиДанных. Это делается в модуле объекта отчета:

// это вспомогательная функция для выгрузки табличного документа в таблицу значений   
// здесь ТабДок - реквизит объекта отчета, куда мы ранее прочитали содержимое файла

Функция ПолучитьТЗ()                                        

	ПЗ = Новый ПостроительЗапроса;
	ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область());
	ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
	ПЗ.ЗаполнитьНастройки();
	ПЗ.Выполнить();
	
	ТЗ = ПЗ.Результат.Выгрузить(); 	
	Возврат ТЗ;

КонецФункции
                        
// это процедура, где мы переопределяем алгоритм компоновки результата отчета	
	
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;      
	
	// формируем запрос для загрузки таблицы значений во временную таблицу

	Запрос = Новый Запрос;
	Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ВЫРАЗИТЬ(ТЗ.Номенклатура КАК СТРОКА (200)) КАК Номенклатура,
		|	ВЫРАЗИТЬ(ТЗ.Изготовитель КАК СТРОКА (40)) КАК Изготовитель
		|ПОМЕСТИТЬ ВнешняяВТ
		|ИЗ
		|	&ТаблицаЗначений КАК ТЗ";
	Запрос.УстановитьПараметр("ТаблицаЗначений", ПолучитьТЗ());
	Запрос.Выполнить();

	// передаем менеджер временных таблиц процессору компоновки данных 
	// так наша временная таблица станет видна в основном запросе СКД
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки,, Тип("ГенераторМакетаКомпоновкиДанных"));
       
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных,, ДанныеРасшифровки, Истина,, МенеджерВТ);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
    		
КонецПроцедуры
Показать
6. Stiks1911 03.09.22 11:02 Сейчас в теме
(5) Подскажите пожалуйста, я правильно понимаю-
// формируем запрос для загрузки таблицы значений во временную таблицу

- это Запрос с Обработкой результата, а что в основном запросе СКД и как туда передали ВТ? Можете пожалуйста показать еще запрос в СКД и структуру?
8. dklp 42 03.09.22 11:57 Сейчас в теме
(6) Как пример, Запрос в наборе данных Схемы компоновки данных отчета может быть таким:
ВЫБРАТЬ
	РеализацияТоваровУслугТовары.Ссылка КАК ДокументПродажи,
	РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
	ВнешняяВТ.Изготовитель КАК Изготовитель 
ИЗ
	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
		ЛЕВОЕ СОЕДИНЕНИЕ ВнешняяВТ КАК ВнешняяВТ
		ПО РеализацияТоваровУслугТовары.Номенклатура.Наименование = ВнешняяВТ.Номенклатура
ГДЕ
	РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
Показать

Это простой запрос, который позволяет затем группировать в настройках отчета продажи по Номенклатуре, Документам и Изготовителям. Недостающие данные об Изготовителях мы берем из внешней таблицы, загружаемой пользователем на форме отчета в интерактивном режиме в виде Excel-файла. Данные из Excel-файла в модуле формы отчета считываем в Табличный документ, а уже в модуле объекта отчета из Табличного документа грузим в Таблицу значений. Далее Таблицу значений запросом помещаем во Временную таблицу, которую тем же запросом прикручиваем к Менеджеру временных таблиц. Наконец, Менеджер временных таблиц передаем в ПроцессорКомпоновкиДанных. Таким образом внешняя таблица становится доступной для построения Запроса в наборе данных Схемы компоновки данных, как если бы мы использовали обычную (внутреннюю) таблицу из нашей информационной базы.

P.S. прикрепил файл своего внешнего отчета для полноты картины
Прикрепленные файлы:
РеализацияТоваровПоСтавке10ПлюсИзготовителиИзВнешнегоExcelФайла.erf
9. Stiks1911 03.09.22 12:07 Сейчас в теме
(8) В запросе получил ВТ и прикрутил ее к МВТ. МВТ Передал в ПроцессорКомпоновкиДанных. Как в СКД сделать, чтобы эту ВТ СКД видеть стал? Ниже скрины, вроде бы все сделал, как Вы говорите, но выдает ошибку
(8)
Прикрепленные файлы:
10. spacecraft 03.09.22 13:15 Сейчас в теме
(9) условия соединения не правильное.
По ВТ_Номенклатура = ТоварыНаСкладах.Номенклатура
Нужно в условиях указывать поле таблицы, а не саму таблицу.
По ВТ_Номенклатура.Номенклатура = ТоварыНаСкладах.Номенклатура
11. Stiks1911 03.09.22 13:50 Сейчас в теме
(8) Да, эту ошибку уже нашел. Я не понимаю, как открыть пустую форму отчета, почему у меня выводится сразу заголовок отчета, а не пустая форма отчета с кнопкой сформировать?

&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды,ОбъектыНазначенияМассив)Экспорт

ПараметрыОтчета = Новый Структура;
//ПараметрыОтчета.Вставить("Вариант", Отчет.КомпоновщикНастроек.Настройки);
//ПараметрыОтчета.Вставить("Отбор", Новый Структура("Ссылка",ОбъектыНазначенияМассив[0]));
ПараметрыОтчета.Вставить("ПользовательскиеНастройки", Отчет.КомпоновщикНастроек.Настройки);

ОткрытьФорму("ВнешнийОтчет.ВнешнийОтчетТабЗначений.Форма.ФормаОтчета",ПараметрыОтчета);

Отчет.Таблица = ОбъектыНазначенияМассив[0];
//СкомпоноватьРезультат();
КонецПроцедуры
(10)

Насколько я понимаю, При выборе отчета и нажатии кнопки выполнить скрин 1, я должен переходить на пустую форму отчета с кнопкой Сформировать отчет как на скрине 2, чтобы запускалась процедура ПриКомпоновкеРезультата, а у меня сразу открывается пустой отчет с Заголовком. ЧТо не так, как перейти на пустую форму отчета с кнопкой Сформировать как на скрине ?
Прикрепленные файлы:
7. Stiks1911 03.09.22 11:23 Сейчас в теме
Я вроде бы делаю тоже самое, но почему-то у меня не переходит на форму отчета, чтобы нажать кнопку Сформировать, а просто Выводится Заголовок отчета и все. Подскажите пожалуйста, в чем ошибка, что делаю не так?

&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды,ОбъектыНазначенияМассив)Экспорт


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

ОткрытьФорму("ВнешнийОтчет.ВнешнийОтчетТабЗначений.Форма.ФормаОтчета",ПараметрыОтчета);
Отчет.Таблица = ОбъектыНазначенияМассив[0];

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

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)


СтандартнаяОбработка = Ложь;

ТЗ = Новый ТаблицаЗначений;

//Добавляем колонки
ТЗ.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура", , , ));
ТЗ.Колонки.Добавить("Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры", , , ));

ТЧ = Таблица.Товары;
Сообщить(ТЧ);
Для Каждого Строка Из ТЧ Цикл

НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Номенклатура = Строка.Номенклатура;
НоваяСтрока.Характеристика = Строка.Характеристика;
Сообщить(НоваяСтрока);
КонецЦикла;


Запрос = Новый Запрос;
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст =
"ВЫБРАТЬ
| ВТ_Номенклатура.Номенклатура КАК Номенклатура,
| ВТ_Номенклатура.Характеристика КАК Характеристика
|ПОМЕСТИТЬ ВТ_Номенклатура
|ИЗ
| &ВТ_Номенклатура КАК ВТ_Номенклатура";

Запрос.УстановитьПараметр("ВТ_Номенклатура", ТЗ);

РезультатЗапроса = Запрос.Выполнить();

НастройкиКомпоновки = КомпоновщикНастроек.ПолучитьНастройки();
СхемаКомпоновки = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки,НастройкиКомпоновки);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ВнешниеНаборы = Новый Структура("ТаблицаЗначений", ТЗ);
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,ВнешниеНаборы);

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);


КонецПроцедуры
12. Stiks1911 03.09.22 13:52 Сейчас в теме
(10) Прикрепляю файл внешнего отчета
Прикрепленные файлы:
ВнешнийОтчетЗадание8ТабЗначенийЧ2.erf
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот