Как поместить таблицу значений в реквизит объекта очета из модуля формы?
У меня в модуле формы отчета после загрузки и редактирования внешнего файла формируется таблица значений. Мне её теперь нужно как-то передать в модуль объекта отчета, чтобы она была доступна там в процедуре ПриКомпоновкеРезультата. Создал реквизит объекта отчета ВнешняяТаблица с типом ТаблицаЗначений, но не пойму, как записать в него данные, находясь в модуле формы.
Вот примерно как выглядит финальная процедура в модуле формы после загрузки файла на сервер:
Вот примерно как выглядит финальная процедура в модуле формы после загрузки файла на сервер:
&НаСервере
Процедура ВыгрузитьСодержимоеФайлаВТаблицуЗначений(ПутьКоВременномуФайлу)
// читаем содержимое файла в табличный документ
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПутьКоВременномуФайлу, СпособЧтенияЗначенийТабличногоДокумента.Текст);
// грузим табличный документ в таблицу значений
ПЗ = Новый ПостроительЗапроса;
ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область());
ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
ПЗ.ЗаполнитьНастройки();
ПЗ.Выполнить();
ТЗ = ПЗ.Результат.Выгрузить();
// этот вариант не работает
ЗначениеВРеквизитФормы(ТЗ, "Отчет.ВнешняяТаблица");
Сообщить("Табличный документ загружен, теперь можете Сформировать отчет");
КонецПроцедуры
ПоказатьПо теме из базы знаний
- Всякие полезности
- Конфигурация Flowcon: Набор инструментов для управления задачами, проектами и бизнесом в 1С
- Не спеша, эффективно и правильно – путь разработки. Часть 2. Теория
- Дублирование значений в полях табличных частей (CTRL+D)
- "Чистый код в 1С" или как прокачать свой код? Пошаговая инструкция, часть №1
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
В общем, я не стал заморачиваться с передачей таблицы значений. Вместо этого создал в отчете реквизит с типом ТабличныйДокумент и передаю табличный документ. А уже выгрузку из табличного документа в таблицу значений и далее во временную таблицу осуществляю непосредственно в процедуре модуля объекта ПриКомпоновкеРезультата.
(4) Мой внешний отчет организован по такому принципу.
1. В Запросе набора данных Схемы компоновки данных отчета используется соединение с ВнешняяВТ.
ВнешняяВТ - это таблица, в которую предварительно будут выгружены данные из Табличного документа ТабДок.
ТабДок - это реквизит формы отчета, куда до этого была загружена Excel-таблица с внешними данными.
2. Чтобы ВнешняяВТ была доступна в Запросе набора данных Схемы компоновки данных, подключаем МенеджерВТ, который затем передадим в ПроцессорКомпоновкиДанных. Это делается в модуле объекта отчета:
1. В Запросе набора данных Схемы компоновки данных отчета используется соединение с ВнешняяВТ.
ВнешняяВТ - это таблица, в которую предварительно будут выгружены данные из Табличного документа ТабДок.
ТабДок - это реквизит формы отчета, куда до этого была загружена Excel-таблица с внешними данными.
2. Чтобы ВнешняяВТ была доступна в Запросе набора данных Схемы компоновки данных, подключаем МенеджерВТ, который затем передадим в ПроцессорКомпоновкиДанных. Это делается в модуле объекта отчета:
// это вспомогательная функция для выгрузки табличного документа в таблицу значений
// здесь ТабДок - реквизит объекта отчета, куда мы ранее прочитали содержимое файла
Функция ПолучитьТЗ()
ПЗ = Новый ПостроительЗапроса;
ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область());
ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
ПЗ.ЗаполнитьНастройки();
ПЗ.Выполнить();
ТЗ = ПЗ.Результат.Выгрузить();
Возврат ТЗ;
КонецФункции
// это процедура, где мы переопределяем алгоритм компоновки результата отчета
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// формируем запрос для загрузки таблицы значений во временную таблицу
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст =
"ВЫБРАТЬ
| ВЫРАЗИТЬ(ТЗ.Номенклатура КАК СТРОКА (200)) КАК Номенклатура,
| ВЫРАЗИТЬ(ТЗ.Изготовитель КАК СТРОКА (40)) КАК Изготовитель
|ПОМЕСТИТЬ ВнешняяВТ
|ИЗ
| &ТаблицаЗначений КАК ТЗ";
Запрос.УстановитьПараметр("ТаблицаЗначений", ПолучитьТЗ());
Запрос.Выполнить();
// передаем менеджер временных таблиц процессору компоновки данных
// так наша временная таблица станет видна в основном запросе СКД
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки,, Тип("ГенераторМакетаКомпоновкиДанных"));
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных,, ДанныеРасшифровки, Истина,, МенеджерВТ);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
КонецПроцедуры
Показать
(5) Подскажите пожалуйста, я правильно понимаю-
// формируем запрос для загрузки таблицы значений во временную таблицу
- это Запрос с Обработкой результата, а что в основном запросе СКД и как туда передали ВТ? Можете пожалуйста показать еще запрос в СКД и структуру?
// формируем запрос для загрузки таблицы значений во временную таблицу
- это Запрос с Обработкой результата, а что в основном запросе СКД и как туда передали ВТ? Можете пожалуйста показать еще запрос в СКД и структуру?
(6) Как пример, Запрос в наборе данных Схемы компоновки данных отчета может быть таким:
Это простой запрос, который позволяет затем группировать в настройках отчета продажи по Номенклатуре, Документам и Изготовителям. Недостающие данные об Изготовителях мы берем из внешней таблицы, загружаемой пользователем на форме отчета в интерактивном режиме в виде Excel-файла. Данные из Excel-файла в модуле формы отчета считываем в Табличный документ, а уже в модуле объекта отчета из Табличного документа грузим в Таблицу значений. Далее Таблицу значений запросом помещаем во Временную таблицу, которую тем же запросом прикручиваем к Менеджеру временных таблиц. Наконец, Менеджер временных таблиц передаем в ПроцессорКомпоновкиДанных. Таким образом внешняя таблица становится доступной для построения Запроса в наборе данных Схемы компоновки данных, как если бы мы использовали обычную (внутреннюю) таблицу из нашей информационной базы.
P.S. прикрепил файл своего внешнего отчета для полноты картины
ВЫБРАТЬ
РеализацияТоваровУслугТовары.Ссылка КАК ДокументПродажи,
РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
ВнешняяВТ.Изготовитель КАК Изготовитель
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ЛЕВОЕ СОЕДИНЕНИЕ ВнешняяВТ КАК ВнешняяВТ
ПО РеализацияТоваровУслугТовары.Номенклатура.Наименование = ВнешняяВТ.Номенклатура
ГДЕ
РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
ПоказатьЭто простой запрос, который позволяет затем группировать в настройках отчета продажи по Номенклатуре, Документам и Изготовителям. Недостающие данные об Изготовителях мы берем из внешней таблицы, загружаемой пользователем на форме отчета в интерактивном режиме в виде Excel-файла. Данные из Excel-файла в модуле формы отчета считываем в Табличный документ, а уже в модуле объекта отчета из Табличного документа грузим в Таблицу значений. Далее Таблицу значений запросом помещаем во Временную таблицу, которую тем же запросом прикручиваем к Менеджеру временных таблиц. Наконец, Менеджер временных таблиц передаем в ПроцессорКомпоновкиДанных. Таким образом внешняя таблица становится доступной для построения Запроса в наборе данных Схемы компоновки данных, как если бы мы использовали обычную (внутреннюю) таблицу из нашей информационной базы.
P.S. прикрепил файл своего внешнего отчета для полноты картины
Прикрепленные файлы:
РеализацияТоваровПоСтавке10ПлюсИзготовителиИзВнешнегоExcelФайла.erf
(8) Да, эту ошибку уже нашел. Я не понимаю, как открыть пустую форму отчета, почему у меня выводится сразу заголовок отчета, а не пустая форма отчета с кнопкой сформировать?
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды,ОбъектыНазначенияМассив)Экспорт
ПараметрыОтчета = Новый Структура;
//ПараметрыОтчета.Вставить("Вариант", Отчет.КомпоновщикНастроек.Настройки);
//ПараметрыОтчета.Вставить("Отбор", Новый Структура("Ссылка",ОбъектыНазначенияМассив[0]));
ПараметрыОтчета.Вставить("ПользовательскиеНастройки", Отчет.КомпоновщикНастроек.Настройки);
ОткрытьФорму("ВнешнийОтчет.ВнешнийОтчетТабЗначений.Форма.ФормаОтчета",ПараметрыОтчета);
Отчет.Таблица = ОбъектыНазначенияМассив[0];
//СкомпоноватьРезультат();
КонецПроцедуры
(10)
Насколько я понимаю, При выборе отчета и нажатии кнопки выполнить скрин 1, я должен переходить на пустую форму отчета с кнопкой Сформировать отчет как на скрине 2, чтобы запускалась процедура ПриКомпоновкеРезультата, а у меня сразу открывается пустой отчет с Заголовком. ЧТо не так, как перейти на пустую форму отчета с кнопкой Сформировать как на скрине ?
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды,ОбъектыНазначенияМассив)Экспорт
ПараметрыОтчета = Новый Структура;
//ПараметрыОтчета.Вставить("Вариант", Отчет.КомпоновщикНастроек.Настройки);
//ПараметрыОтчета.Вставить("Отбор", Новый Структура("Ссылка",ОбъектыНазначенияМассив[0]));
ПараметрыОтчета.Вставить("ПользовательскиеНастройки", Отчет.КомпоновщикНастроек.Настройки);
ОткрытьФорму("ВнешнийОтчет.ВнешнийОтчетТабЗначений.Форма.ФормаОтчета",ПараметрыОтчета);
Отчет.Таблица = ОбъектыНазначенияМассив[0];
//СкомпоноватьРезультат();
КонецПроцедуры
(10)
Насколько я понимаю, При выборе отчета и нажатии кнопки выполнить скрин 1, я должен переходить на пустую форму отчета с кнопкой Сформировать отчет как на скрине 2, чтобы запускалась процедура ПриКомпоновкеРезультата, а у меня сразу открывается пустой отчет с Заголовком. ЧТо не так, как перейти на пустую форму отчета с кнопкой Сформировать как на скрине ?
Прикрепленные файлы:



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