Не выводится внешний отчет

1. Stiks1911 01.09.22 10:35 Сейчас в теме
УТ, внешний отчет. Необходимо выводить из форм различных документов данные по остаткам товаров (перечень товаров берется из самого документа) . Отчет формируется из типов документов - Заказ клиента, Заказ поставщику. Логика - Создал внешний отчет, в СведенияОВнешнейОбработке добавил массив документов, в форме, которых будет показываться этот отчет. Теперь мне нужно тащить из табличной части открытого документа Номенклатуру и Характеристику, помещать их в Таблицу Значений и уже для этой конкретной Номенклатуры с Характеристикой получать данные по остаткам. Сейчас Остановился на том, в модуле отчета СведенияОВнешнейОбработке - ТипКомандыВызовКлиентскогоМетода(). В модуле формы ВыполнитьКоманду(ИдентификаторКоманды,ОбъектыНазначенияМассив)Экспорт получаю как раз ТЗ, в которую помещаю значения из ТЧ формы открытого документа, как теперь эту ТЗ передать в модуль отчета в процедуру ПриКомпоновкеРезультата ? Или это нужно как-то по-другому реализовать? Ниже код и скрины:

МодульОбъекта:

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

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

МодульФормы:
Процедура ВыполнитьКоманду(ИдентификаторКоманды,ОбъектыНазначенияМассив)Экспорт
	
	ТЧ = ОбъектыНазначенияМассив[0].Товары;
	ТЗ = Новый ТаблицаЗначений;
	ТЗ.Колонки.Добавить("Номенклатура");
	Тз.Колонки.Добавить("Характеристика");
	
	Для Каждого Строка Из ТЧ Цикл
		
	НоваяСтрока = ТЗ.Добавить();
	НоваяСтрока.Номенклатура = Строка.Номенклатура;
	НоваяСтрока.Характеристика = Строка.Характеристика;
		
КонецЦикла; 

КонецПроцедуры
Показать
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
12. spacecraft 01.09.22 15:25 Сейчас в теме
(1) я бы смотрел в сторону открытие формы, а не клиентского метода. Тогда можно ПриСозданииНаСервере подставить ТЗ. Да и отчет можно программно формировать в самом модуле формы, а не в модуле объекта вклиниваться.
17. spacecraft 04.09.22 05:16 Сейчас в теме
(1) как и советовал ранее, тут больше подходит открытие формы, чем клиентский метод.

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

Модуль формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Перем ОбъектыНазначения;
	
	Если Параметры.Свойство("ОбъектыНазначения",ОбъектыНазначения) И ОбъектыНазначения.Количество()>0 Тогда
		Отчет.Таблица = ОбъектыНазначения[0];
	КонецЕсли;
	
КонецПроцедуры
Показать
Прикрепленные файлы:
ВнешнийОтчетЗадание8ТабЗначенийЧ2.erf
2. winapi 61 01.09.22 12:28 Сейчас в теме
Через временное хранилище, адрес хранилища сами решите куда удобней, можно хоть реквизитом формы. А в процедуре прикомпоновке по адресу получайте ТЗ.
3. Stiks1911 01.09.22 12:42 Сейчас в теме
(2) Создал реквизит объекта Таблица Тип Строка неограниченной длины. В процедуру ВыполнитьКоманду поместил во временное хранилище, в Прикомпоновке результата получаю, но почему-то результата все равно нет
(2)
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
		
	СтандартнаяОбработка = Ложь;
	ТаблицаЗначений = ПолучитьИзВременногоХранилища(Таблица); 	
	
	СхемаКомпоновки = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
	НастройкиКомпоновки = КомпоновщикНастроек.ПолучитьНастройки();
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки,НастройкиКомпоновки);
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ВнешниеНаборы = Новый Структура("Данные", ТаблицаЗначений);
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,ВнешниеНаборы);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	
	
КонецПроцедуры


Процедура ВыполнитьКоманду(ИдентификаторКоманды,ОбъектыНазначенияМассив)Экспорт
	
	ТЧ = ОбъектыНазначенияМассив[0].Товары;
	ТЗ = Новый ТаблицаЗначений;
	ТЗ.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
	Тз.Колонки.Добавить("Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"));
	
	Для Каждого Строка Из ТЧ Цикл
		
	НоваяСтрока = ТЗ.Добавить();
	НоваяСтрока.Номенклатура = Строка.Номенклатура;
	НоваяСтрока.Характеристика = Строка.Характеристика;
		
КонецЦикла; 

Если ЭтоАдресВременногоХранилища(Отчет.Таблица) Тогда
	УдалитьИзВременногоХранилища(Отчет.Таблица);
КонецЕсли; 

Таблица = ПоместитьВоВременноеХранилище(ТЗ, Новый УникальныйИдентификатор);

КонецПроцедуры
Показать
Прикрепленные файлы:
8. user1831019 01.09.22 14:46 Сейчас в теме
(3)
Создал реквизит объекта Таблица Тип Строка неограниченной длины.
Что за извращение?
9. Stiks1911 01.09.22 14:48 Сейчас в теме
(8) Посоветуйте пожалуйста, как по-другому сделать?
(8)
4. winapi 61 01.09.22 12:47 Сейчас в теме
(3) А зачем вы вторым параметром передаете новый УникальныйИдентификатор, если получаете его в реквизит таблица?
5. Stiks1911 01.09.22 12:58 Сейчас в теме
(4) Удалил, но результата все равно нет
(4)
6. winapi 61 01.09.22 13:01 Сейчас в теме
У вас точно адрес заполняется и передается на сервер? Добавьте сообщить(Таблица) перед
ТаблицаЗначений = ПолучитьИзВременногоХранилища(Таблица);
Если адрес корректно заполнен - возможно у вас отчет формируется через фоновое задание и там данные из хранилища недоступны.
7. Stiks1911 01.09.22 14:45 Сейчас в теме
(6) Проверил в двух местах через Сообщить(Таблица) в процедуре ВыполнитьКоманду в модуле формы и в ПриКомпоновкеРезультата в модуле объекта. Если Сообщить в Модуле формы, то адрес сообщается, а вот если сообщить, как Вы говорили в модуле объекта перед ТаблицаЗначений = ПолучитьИзВременногоХранилища(Таблица); То адрес не выводится, т.е. я так понимаю, адрес почему-то не передается в процедуру ПриКомпоновкеРезультата. В чем тогда может быть причина?
Скрин, что выводится если сообщить в модуле формы
Прикрепленные файлы:
10. user1831019 01.09.22 14:57 Сейчас в теме
(7) Так все таки - Таблица это реквизит объекта или формы?
11. Stiks1911 01.09.22 15:05 Сейчас в теме
(8) Таблица - это реквизит объекта, чтобы его потом можно было использовать в Процедуру ПриКомпоновкеРезультата
(10)
14. user1831019 01.09.22 15:31 Сейчас в теме
(11) И ты уверен, что у внешней обработки реквизиты объекта формы (структура данных) одинаково доступны и на клиенте и на сервере? особенно если к ним не обращаться через Объект.Таблица?
15. nomad_irk 76 01.09.22 15:32 Сейчас в теме
(11)в таком случае, необходимо делать Отчет.Таблица = ПоместитьВоВременноеХранилище.....
13. spacecraft 01.09.22 15:31 Сейчас в теме
(7) адрес можно через доп.свойства настроек компоновщика передавать. Они вроде должны передаваться.
Или задействовать строковый Параметр отчета СКД. И в него заносить адрес. Вот он точно будет доступен.
16. Stiks1911 03.09.22 11:33 Сейчас в теме
Все переделал. В Сведениях о Внешней обработке - ТипКомандыВызовКлиентскогоМетода(). Создал реквизит с составным типом Ссылка и выбрал все документы, для которых должен формироваться этот отчет. Т.е. С помощьюПроцедуры ВыполнитьКоманду в этот реквизит я передаю ссылку на документ. И теперь в дальнейшем, смогу вытащить необходимые поля из ТЧ документа в модуле объекта. Но при нажатии кнопки Выполнить, меня перекидывает не форму отчета, чтобы нажать кнопку сформировать, а на отчет только с заголовком. Как сделать, чтобы перекинуло именно на форму отчета, чтобы нажать кнопку Сформировать и запустить процедуру ПриКомпоновкеРезультата?

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


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

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

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

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


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

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

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

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

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


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

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

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

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

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

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

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


КонецПроцедуры
Прикрепленные файлы:
Оставьте свое сообщение

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